Static Parquet mirror of the OpenCUP open data archive — the Italian registry of publicly funded investment projects — partitioned and queryable over HTTP, so you don't have to download 2.2 GB of zipped CSV to ask one question.
Every publicly funded investment project in Italy is assigned a CUP (Codice Unico di Progetto) and recorded in OpenCUP, the national registry. This product republishes the official open data archive as Parquet, so it can be queried over HTTP without downloading anything.
The source is distributed as zipped CSV — over 2 GB for the projects file alone — plus an API that answers one CUP at a time. Neither shape suits a set-wide question like how many projects are there in this municipality. Here that question costs a couple of seconds and a few megabytes.
Data as of: OpenCUP snapshot of 2026-09-03 — the source's own Last-Modified for the four
archives. The source republishes the whole archive periodically (monthly so far) and this mirror
follows, so the figures in this page are rounded on purpose.
Exact row counts, byte sizes and the snapshot date of the files currently online are in
_manifest.json.
CUP is the join key across the first three files, and it is a true primary key in
progetti.parquet: one row per CUP, no duplicates. All four files cover the same set of projects —
no dataset is a subset of another.
The manifest is the machine-readable inventory — file names, row counts,
byte sizes, sha256 checksums, sort keys and the snapshot date. Useful because wildcards do not work
over plain HTTP (see below), so there is no other way to enumerate this product programmatically.
Every file is sorted on its own access key — progetti and fonti-copertura by CUP,
localizzazione by territory, soggetti by name — so row-group statistics are selective. Looking
up one project in the projects file reads one row group out of about 120; the same lookup in
fonti-copertura reads one out of about 230.
These files are not an archive to download: they are meant to be queried where they are. Two choices follow from that, and both were measured rather than assumed:
WRITE_BLOOM_FILTER false). DuckDB writes them by default, and on local
disk they help. Over HTTP they don't: each one is a separate block to fetch per row group, which
added 80–120 requests and doubled the time of a scan, to save about 1 MB. Dropping them also made
the file 10 MB smallerThe practical consequence: the cost of a query here is the number of round-trips, not the bytes. Filters on the sort key are nearly free; filters on other columns have to look at every row group's statistics, and cost a few seconds instead of a few hundred milliseconds.
No credentials, no download. With DuckDB:
~67,000 -- projects located in the municipality of Palermo, in ~1.7 s
Ten municipalities of Sicily with the most projects:
Join the two files — both remote — to ask something neither can answer alone. Here, the third quartile of project cost in Rome, across more than 220,000 projects, in about 4 seconds:
The files also carry their own documentation, readable without downloading them:
One thing to know: over plain HTTP a wildcard is refused (Globs (*) for generic HTTP file are not supported). Name the file you want — there are four, listed above.
Questions that used to require downloading gigabytes now take seconds. All of the following were run against the published files, over HTTP, with nothing stored locally — timings are real.
Half of Italy's public investment sits in less than 0.1% of its projects (5.3 s)
About ten thousand projects out of twelve million account for half of the more than €4,100 billion recorded since 1950. The other 99.9% of projects, together, are worth as much as those ten thousand.
Half a million projects decided before 2010 are still open (1.3 s)
Over 570,000 still ATTIVO against about 440,000 closed. Either they are genuinely running after fifteen
years, or nobody ever closed them in the registry — and the registry cannot tell you which.
The most expensive projects, and how to spot a wrong one (2.0 s)
Top of the list is the Battipaglia–Reggio Calabria high-speed line (€22 bn, 2003). Second is the internal water network of Fondachelli-Fantina, a village of a few hundred people in Sicily, at €18.5 bn — more than the Strait of Messina bridge. Almost certainly a figure entered in lire and never converted (18.5 bn lire ≈ €9.5 m), but the published value says euro. This is the kind of check that now costs two seconds instead of a week — and a reminder to verify before publishing.
Who holds the most projects (1.0 s)
AGEA, the agricultural payments agency, tops the count with over 1.5 million projects worth
about €5 bn — tiny farm subsidies. Third place goes to a body called soggetto privato — an
anonymised placeholder — with over half a million projects worth more than €200 bn, more than
Lombardy and Campania combined.
A caveat on every figure above:
COSTO_PROGETTOis the declared cost of a project, not money actually spent, and the totals span 1950 to 2026 without adjusting for inflation. For amounts actually disbursed, see BDAP, not OpenCUP.
Five things about this dataset will silently give you wrong numbers if you don't know them.
1. One project can sit in several territories, and there are no shares. About 960,000 CUP (8%) have more than one location, up to ten or more. The source publishes no percentage split, so a project's cost cannot be apportioned between municipalities. If you join this file with project amounts and sum by municipality, the same project is counted once per territory.
2. Not every location reaches the municipality. When a project covers a wider area, the codes are
set to -1 and the labels become generic:
Two traps here. -1 passes a cast to integer without failing, so it slips into joins unnoticed.
And the Italian label is TUTTI for the municipality but TUTTE for province and region — a
filter on PROVINCIA = 'TUTTI' returns nothing while nearly half a million rows match 'TUTTE'. Ranking
municipalities by project count puts TUTTI in fourth place in Sicily, ahead of Syracuse, and it is
not a place.
3. ISTAT codes are strings, and the leading zeros matter. Region 04, province 021,
municipality 021108. They are stored as text on purpose: over 90% of province and municipality codes
begin with a zero, and reading them as numbers turns 021108 into 21108, which matches nothing in
any official table. The municipality code contains the province code as its prefix.
4. It is not only Italy. CODICE_STATO has nearly 200 distinct values (two codes share the same
STATO label); about a quarter of a percent of rows, over 30,000, are abroad — Spain, Germany, the
United Kingdom, France…
Filtering by region without also filtering by country silently drops them.
5. soggetti.parquet is not a registry of bodies. The name suggests one row per public body, but
it holds about 54,000 rows for fewer than 29,000 distinct SOGGETTO_TITOLARE: it is the relation
between the body that owns a project and the one that applied for it. Of the roughly 9,000 bodies
appearing more than once, almost all differ only in SOGGETTO_RICHIEDENTE; in about half the
rows the two coincide. Joining progetti to this file on SOGGETTO_TITOLARE therefore nearly
doubles the rows on average. To attach the address and category of a body, deduplicate first:
Mirror of the four bulk archives — Progetti, Localizzazione, Fonti di Copertura and
Soggetti — published at
https://www.opencup.gov.it/portale/web/opencup/accesso-agli-open-data, snapshot of 2026-09-03
(the source's own Last-Modified, the same day for all four archives). The date is also in
_manifest.json (source.snapshot) and in the key-value metadata of every file.
This is a format conversion with minimal, declared cleaning: no column renamed, no row dropped, and values are left as published with three exceptions:
NULL. Text inside a
value is untouched. Without this, the same label appeared in two versions (with and without a
trailing space) in millions of rows, silently splitting filters and GROUP BYDATO NON PRESENTE ("not available") and empty strings become NULLANNO_DELIBERA, 9999 and 0000 are placeholders for a missing year and become NULLEvery other oddity of the source — including the ones above — is preserved rather than corrected, so that the data can be compared with the original. Every file carries provenance and caveats in its Parquet key-value metadata.
For anything authoritative, and for projects registered after the snapshot date, refer to the source.
CC BY 4.0 — Creative Commons Attribution 4.0 International. You may share and adapt this data, including commercially, as long as you give credit. This mirrors the licence the source declares at opencup.gov.it/portale/web/opencup/licenza-cc-by.
Source: OpenCUP, https://www.opencup.gov.it/. Republished by onData APS.
Suggested citation:
OpenCUP (https://www.opencup.gov.it/), snapshot 2026-09-03. Parquet mirror published by onData on Source Cooperative, CC BY 4.0.