API v2 - 100% Gratuite

API Catasto per il territorio italiano, 100% gratuite

Catasto, geocoding, confini e dati arricchiti: 9 endpoint, 10.000 richieste l'ora, zero costi. Li diamo gratis, e li manteniamo aggiornati noi.

20 Blocchi Dato · 15+ FontiCatasto, OMI, rischio sismico/alluvioni/frane/subsidenza, demografia, redditi, fotovoltaico arricchiti su ogni particella
100% Gratuite10.000 req/ora, nessun costo nascosto, nessun piano a pagamento
Token PersonaliFino a 5 token API con scope granulari per controllo accessi
Geocoding + CatastoGeocoding diretto/inverso, ricerca particelle, dati arricchiti
Scroll

API v2 - Endpoint Disponibili

API catastali e di geocoding gratuite con risposta JSON. Genera i tuoi token su app.zornade.com: 10.000 richieste l'ora, fino a 5 token per account, e le diamo a tutti senza chiedere una carta di credito.

GET
/api/v2/health

Verifica lo stato dell'API e la versione corrente. Non richiede autenticazione.

Parametri:
Nessun parametro richiesto

Note utili

  • Risposta: { status, version, timestamp, auth, rate_limit, endpoints[] }
  • Endpoint pubblico - non serve x-api-key
GET
/api/v2/geocode/search

Geocoding diretto - trova coordinate a partire da un indirizzo o nome di luogo. Scope: geocoding:read

Parametri:
q (obbligatorio) - Testo dell'indirizzo o località (min. 2 caratteri)
city (opzionale) - Filtra risultati per città (es. "firenze")
limit (opzionale, default: 10, max: 50)

Note utili

  • Risposta: { data: [{ address_id, street_name, street_number, locality, municipality_code, municipality_name, province, region, latitude, longitude, formatted_address }], meta: { query, city, count } }
  • Ricerca su tutto il territorio italiano. Il filtro city restringe i risultati alla città indicata.
  • Cerca nomi di strada e civici, non località: la query "Roma" restituisce lista vuota, "via dei fori imperiali" risponde
  • Senza city il primo risultato può essere in un'altra città: "piazza del duomo" da sola risponde Ancona, con city=firenze risponde Firenze

Possibili errori

  • INVALID_PARAMS se q è assente o ha meno di 2 caratteri (HTTP 400)
GET
/api/v2/geocode/reverse

Geocoding inverso - trova indirizzi vicini a coordinate. Scope: geocoding:read

Parametri:
lat (obbligatorio) - Latitudine (35.5–47.5)
lng (obbligatorio) - Longitudine (6.0–19.0)
radius (opzionale, default: 100, max: 500) - Raggio in metri
limit (opzionale, default: 5, max: 20)

Note utili

  • Risposta: { data: [{ address_id, street_name, street_number, locality, municipality_code, municipality_name, province, latitude, longitude, distance_meters, formatted_address }], meta: { lat, lng, radius_m, count } }
  • Coordinate in formato WGS84. Le coordinate devono ricadere entro i confini italiani.
  • Con il raggio predefinito di 100 metri un punto isolato non trova indirizzi e la risposta è 200 con lista vuota: alzare radius fino a 500 metri è il modo per allargare la ricerca

Possibili errori

  • INVALID_PARAMS se lat/lng mancanti o fuori range (HTTP 400)
GET
/api/v2/admin/regions

Elenco completo delle 20 regioni italiane. Scope: admin_data:read

Parametri:
Nessun parametro richiesto

Note utili

  • Risposta: { data: [{ id, code, name, area_km2 }], meta: { count: 20 } }
  • Restituisce sempre tutte le 20 regioni italiane
GET
/api/v2/admin/provinces

Elenco delle province italiane, filtrabile per regione. Scope: admin_data:read

Parametri:
region (opzionale) - Nome della regione per filtrare (es. "Lazio")

Note utili

  • Risposta: { data: [{ id, code, name, abbreviation, region_code }], meta: { count } }
  • Senza filtro restituisce tutte le 100+ province. Con filtro (es. Lazio) restituisce le 5 province della regione.
GET
/api/v2/admin/municipalities

Elenco dei comuni, filtrabile per provincia. Scope: admin_data:read

Parametri:
province (opzionale) - Nome della provincia per filtrare (es. "Trento")

Note utili

  • Risposta: { data: [{ id, name, province, region, postal_code, fiscal_code }], meta: { count } }
  • Filtrando per provincia si ottengono i comuni di quel territorio.
GET
/api/v2/parcels/locate

Localizza particelle catastali per punto, multi-punto o bounding box. Scope: parcels:read

