The Expat Living Italy data API

One typed core, three surfaces: a REST API with an OpenAPI 3.1 spec, a remote MCP server, and an agent-readable layer. All three read the same data as the site itself — no upstream call happens in a request path, and every value carries its source, vintage and extraction date. Missing data comes back asnull with a reason, never a zero or an imputed average.

REST

Base URL: https://www.expatliving.it/api/v1. Spec: /api/v1/openapi.json (OpenAPI 3.1, importable unmodified as a Custom GPT Action).

curl "https://www.expatliving.it/api/v1/comuni?q=Introdacqua"
curl https://www.expatliving.it/api/v1/comuni/066048
curl https://www.expatliving.it/api/v1/datasets
curl "https://www.expatliving.it/api/v1/tax/regimes/regime-7-percent-pensioners/eligibility?comune=066048"

Anonymous, no key required, and CORS-enabled for calls from a browser. Responses are cached for a day at the edge — the data changes on an ETL run, not per request.

MCP

Streamable HTTP at https://www.expatliving.it/api/v1/mcp. Read-only, no auth. Nine tools, each generated from the same schema as its REST endpoint above, so the two can never drift apart: search_comuni, find_comuni, get_comune, get_province, get_nationality, get_coverage, list_datasets, list_tax_regimes and check_tax_eligibility.

Claude Code:

claude mcp add --transport http expatliving-data https://www.expatliving.it/api/v1/mcp

Claude and ChatGPT apps: add the URL above as a custom connector. Any other client that takes a JSON config:

{
  "mcpServers": {
    "expatliving-data": {
      "url": "https://www.expatliving.it/api/v1/mcp"
    }
  }
}

Agent-readable layer

/llms.txt — what this site is, every dataset it holds with its vintage and page, how to answer from it, and where the API and MCP endpoints are.

What's served per place, and what isn't yet

Every comune-, province- and region-level dataset on the Italy map is served per comune. The Eurostat and OECD regional figures (NUTS 2/3) are listed by GET /datasets with their page and full-file download, but not resolved per comune, and the MEF tax-rate files stay out until they are verified. Province, nationality and tax-eligibility endpoints are next.

Credit

Free to use. Please credit "Expat Living Italy (expatliving.it)" and link the page the figures come from whenever you quote them. Every response carries an attribution block — citeAs is a ready-made citation line and page the page to link — and every MCP tool result opens with the same credit line.

Using it well