---
title: "Find a comune by name, or find comuni by criteria"
method: GET
path: "/comuni"
---

# Find a comune by name, or find comuni by criteria

`GET /comuni`

## Request

- Base URL: `https://www.expatliving.it/api/v1`
- URL: `https://www.expatliving.it/api/v1/comuni`
- Auth: none declared

Two questions on one path. With only `q` (and `limit`), a case- and accent-insensitive name search across all ~7,900 Italian comuni returns identifiers (ISTAT code, province, region, page URL) — call getComune with the code for the numbers; several comuni share a name, so check the province. With any other parameter it finds comuni by criteria: region, province, population, purchase price, rent, population change 2019–2025 and the verified comuni of a tax regime, paged (max 100) and sorted. A comune with no price, rent or population-change figure is left out of the filter on it and counted in `missingData` — never treated as cheap, free or stable. `taxRegime` lists only comuni on the regime's verified routes: a comune missing from it is not a "no".

## Query parameters

- `q` string
- `limit` integer
- `region` string
- `province` string
- `minPopulation` integer
- `maxPopulation` integer
- `minPurchasePriceEurM2` number
- `maxPurchasePriceEurM2` number
- `minRentEurM2Month` number
- `maxRentEurM2Month` number
- `minPopulationChangePct` number
- `maxPopulationChangePct` number
- `taxRegime` string
- `sort` 'population' | 'name' | 'purchasePrice' | 'rent' | 'populationChange'
- `order` 'asc' | 'desc'
- `offset` integer

## Response `200`

Name search: matching comuni, best match first. Filters: the matching page, with counts of what was left out for missing data.

- union
  - object
    - `query` string, required
    - `results` object[], required: Best matches first: exact name, then names starting with the query, then names containing it. Several Italian comuni share a name — check the province before picking one.
      - `istatCode` string, required: 6-digit ISTAT comune code — pass this to GET /comuni/{istatCode} or get_comune.
      - `name` string, required
      - `province` string, required
      - `provinceCode` string, required
      - `region` string, required
      - `page` string, required: The comune's profile page on expatliving.it.
    - `truncated` boolean, required: True when more comuni matched than `limit` allowed — narrow the query.
    - `attribution` object, required
      - `publisher` string, required
      - `url` string, required
      - `page` string: The expatliving.it page these figures come from — link it when you quote them.
      - `citeAs` string, required: A ready-made citation line.
      - `request` string, required
  - object
    - `applied` object, required: The filters and sort as understood, with region and province resolved to their canonical names.
    - `total` integer, required: Comuni matching every filter, before paging.
    - `returned` integer, required
    - `limit` integer, required
    - `offset` integer, required
    - `hasMore` boolean, required
    - `nextOffset` integer, nullable, required: Pass as offset for the next page; null on the last page.
    - `results` object[], required
      - `istatCode` string, required
      - `name` string, required
      - `province` string, required
      - `provinceCode` string, required
      - `region` string, required
      - `page` string, required: The comune's profile page on expatliving.it.
      - `population` integer, required
      - `purchasePriceEurM2` number, nullable, required: null: no OMI price for this comune. Never a zero.
      - `rentPriceEurM2Month` number, nullable, required: null: no OMI rent figure for this comune. Never a zero.
      - `populationChangePct` number, nullable, required: Percent change 2019 to 2025; null: no figure.
    - `missingData` object[], required: One entry per figure you filtered on: how many comuni were left out for having no figure.
      - `filter` 'purchasePrice' | 'rent' | 'populationChange', required
      - `excluded` integer, required: 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.
      - `reason` string, required
    - `taxRegime` object: Present only when taxRegime was filtered on.
      - `slug` string, required
      - `label` string, required
      - `page` string, required
      - `qualifyingComuniInItaly` integer, required: Size of the regime's verified set, before any other filter.
      - `ruleIsIncomplete` boolean, required
      - `knownIncompleteness` string[], required
      - `absenceIsNotANo` true, required
      - `note` string, required
      - `placesNotPeople` true, required
      - `disclaimer` string, required
    - `figures` object, required
      - `population` object, required
        - `unit` string, required
        - `source` string, required
        - `vintage` string, required: The period the value describes, e.g. "2025H2" or "2025" — not when it was fetched.
        - `extractedOn` string, required: ISO date this value was extracted from the source.
        - `coverage` object: How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.
          - `in` integer, required
          - `of` integer, required
        - `method` string, required: URL to the methodology page for this dataset.
        - `license` string, required
      - `purchasePriceEurM2` object, required
        - `unit` string, required
        - `source` string, required
        - `vintage` string, required: The period the value describes, e.g. "2025H2" or "2025" — not when it was fetched.
        - `extractedOn` string, required: ISO date this value was extracted from the source.
        - `coverage` object: How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.
          - `in` integer, required
          - `of` integer, required
        - `method` string, required: URL to the methodology page for this dataset.
        - `license` string, required
      - `rentPriceEurM2Month` object, required
        - `unit` string, required
        - `source` string, required
        - `vintage` string, required: The period the value describes, e.g. "2025H2" or "2025" — not when it was fetched.
        - `extractedOn` string, required: ISO date this value was extracted from the source.
        - `coverage` object: How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.
          - `in` integer, required
          - `of` integer, required
        - `method` string, required: URL to the methodology page for this dataset.
        - `license` string, required
      - `populationChangePct` object, required
        - `unit` string, required
        - `source` string, required
        - `vintage` string, required: The period the value describes, e.g. "2025H2" or "2025" — not when it was fetched.
        - `extractedOn` string, required: ISO date this value was extracted from the source.
        - `coverage` object: How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.
          - `in` integer, required
          - `of` integer, required
        - `method` string, required: URL to the methodology page for this dataset.
        - `license` string, required
    - `attribution` object, required
      - `publisher` string, required
      - `url` string, required
      - `page` string: The expatliving.it page these figures come from — link it when you quote them.
      - `citeAs` string, required: A ready-made citation line.
      - `request` string, required

## Other responses

- `400`: No q and no filter, a query too short, a range with min above max, an unknown region, province or regime, or a regime that can't filter (draft or person-level).

---

[API](https://skmtc.dev/expatliving/apis/expat-living-italy-data-api.md) · [All operations](https://skmtc.dev/expatliving/apis/expat-living-italy-data-api/llms.txt) · [OpenAPI document](https://skmtc.dev/expatliving/apis/expat-living-italy-data-api/revisions/c72799dee52c?raw)