Parametri:
lat + lng - Modo punto singolo: latitudine e longitudine
points - Modo multi-punto: coppie lat,lng separate da ";" (es. "41.90,12.49;45.43,10.99")
bbox - Modo bounding box: minLng,minLat,maxLng,maxLat (ordine GeoJSON, max 0.05° per lato)
limit (opzionale, default: 50 per bbox / 10 per punto, max: 200)

Note utili

  • Risposta: { data: [{ fid, gml_id, label, municipality: { code, name, province, region }, area_m2, centroid: { lat, lng } }], meta: { mode, count, ... } }
  • Il campo meta.mode indica la modalità usata: "point", "points" o "bbox"
  • Bbox: max 0.05° per lato (~5.5 km), altrimenti errore BBOX_TOO_LARGE
  • Coordinate in formato WGS84 - devono ricadere entro i confini italiani

Possibili errori

  • INVALID_PARAMS se nessun parametro di localizzazione è presente (HTTP 400)
  • BBOX_TOO_LARGE se il bounding box supera 0.05° per lato (HTTP 400)
GET
/api/v2/parcels/search

Cerca particelle catastali per riferimenti catastali (comune, foglio). Scope: parcels:read

Parametri:
comune (obbligatorio) - Nome del comune (es. "Roma")
foglio (opzionale) - Numero foglio catastale
label (opzionale) - Numero di mappale
sezione (opzionale) - Sezione urbana, per i comuni che ne hanno più di una
limit (opzionale, default: 20, massimo: 100)

Note utili

  • Risposta: { data: [{ fid, label, municipality, foglio, sezione, area_m2, centroid }], meta: { comune, foglio, label, count } }
  • Se specifichi solo il comune, restituisce le particelle di quel comune, con paginazione
  • Un comune inesistente o un foglio che non esiste non sono errori: la risposta è 200 con lista vuota e count 0, e si distinguono leggendo meta
  • 2.129.205 particelle su 85.187.061 non hanno il numero di foglio (2,50%), distribuite su 956 comuni su 7.886: su quei comuni la ricerca per foglio resta vuota anche se il comune ha particelle, e conviene cercare per solo comune

Possibili errori

  • INVALID_PARAMS se il parametro comune è assente (HTTP 400)
GET
/api/v2/parcels/{id}

Profilo arricchito completo di una particella - tutte le 20 sezioni dati, gratis. Scope: parcels:read

Parametri:
id (obbligatorio, path) - Identificativo della particella (fid)
include (opzionale) - Sezioni specifiche da includere, separate da virgola (es. "basic,risk,valuation")

Note utili

  • Sezioni disponibili (tutte gratuite, nessun tier gate):
  • basic, cadastral, address, risk, subsidence, terrain, population, buildings, economics, demographics, land_cover, land_use, valuation, valuation_history, coastal_erosion, cultural_heritage, solar, poi, nightlights, geometry
  • Risposta: { data: { fid, ... }, meta: { sections_included: [...] } }
  • Senza il parametro include, restituisce tutte le 20 sezioni
  • land_use proviene da Urban Atlas 2018 (Copernicus/EEA) - disponibile solo per alcune città; altrove restituisce null
  • L'endpoint restituisce 404 se il fid non esiste

Possibili errori

  • NOT_FOUND se la particella non esiste (HTTP 404)

Autenticazione

Come autenticare le richieste API

  • Tutte le richieste (tranne /health) richiedono l'header x-api-key
  • Solo il metodo GET è supportato - POST/PUT/DELETE restituiscono 405 Method Not Allowed
  • Token invalido o assente → 401 API_KEY_REQUIRED
  • Rate limit: 10.000 req/ora per token. Superamento → 429 Too Many Requests
  • Genera fino a 5 token con scope granulari: geocoding:read, parcels:read, admin_data:read
# Header richiesto
x-api-key: zrn_your_token_here

# Esempio completo
curl -X GET "https://api.zornade.com/api/v2/health" -H "x-api-key: zrn_..."

health

Nessuna autenticazione richiesta

{
  "status": "ok",
  "version": "2.4.0",
  "rate_limit": "10000 requests/hour",
  "endpoints": [
    "GET /api/v2/geocode/search",
    "GET /api/v2/geocode/reverse",
    "GET /api/v2/admin/{regions,provinces,municipalities}",
    "GET /api/v2/parcels/{id}",
    "GET /api/v2/parcels/search",
    "GET /api/v2/parcels/locate"
  ]
}

geocode/search

?q=piazza+del+duomo&city=firenze&limit=2

