changedOutput schema / (root)
Previous value: -nullNew value: +{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "additionalProperties": false,
+ "properties": {
+ "articles": {
+ "description": "Published articles about this comune — the reporting behind the numbers. Credit required to reuse.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "markdownUrl": {
+ "type": "string"
+ },
+ "slug": {
+ "type": "string"
+ },
+ "title": {
+ "type": "string"
+ },
+ "url": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "slug",
+ "title",
+ "url",
+ "markdownUrl"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "attribution": {
+ "additionalProperties": false,
+ "properties": {
+ "citeAs": {
+ "description": "A ready-made citation line.",
+ "type": "string"
+ },
+ "page": {
+ "description": "The expatliving.it page these figures come from — link it when you quote them.",
+ "type": "string"
+ },
+ "publisher": {
+ "type": "string"
+ },
+ "request": {
+ "type": "string"
+ },
+ "url": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "publisher",
+ "url",
+ "citeAs",
+ "request"
+ ],
+ "type": "object"
+ },
+ "foreignResidentsByCitizenship": {
+ "additionalProperties": false,
+ "description": "Counts by ISO-2 citizenship code. Citizenship, not birthplace — excludes foreign-born Italian citizens. value is null, never a zero-filled object, when ISTAT's citizenship dataset has no row at all for this comune.",
+ "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"
+ },
+ "reason": {
+ "description": "Present only when value is null: why this place has no figure.",
+ "type": "string"
+ },
+ "source": {
+ "type": "string"
+ },
+ "unit": {
+ "type": "string"
+ },
+ "value": {
+ "anyOf": [
+ {
+ "additionalProperties": {
+ "type": "number"
+ },
+ "propertyNames": {
+ "type": "string"
+ },
+ "type": "object"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "vintage": {
+ "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "value",
+ "unit",
+ "source",
+ "vintage",
+ "extractedOn",
+ "method",
+ "license"
+ ],
+ "type": "object"
+ },
+ "layers": {
+ "description": "Every other map layer's value for this place, at the grain its source publishes. A null value means the source has no figure for this place (see `reason`).",
+ "items": {
+ "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"
+ },
+ "download": {
+ "description": "The whole dataset, as published JSON (every place, with its meta block).",
+ "type": "string"
+ },
+ "extractedOn": {
+ "description": "ISO date this value was extracted from the source.",
+ "type": "string"
+ },
+ "grain": {
+ "description": "The level this value is measured at. Only \"comune\" is a measurement of this comune itself.",
+ "enum": [
+ "comune",
+ "province",
+ "region"
+ ],
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "license": {
+ "type": "string"
+ },
+ "measuredFor": {
+ "description": "The place the value describes, e.g. \"L'Aquila (province)\".",
+ "type": "string"
+ },
+ "method": {
+ "description": "URL to the methodology page for this dataset.",
+ "type": "string"
+ },
+ "note": {
+ "description": "The source's own coverage caveat, where it has one.",
+ "type": "string"
+ },
+ "page": {
+ "description": "The map page for this layer on expatliving.it — link readers here.",
+ "type": "string"
+ },
+ "reason": {
+ "description": "Present only when value is null: why this place has no figure.",
+ "type": "string"
+ },
+ "slug": {
+ "description": "The dataset slug, as in GET /datasets.",
+ "type": "string"
+ },
+ "source": {
+ "type": "string"
+ },
+ "unit": {
+ "type": "string"
+ },
+ "value": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "vintage": {
+ "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "value",
+ "unit",
+ "source",
+ "vintage",
+ "extractedOn",
+ "method",
+ "license",
+ "slug",
+ "label",
+ "grain",
+ "measuredFor",
+ "page",
+ "download"
+ ],
+ "type": "object"
+ },
+ "maxItems": 100,
+ "type": "array"
+ },
+ "place": {
+ "additionalProperties": false,
+ "properties": {
+ "istatCode": {
+ "description": "6-digit ISTAT comune code, e.g. 075029.",
+ "type": "string"
+ },
+ "lat": {
+ "type": "number"
+ },
+ "lng": {
+ "type": "number"
+ },
+ "name": {
+ "type": "string"
+ },
+ "page": {
+ "description": "This comune's profile page on expatliving.it — link it when you quote any figure below.",
+ "type": "string"
+ },
+ "province": {
+ "type": "string"
+ },
+ "provinceCode": {
+ "type": "string"
+ },
+ "provinceSlug": {
+ "type": "string"
+ },
+ "region": {
+ "type": "string"
+ },
+ "regionSlug": {
+ "type": "string"
+ },
+ "slug": {
+ "description": "Stable URL slug for /data/comune/{slug} — never changes, even if a comune merges.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "istatCode",
+ "slug",
+ "name",
+ "province",
+ "provinceCode",
+ "provinceSlug",
+ "region",
+ "regionSlug",
+ "lat",
+ "lng",
+ "page"
+ ],
+ "type": "object"
+ },
+ "population": {
+ "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"
+ },
+ "reason": {
+ "description": "Present only when value is null: why this place has no figure.",
+ "type": "string"
+ },
+ "source": {
+ "type": "string"
+ },
+ "unit": {
+ "type": "string"
+ },
+ "value": {
+ "anyOf": [
+ {
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "vintage": {
+ "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "value",
+ "unit",
+ "source",
+ "vintage",
+ "extractedOn",
+ "method",
+ "license"
+ ],
+ "type": "object"
+ },
+ "priceToRentYears": {
+ "additionalProperties": false,
+ "description": "Years of rent that equal the purchase price. Not a yield, an ROI, or a payback period.",
+ "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"
+ },
+ "reason": {
+ "description": "Present only when value is null: why this place has no figure.",
+ "type": "string"
+ },
+ "source": {
+ "type": "string"
+ },
+ "unit": {
+ "type": "string"
+ },
+ "value": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "vintage": {
+ "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "value",
+ "unit",
+ "source",
+ "vintage",
+ "extractedOn",
+ "method",
+ "license"
+ ],
+ "type": "object"
+ },
+ "provinceRollup": {
+ "additionalProperties": false,
+ "properties": {
+ "code": {
+ "type": "string"
+ },
+ "name": {
+ "type": "string"
+ },
+ "purchasePriceEurM2": {
+ "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"
+ },
+ "reason": {
+ "description": "Present only when value is null: why this place has no figure.",
+ "type": "string"
+ },
+ "source": {
+ "type": "string"
+ },
+ "unit": {
+ "type": "string"
+ },
+ "value": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "vintage": {
+ "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "value",
+ "unit",
+ "source",
+ "vintage",
+ "extractedOn",
+ "method",
+ "license"
+ ],
+ "type": "object"
+ },
+ "rentPriceEurM2Month": {
+ "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"
+ },
+ "reason": {
+ "description": "Present only when value is null: why this place has no figure.",
+ "type": "string"
+ },
+ "source": {
+ "type": "string"
+ },
+ "unit": {
+ "type": "string"
+ },
+ "value": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "vintage": {
+ "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "value",
+ "unit",
+ "source",
+ "vintage",
+ "extractedOn",
+ "method",
+ "license"
+ ],
+ "type": "object"
+ },
+ "slug": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "name",
+ "code",
+ "slug",
+ "purchasePriceEurM2",
+ "rentPriceEurM2Month"
+ ],
+ "type": "object"
+ },
+ "provinceWellbeing": {
+ "additionalProperties": false,
+ "description": "ISTAT BES well-being indicators for this comune's province — province-level, not a comune measurement.",
+ "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"
+ },
+ "grain": {
+ "const": "province",
+ "type": "string"
+ },
+ "license": {
+ "type": "string"
+ },
+ "measuredFor": {
+ "type": "string"
+ },
+ "method": {
+ "description": "URL to the methodology page for this dataset.",
+ "type": "string"
+ },
+ "page": {
+ "type": "string"
+ },
+ "reason": {
+ "description": "Present only when value is null: why this place has no figure.",
+ "type": "string"
+ },
+ "source": {
+ "type": "string"
+ },
+ "unit": {
+ "type": "string"
+ },
+ "value": {
+ "anyOf": [
+ {
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "code": {
+ "type": "string"
+ },
+ "domain": {
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "percentile": {
+ "description": "0–100 rank among Italy's provinces, polarity-aware: higher is always better, whichever way the raw value runs.",
+ "type": "number"
+ },
+ "polarity": {
+ "description": "\"high\": a higher raw value is better; \"low\": a lower one is.",
+ "enum": [
+ "high",
+ "low"
+ ],
+ "type": "string"
+ },
+ "unit": {
+ "type": "string"
+ },
+ "value": {
+ "description": "The raw indicator value.",
+ "type": "number"
+ },
+ "year": {
+ "description": "The year this observation describes — indicators update on different cycles.",
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ }
+ },
+ "required": [
+ "code",
+ "domain",
+ "label",
+ "unit",
+ "polarity",
+ "value",
+ "year",
+ "percentile"
+ ],
+ "type": "object"
+ },
+ "maxItems": 80,
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "vintage": {
+ "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "value",
+ "unit",
+ "source",
+ "vintage",
+ "extractedOn",
+ "method",
+ "license",
+ "grain",
+ "measuredFor",
+ "page"
+ ],
+ "type": "object"
+ },
+ "purchasePriceEurM2": {
+ "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"
+ },
+ "reason": {
+ "description": "Present only when value is null: why this place has no figure.",
+ "type": "string"
+ },
+ "source": {
+ "type": "string"
+ },
+ "unit": {
+ "type": "string"
+ },
+ "value": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "vintage": {
+ "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "value",
+ "unit",
+ "source",
+ "vintage",
+ "extractedOn",
+ "method",
+ "license"
+ ],
+ "type": "object"
+ },
+ "rentPriceEurM2Month": {
+ "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"
+ },
+ "reason": {
+ "description": "Present only when value is null: why this place has no figure.",
+ "type": "string"
+ },
+ "source": {
+ "type": "string"
+ },
+ "unit": {
+ "type": "string"
+ },
+ "value": {
+ "type": [
+ "number",
+ "null"
+ ]
+ },
+ "vintage": {
+ "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
+ "type": "string"
+ }
+ },
+ "required": [
+ "value",
+ "unit",
+ "source",
+ "vintage",
+ "extractedOn",
+ "method",
+ "license"
+ ],
+ "type": "object"
+ },
+ "taxRegimeEligibility": {
+ "description": "Verified regimes only — \"placesNotPeople\": geographic eligibility, not personal advice.",
+ "items": {
+ "additionalProperties": false,
+ "properties": {
+ "headroom": {
+ "description": "Residents between this comune and the ceiling.",
+ "type": "number"
+ },
+ "href": {
+ "description": "Path to this regime's own page on expatliving.it.",
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "maxPopulation": {
+ "description": "The regime's population ceiling, when it has one.",
+ "type": "number"
+ },
+ "ruleIsIncomplete": {
+ "description": "True when the rule admits comuni by routes not yet verified — silence about OTHER regimes proves nothing.",
+ "type": "boolean"
+ },
+ "slug": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "slug",
+ "label",
+ "href",
+ "ruleIsIncomplete"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+ },
+ "totalForeignResidents": {
+ "anyOf": [
+ {
+ "maximum": 9007199254740991,
+ "minimum": -9007199254740991,
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "description": "Sum of foreignResidentsByCitizenship: only the citizenships this site tracks (25), so a floor, not every foreign resident — Romanian, Albanian and Moroccan residents, among others, are not counted. null when the citizenship dataset has no row for this comune."
+ }
+ },
+ "required": [
+ "place",
+ "population",
+ "foreignResidentsByCitizenship",
+ "totalForeignResidents",
+ "purchasePriceEurM2",
+ "rentPriceEurM2Month",
+ "priceToRentYears",
+ "taxRegimeEligibility",
+ "provinceRollup",
+ "layers",
+ "provinceWellbeing",
+ "attribution"
+ ],
+ "type": "object"
+}