Appalti PNRR: cinque sistemi pubblici che non si parlano

Risposta diretta: in Italia, per rispondere alla domanda «chi ha vinto questo appalto PNRR e con quali soldi», devi interrogare almeno cinque sistemi pubblici distinti — OpenCUP, ANAC, SCP, OpenBDAP e il Registro Nazionale Aiuti di Stato — nessuno dei quali espone i dati in un modo che permetta di incrociarli automaticamente con gli altri. Peggio: per i CIG «ordinari», cioè proprio i grandi appalti del PNRR, il nome dell'aggiudicatario non compare nell'API ufficiale ANAC. Questo articolo documenta ogni barriera, fonte per fonte, incontrata costruendo un connettore per OpenLegis.
TL;DR
- OpenCUP non ha un'API: espone una pagina per singolo progetto, pensata per un umano con un browser. Nessun endpoint di ricerca.
- ANAC pubblica un file bulk da circa 3 milioni di righe invece di un endpoint di ricerca interrogabile.
- SCP e OpenBDAP sono due sistemi separati, ognuno con la sua logica, che coprono pezzi diversi dello stesso ciclo di vita.
- Il Registro Nazionale Aiuti di Stato esiste solo come dump XML massivo, con un legame debole e non garantito verso il CUP.
- Per i CIG «ordinari» — la categoria in cui ricadono i grandi appalti PNRR — l'aggiudicatario è invisibile nell'API ufficiale ANAC: per scoprirlo devi passare dalla sezione «Esiti» di SCP, un'altra fonte, con un'altra chiave.
- Nessuno di questi sistemi è stato progettato per essere interrogato insieme agli altri. Il risultato pratico: la filiera CUP → CIG → aggiudicatario → importo erogato non si chiude senza lavoro manuale.
Perché la domanda è semplice e la risposta no
La domanda di partenza è la più banale che un cittadino possa fare: un progetto PNRR da 864.000 euro nel mio comune — chi lo sta realizzando, e quanto ha incassato finora?
Sulla carta i dati ci sono tutti, e sono tutti pubblici. Ogni progetto finanziato ha un CUP (Codice Unico di Progetto). Ogni gara ha un CIG (Codice Identificativo Gara). Ogni aggiudicazione ha un vincitore e un importo. Ogni erogazione lascia una traccia contabile.
Il problema non è la mancanza di dati. È che ognuno di questi quattro passaggi vive in un sistema diverso, con un modello dei dati diverso, una chiave di accesso diversa e un'idea diversa di cosa significhi «pubblicare».
Le cinque fonti, una per una
| Fonte | Cosa contiene | Come la interroghi | Barriera reale |
|---|---|---|---|
| OpenCUP | Anagrafica del progetto finanziato | Pagina web per singolo CUP | Nessuna API. Nessuna ricerca programmabile |
| ANAC | Anagrafica gare e contratti | File bulk (~3M righe) | Nessun endpoint di ricerca: o scarichi tutto, o niente |
| SCP | Esiti delle gare, aggiudicatari | Portale separato | Chiave e modello dati diversi da ANAC |
| OpenBDAP | Dati contabili, erogazioni | Portale separato | Copre un altro pezzo del ciclo di vita |
| Registro Aiuti di Stato | Aiuti concessi alle imprese | Dump XML massivo | Legame con il CUP debole e non garantito |
Presi uno per uno, nessuno di questi sistemi è scandaloso. Presi insieme — che è l'unico modo in cui servono davvero — sono un labirinto.
Il buco che conta: l'aggiudicatario invisibile
C'è un dettaglio tecnico che vale più di tutti gli altri messi insieme, e che ho scoperto solo integrando.
Nell'API ufficiale ANAC, per i CIG in modalità «semplificata» (le gare piccole) il campo dell'aggiudicatario c'è. Per i CIG in modalità «ordinaria» — che è la modalità dei grandi appalti, cioè esattamente quelli del PNRR — quel campo non è esposto.
Detto senza tecnicismi: proprio sugli appalti dove il nome del vincitore conta di più, l'API ufficiale non te lo dice. Per ottenerlo devi andare su un altro portale (la sezione «Esiti» di SCP), con un'altra chiave e un'altra logica di ricerca, e ricostruire a mano il collegamento.
Non è un errore di scrittura in un file: è una scelta di quali campi esporre, in quale modalità, in quale sistema.
«Aperto» non vuol dire «interrogabile»
Questo pattern non è nuovo — l'ho già documentato fonte per fonte per l'intero panorama italiano: portali che rispondono zero byte a un programma, endpoint SPARQL ufficiali che rispondono 200 vuoto, certificati TLS rotti su domini dello Stato.
Sugli appalti però la posta in gioco è diversa. Non si tratta di un dataset statistico che fa comodo a un ricercatore: si tratta di chi prende i soldi pubblici, in un piano di spesa che è il più grande della storia repubblicana. La frammentazione qui non è un fastidio tecnico. È una barriera all'unico controllo diffuso che i dati aperti dovrebbero rendere possibile.
Se sei un giornalista o un attivista: cosa puoi farci concretamente
Non serve saper programmare per usare quello che c'è. Serve sapere in che ordine guardare.
- Parti dal CUP, non dal nome dell'impresa. Il CUP è l'unica chiave che attraversa più sistemi. Lo trovi sulla delibera comunale o sull'atto di finanziamento.
- Su OpenCUP ottieni l'anagrafica del progetto: soggetto attuatore, importo finanziato, stato.
- Su ANAC cerchi i CIG collegati. Se il progetto è grande, aspettati che l'aggiudicatario non ci sia.
- Su SCP, sezione Esiti, cerchi lo stesso CIG per trovare il vincitore reale.
- Su OpenBDAP verifichi quanto è stato effettivamente erogato — che quasi mai coincide con l'importo aggiudicato.
Ogni passaggio che salti è un pezzo di storia che perdi. E ogni passaggio richiede di ricopiare un codice a mano da un portale all'altro, il che è esattamente il motivo per cui quasi nessuno lo fa fino in fondo.
Incuria o disegno?
Non ho una risposta, e diffido di chi ce l'ha troppo in fretta.
L'ipotesi dell'incuria è plausibile e non va sottovalutata: sistemi nati in epoche diverse, da amministrazioni diverse, con obiettivi diversi, nessuno dei quali aveva come requisito «devi parlare con gli altri quattro». È il modo normale in cui il software pubblico si stratifica, ovunque nel mondo.
Ma l'ipotesi dell'incuria spiega male un dettaglio: perché il campo dell'aggiudicatario c'è nelle gare piccole e sparisce in quelle grandi. Quella non è stratificazione storica. È una differenza di comportamento dentro lo stesso sistema, deliberata almeno nel senso che qualcuno l'ha scritta.
Lascio la domanda aperta, perché è così che sta: i fatti tecnici sono verificabili, le intenzioni no. Ma il primo passo per rispondere è che i fatti siano scritti da qualche parte — ed è quello che questo articolo prova a fare.
FAQ
Esiste un'unica banca dati degli appalti pubblici italiani?
No. Esistono più sistemi che coprono fasi diverse — finanziamento (OpenCUP), gara (ANAC), esito (SCP), contabilità (OpenBDAP), aiuti alle imprese (Registro Aiuti di Stato) — e nessuno di questi è progettato per essere incrociato automaticamente con gli altri.
Posso sapere chi ha vinto un appalto PNRR direttamente dall'API di ANAC?
Nella maggior parte dei casi rilevanti, no. Per i CIG in modalità «ordinaria», che è la modalità dei grandi appalti, il dato dell'aggiudicatario non è esposto nell'API. Devi recuperarlo dalla sezione «Esiti» di SCP.
Cos'è il CUP e perché è la chiave giusta da cui partire?
Il CUP (Codice Unico di Progetto) identifica il progetto finanziato, non la singola gara. È l'unico identificativo che compare — con modalità diverse — in più sistemi, quindi è il punto di partenza che permette di seguire un progetto attraverso le sue fasi.
Perché non basta scaricare il file bulk di ANAC?
Perché contiene circa tre milioni di righe di anagrafica gare, senza l'esito, e senza un legame diretto e affidabile verso il finanziamento a monte. Ti dice che una gara esiste; non ti dice chi l'ha vinta né con quali fondi è stata pagata.
Se lavori con dati pubblici e ti serve un modo affidabile per incrociarli — o stai valutando se un progetto del genere è realizzabile nel tuo contesto — parliamone. È lo stesso tipo di lavoro che c'è dietro il grafo di conoscenza su leggi e dati pubblici di OpenLegis.
Articoli correlati
- Il bug peggiore non rompe la funzione: rompe la vista26 strumenti collegati e funzionanti in produzione, la dashboard ne mostrava zero. Il bug era lì da mesi anche per un altro prodotto, e nessuno l'aveva visto perché chi poteva notarlo aveva i permessi di amministratore.
- Sapeva 22.000 sentenze, ma non un numero di attoUn sistema con la giurisprudenza costituzionale dal 1956 non riusciva a trovare un disegno di legge cercato per numero. Nessuno l'aveva mai testato: sembrava troppo ovvio per essere rotto.
- Quanto costa davvero fare ingest di 46.844 documenti con un LLMIl prototipo gira sul free tier, poi provi a ingerire 46.844 documenti e scopri che il conto vero non è quello che avevi in testa. Il calcolo che nessuno fa prima di lanciare il job, con numeri reali.