{
  "data": [
    {
      "address_id": 10753169,
      "street_name": "Piazza Del Duomo",
      "street_number": "1",
      "municipality_code": "D612",
      "municipality_name": "Firenze",
      "province": "Firenze",
      "region": "Toscana",
      "latitude": 43.7735371,
      "longitude": 11.255523,
      "formatted_address": "Piazza Del Duomo 1, , Firenze"
    }
  ],
  "meta": {
    "query": "piazza del duomo",
    "city": "firenze",
    "count": 2
  }
}

geocode/reverse

?lat=41.9028&lng=12.4964&radius=100

{
  "data": [
    {
      "address_id": 960481,
      "street_name": "Piazza Della Repubblica",
      "street_number": "11",
      "municipality_code": "H501",
      "municipality_name": "Roma",
      "province": "Roma",
      "latitude": 41.90318,
      "longitude": 12.4965448,
      "distance_meters": 43.88,
      "formatted_address": "Piazza Della Repubblica 11, , Roma"
    }
  ],
  "meta": {
    "lat": 41.9028,
    "lng": 12.4964,
    "radius_m": 100,
    "count": 1
  }
}

parcels/locate

?lat=41.9028&lng=12.4964

{
  "data": [
    {
      "fid": 28009975,
      "gml_id": "CadastralParcel.IT.AGE.PLA.H501A048100.A",
      "label": "A",
      "municipality": {
        "code": "H501",
        "name": "Roma",
        "province": "Roma",
        "region": "Lazio"
      },
      "area_m2": 1919.81,
      "centroid": {
        "lat": 41.9026975,
        "lng": 12.4962434
      }
    }
  ],
  "meta": {
    "mode": "point",
    "lat": 41.9028,
    "lng": 12.4964,
    "count": 1
  }
}

parcels/{id} (sezioni selettive)

?include=basic,risk,subsidence,valuation - Piazza della Repubblica, Roma

{
  "data": {
    "fid": 28009975,
    "gml_id": "CadastralParcel.IT.AGE.PLA.H501A048100.A",
    "label": "A",
    "area_m2": 1919.81,
    "centroid": { "lat": 41.9026975, "lng": 12.4962434 },
    "municipality": {
      "code": "H501", "name": "Roma",
      "province": "Roma", "region": "Lazio"
    },
    "risk": {
      "seismic_zone": 3,
      "pga": 0.1154,
      "flood_level": null,
      "landslide_level": null
    },
    "subsidence": {
      "velocity_mm_year": -0.6,
      "acceleration": -0.15,
      "risk_class": 1,
      "risk_label": "trascurabile",
      "risk_index": 0.03,
      "direction": "stabile",
      "trend": "stabile"
    },
    "valuation": [
      {
        "zone": "B29",
        "zone_description": "VIMINALE (VIA TORINO)",
        "fascia": "B",
        "microzona": 8,
        "property_type": "Abitazioni civili",
        "condition": "NORMALE",
        "purchase": { "min_eur_m2": 4600, "max_eur_m2": 6300 },
        "rental": { "min_eur_m2": 15.3, "max_eur_m2": 21.3 }
      }
    ]
  },
  "meta": {
    "sections_included": ["basic","risk","subsidence","valuation"]
  }
}

Headers di risposta

x-ratelimit-limitLimite orario (10000)
x-ratelimit-remainingRichieste rimaste
x-ratelimit-resetQuando la finestra libera il primo posto

Codici di errore

400INVALID_PARAMS - parametri mancanti o non validi
401API_KEY_REQUIRED / INVALID_API_KEY
404NOT_FOUND - risorsa non trovata
405METHOD_NOT_ALLOWED - solo GET
410GONE - endpoint legacy v1 deprecato
429Rate limit superato

Geocoding inverso

Trova indirizzi vicini a coordinate geografiche.

curl -X GET \
  "https://api.zornade.com/api/v2/geocode/reverse?lat=41.8902&lng=12.4922&radius=500" \
  -H "x-api-key: <YOUR_API_TOKEN>"

Ricerca indirizzo

Cerca coordinate a partire da un indirizzo stradale (via e civico, non punti di interesse), con filtro opzionale per città.

curl -X GET \
  "https://api.zornade.com/api/v2/geocode/search?q=via+dei+fori+imperiali&city=roma&limit=5" \
  -H "x-api-key: <YOUR_API_TOKEN>"

Localizza (punto)

Trova le particelle catastali in prossimità di un punto.

curl -X GET \
  "https://api.zornade.com/api/v2/parcels/locate?lat=41.9028&lng=12.4964&limit=5" \
  -H "x-api-key: <YOUR_API_TOKEN>"

Localizza (bbox)

Tutte le particelle dentro un rettangolo (max 0.05° per lato).

curl -X GET \
  "https://api.zornade.com/api/v2/parcels/locate?bbox=12.490,41.890,12.500,41.895&limit=50" \
  -H "x-api-key: <YOUR_API_TOKEN>"

Ricerca catastale

Cerca particelle per comune e foglio catastale. Con un comune senza numero di foglio la lista torna vuota: è normale, non è un errore.

curl -X GET \
  "https://api.zornade.com/api/v2/parcels/search?comune=Roma&foglio=512&limit=5" \
  -H "x-api-key: <YOUR_API_TOKEN>"

Dettaglio particella

Profilo arricchito con sezioni selettive (20 sezioni disponibili).

curl -X GET \
  "https://api.zornade.com/api/v2/parcels/28009975?include=basic,risk,subsidence,valuation" \
  -H "x-api-key: <YOUR_API_TOKEN>"

Come iniziare, in tre passi

Dal click alla prima risposta in pochi minuti: nessuna carta di credito, nessuna approvazione manuale.

1Crea l'account

Registrati su app.zornade.com/api: servono email e trenta secondi.

2Genera il token

Fino a 5 token con scope granulari (parcels:read, geocoding:read). Copia il valore zrn_...

3Prima chiamata

Gli esempi qui sotto girano cosi come li leggi: copia, incolla, esegui.

Prima chiamata: la stessa richiesta in quattro linguaggi

Ricerca catastale per comune e foglio, con il token letto da una variabile d'ambiente. I file stanno in scripts/esempi-api/ e sono gli stessi che abbiamo eseguito: questa pagina li importa come testo, quindi quello che leggi è quello che gira.

cURL

Il token viaggia nell'header x-api-key. Niente da installare, e stampa il JSON completo.

#!/bin/sh
# Prima chiamata: ricerca catastale per comune e foglio.
# Il token si crea su https://app.zornade.com/api e si esporta come ZORNADE_API_KEY.
set -e
curl -sS -X GET \
  "https://api.zornade.com/api/v2/parcels/search?comune=Roma&foglio=512&limit=3" \
  -H "x-api-key: $ZORNADE_API_KEY"

sh scripts/esempi-api/parcels-search.sh

Cosa stampa

Le prime tre particelle del foglio 512 di Roma, in ordine di mappale. cURL stampa il JSON completo.

3 particelle nel foglio 512 di Roma
  fid 27984268 · mappale 1 · 3177.83 mq · 41.884259725, 12.4780295351724
  fid 27984275 · mappale 10 · 62.56 mq · 41.883313645, 12.4781576668058
  fid 27984283 · mappale 100 · 10957.31 mq · 41.882100785, 12.4773575639407

Casi d'Uso

Come le aziende usano le nostre API

Immobiliare e PropTech

Valutazioni automatiche, due diligence territoriale, analisi di mercato immobiliare.

"Arricchisci il tuo CRM con dati catastali in tempo reale"

Servizi finanziari

Valutazione del rischio, mutui e stima delle garanzie per banche e assicurazioni.

"Calcola automaticamente il valore degli immobili in garanzia"

Legal Tech e notai

Verifiche preliminari, conformità urbanistica, ricerche catastali automatizzate.

"Genera report preliminari per rogiti in 5 secondi"

SaaS e piattaforme

Arricchisci i tuoi database con dati territoriali ufficiali e aggiornati.

"Integra dati catastali arricchiti nel tuo prodotto con 3 righe di codice"

Open source · AGPL-3.0

visura-api, dentro i tuoi sistemi

Le API di questa pagina espongono dati pubblici. L'Agenzia delle Entrate non offre un'API REST pubblica per i dati catastali: i canali ufficiali sono SISTER per le visure e il WFS del Geoportale per le geometrie. Le visure ufficiali sono un'altra cosa, e per quelle c'è visura-api: il pacchetto open source che pilota il portale SISTER con le tue credenziali SPID, senza passare da un intermediario e senza un margine su ogni documento.

Lo integriamo nei sistemi dei tuoi clienti, gestionali, back office e portali compresi: setup, automazione delle richieste, gestione delle sessioni e delle code, monitoraggio. Se il prodotto che lo contiene è proprietario, la licenza commerciale toglie gli obblighi AGPL e la scritta di attribuzione, mentre l'uso interno e i progetti open source restano coperti dalla AGPL-3.0 senza costi.

Vedi visura-api

Un backend personalizzato sopra le nostre API.

Progettiamo e sviluppiamo integrazioni backend su misura: da semplici wrapper fino a piattaforme enterprise complete con dati catastali, GIS e visure.

Richiedi un preventivo gratuito

Inizia subito

Registrati gratuitamente su app.zornade.com per accedere alle API, o scrivici se ti serve qualcosa che non trovi