Skip to content

Instantly share code, notes, and snippets.

@aborruso
Last active February 24, 2026 08:41
Show Gist options
  • Select an option

  • Save aborruso/b02ae9b45e5e6fd656e06079a2067ee8 to your computer and use it in GitHub Desktop.

Select an option

Save aborruso/b02ae9b45e5e6fd656e06079a2067ee8 to your computer and use it in GitHub Desktop.
<!doctype html>
<html lang="it">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>API nascoste: guida rapida per data journalist</title>
<style>
:root {
--bg: #f3f5f8;
--ink: #1e2a33;
--muted: #5f6b75;
--card: #ffffff;
--accent: #0b6bcb;
--accent-2: #0a9d7a;
--warn: #934c00;
--border: #d8dee5;
--code: #0f1720;
}
* { box-sizing: border-box; }
body {
margin: 0;
font-family: "Titillium Web", "Segoe UI", sans-serif;
background: radial-gradient(circle at 90% -10%, #d9ecff 0%, transparent 40%), var(--bg);
color: var(--ink);
line-height: 1.45;
}
.wrap { max-width: 980px; margin: 0 auto; padding: 1rem; }
header {
background: linear-gradient(120deg, #0f3b66, #0b6bcb);
color: #fff;
border-radius: 12px;
padding: 1.2rem;
margin: 1rem 0;
}
h1 { margin: 0 0 .3rem 0; font-size: 1.7rem; }
h2 { margin: 0 0 .6rem 0; font-size: 1.25rem; }
p { margin: .35rem 0; }
.grid { display: grid; gap: 1rem; grid-template-columns: 1fr; }
.card {
background: var(--card);
border: 1px solid var(--border);
border-radius: 12px;
padding: 1rem;
box-shadow: 0 2px 10px rgba(0,0,0,.04);
}
.tag {
display: inline-block;
background: #eaf4ff;
color: #13477a;
border: 1px solid #cde0f6;
border-radius: 999px;
padding: .18rem .55rem;
font-size: .8rem;
margin-right: .3rem;
margin-bottom: .35rem;
}
.lead { color: #ecf6ff; max-width: 76ch; }
.goal { border-left: 5px solid var(--accent); padding-left: .7rem; }
.note {
background: #fff7e8;
border: 1px solid #ffd8a8;
color: var(--warn);
padding: .7rem;
border-radius: 10px;
}
pre {
margin: .6rem 0;
background: var(--code);
color: #d5e6ff;
border-radius: 10px;
padding: .8rem;
overflow: auto;
white-space: pre-wrap;
word-break: break-word;
overflow-wrap: anywhere;
font-size: .85rem;
}
a.link {
color: var(--accent);
text-decoration: underline;
text-underline-offset: 2px;
}
code { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
.example-head {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: .5rem;
margin-bottom: .35rem;
}
button.copy {
border: 1px solid #b8d5f5;
background: #eef7ff;
color: #154a7a;
border-radius: 8px;
padding: .35rem .6rem;
cursor: pointer;
font-size: .82rem;
}
button.copy:hover { background: #dff0ff; }
.ok { color: var(--accent-2); font-weight: 700; }
.muted { color: var(--muted); }
footer {
margin: 1rem 0 2rem;
color: var(--muted);
font-size: .9rem;
text-align: center;
}
@media (min-width: 880px) {
.grid.two { grid-template-columns: 1fr 1fr; }
}
</style>
</head>
<body>
<div class="wrap">
<header>
<h1>Dal sito web ai dati interrogabili</h1>
<p class="lead">Mini-guida per data journalist: come verificare se una pagina che mostra dati usa API richiamabili in modo automatico, con metodo trasparente e replicabile.</p>
<span class="tag">single-file HTML</span>
<span class="tag">no build step</span>
<span class="tag"><a class="link" href="https://agent-browser.dev/" target="_blank" rel="noopener noreferrer">agent-browser</a></span>
</header>
<main class="grid">
<section class="card">
<h2>1) Obiettivo dell'analisi</h2>
<p class="goal">Dato un sito che espone dati via interfaccia grafica, capire se esiste un meccanismo di accesso automatizzabile (API/chiamate HTTP) per estrazione, verifica e riuso.</p>
<p>Nel caso specifico: pagina <strong>"Bandi, avvisi ed esiti di gara"</strong> di <a class="link" href="https://www.serviziocontrattipubblici.it/it/consultazione/bandi-avvisi-ed-esiti-di-gara/" target="_blank" rel="noopener noreferrer">Servizio Contratti Pubblici</a>.</p>
</section>
<section class="card">
<h2>2) Prompt iniziale (semplice) e strumento usato</h2>
<p>È stato usato un prompt molto semplice per avviare l'esplorazione, citando la skill <a class="link" href="https://agent-browser.dev/" target="_blank" rel="noopener noreferrer"><code>agent-browser</code></a>:</p>
<pre><code>usa agent-browser skill per vedere se in questa pagina ci sono api non documentate.
se sì, documentale e crea script ciao mondo.</code></pre>
<p class="muted">Con <a class="link" href="https://agent-browser.dev/" target="_blank" rel="noopener noreferrer"><code>agent-browser</code></a> si osservano richieste di rete durante i click utente (es. "Cerca Bandi").</p>
</section>
<section class="card">
<h2>3) Cosa si è scoperto</h2>
<p class="ok">Alcune informazioni sono effettivamente estraibili via chiamate HTTP dirette.</p>
<p>Endpoint emersi: <code>/WSConsultBandi/rest/Bandi/Lista</code>, <code>/WSConsultBandi/rest/Esiti/Lista</code>, <code>/WSConsultBandi/rest/Bandi/Dettaglio</code>, <code>/WSConsultBandi/rest/Esiti/Dettaglio</code>, e altri.</p>
<p>Per <strong>Atti</strong>, nel test sullo stesso CIG i risultati sono stati <code>total: 0</code>: informazione utile perché indica copertura non completa o filtri lato backend non chiari.</p>
</section>
<section class="card note">
<strong>Non sovraccaricare il servizio:</strong> evitare polling aggressivo, inserire pause tra le richieste, limitare il numero di chiamate e preferire batch piccoli.
</section>
<section class="card">
<h2>4) Guida pratica con esempi (chiamata + reply)</h2>
<p class="muted">Base URL: <code>https://www.serviziocontrattipubblici.it</code></p>
</section>
<section class="grid two">
<article class="card">
<div class="example-head">
<h2>Esempio A: Bandi (stesso CIG)</h2>
<button class="copy" data-copy="cmd-bandi">Copia chiamata</button>
</div>
<p><strong>Chiamata</strong></p>
<pre id="cmd-bandi"><code>curl -k -X POST \
"https://www.serviziocontrattipubblici.it/WSConsultBandi/rest/Bandi/Lista?page_limit=5&offset=0&stato=3&cig=7383208FF8" \
-H "Content-Type: application/x-www-form-urlencoded"</code></pre>
<p><strong>Esempio di reply</strong></p>
<pre><code>{
"total": 1,
"data": [
{
"id": 172810,
"oggetto": "Affidamento del servizio di manutenzioni meccaniche impianti",
"dataPubblicazione": "20/02/2018",
"importo": 432000.0,
"dataScadenza": "15/03/2018"
}
]
}</code></pre>
<details>
<summary><strong>Output completo Bandi/Lista (CIG 7383208FF8)</strong></summary>
<pre id="bandi-full-output"><code></code></pre>
</details>
<p class="muted">Esempio machine-to-machine “Lista → Dettaglio” (CIG <code>A02B7B4D94</code>):</p>
<pre><code>curl -k -X POST \
"https://www.serviziocontrattipubblici.it/WSConsultBandi/rest/Bandi/Lista?page_limit=1&offset=0&stato=3&cig=A02B7B4D94" \
-H "Content-Type: application/x-www-form-urlencoded"</code></pre>
<pre><code>curl -k -X POST \
"https://www.serviziocontrattipubblici.it/WSConsultBandi/rest/Bandi/Dettaglio" \
-H "Content-Type: application/json" \
--data "739222"</code></pre>
<details>
<summary><strong>Output completo Bandi/Dettaglio (id=739222)</strong></summary>
<pre id="bandi-detail-output"><code></code></pre>
</details>
</article>
<article class="card">
<div class="example-head">
<h2>Esempio B: Esiti (stesso CIG)</h2>
<button class="copy" data-copy="cmd-esiti">Copia chiamata</button>
</div>
<p><strong>Chiamata</strong></p>
<pre id="cmd-esiti"><code>curl -k -X POST \
"https://www.serviziocontrattipubblici.it/WSConsultBandi/rest/Esiti/Lista?page_limit=5&offset=0&stato=3&cig=7383208FF8" \
-H "Content-Type: application/x-www-form-urlencoded"</code></pre>
<p><strong>Esempio di reply</strong></p>
<pre><code>{
"total": 1,
"data": [
{
"idGara": 172810,
"numeroPubblicazione": 2,
"cig": "7383208FF8-",
"dataPubblicazione": "25/09/2018",
"importo": 400795.42
}
]
}</code></pre>
<p class="muted">Differenza informativa: qui emerge la fase di esito/aggiudicazione, non solo il bando iniziale.</p>
<details>
<summary><strong>Output completo Esiti/Lista (CIG 7383208FF8)</strong></summary>
<pre id="esiti-full-output"><code></code></pre>
</details>
<p class="muted">Flusso machine-to-machine “Lista → Dettaglio” per Esiti:</p>
<pre><code>curl -k -X POST \
"https://www.serviziocontrattipubblici.it/WSConsultBandi/rest/Esiti/Dettaglio?numeroPubblicazione=2" \
-H "Content-Type: application/json" \
--data "172810"</code></pre>
<details>
<summary><strong>Output completo Esiti/Dettaglio (idGara=172810, numeroPubblicazione=2)</strong></summary>
<pre id="esiti-detail-output"><code></code></pre>
</details>
</article>
</section>
<section class="card">
<div class="example-head">
<h2>Esempio D: Avvisi (Lista -&gt; Dettaglio)</h2>
<button class="copy" data-copy="cmd-avvisi-lista">Copia chiamata</button>
</div>
<p><strong>Chiamata lista</strong></p>
<pre id="cmd-avvisi-lista"><code>curl -k -X POST \
"https://www.serviziocontrattipubblici.it/WSConsultBandi/rest/Avvisi/Lista?page_limit=1&offset=0&stato=3" \
-H "Content-Type: application/x-www-form-urlencoded"</code></pre>
<p><strong>Esempio di reply</strong></p>
<pre><code>{
"total": 166570,
"data": [
{
"id": 41655,
"codiceSA": "00161090428",
"codiceSistema": 1,
"descrizione": "LAVORI DI MANUTENZIONE STRAORDINARIA DEI PIANI VIABILI ...",
"ente": "COMUNE DI MONTEMARCIANO - COMUNE DI MONTEMARCIANO"
}
]
}</code></pre>
<details>
<summary><strong>Output completo Avvisi/Lista (sample)</strong></summary>
<pre id="avvisi-full-output"><code></code></pre>
</details>
<p class="muted">Con i dati della lista (`id`, `codiceSistema`, `codiceSA`) fai il dettaglio:</p>
<pre id="cmd-avvisi-dettaglio"><code>curl -k -X POST \
"https://www.serviziocontrattipubblici.it/WSConsultBandi/rest/Avvisi/Dettaglio?codiceSistema=1&codiceSA=00161090428" \
-H "Content-Type: application/json" \
--data "41655"</code></pre>
<p><strong>Esempio di reply dettaglio</strong></p>
<pre><code>{
"id": 41655,
"cig": "7722018AD5",
"cup": "C17H18000250001",
"rup": "GRASSUCCI FABIO",
"documenti": [{ "titolo": "AFFIDAMENTO" }]
}</code></pre>
<details>
<summary><strong>Output completo Avvisi/Dettaglio (id=41655)</strong></summary>
<pre id="avvisi-detail-output"><code></code></pre>
</details>
</section>
<section class="card">
<div class="example-head">
<h2>Esempio C: Atti (con CIG reale)</h2>
<button class="copy" data-copy="cmd-atti">Copia chiamata</button>
</div>
<p><strong>Chiamata</strong></p>
<pre id="cmd-atti"><code>curl -k -X POST \
"https://www.serviziocontrattipubblici.it/WSConsultBandi/rest/Bandi/Lista?page_limit=20" \
-H "Content-Type: application/x-www-form-urlencoded"</code></pre>
<pre><code>--data "page_limit=20&atto=S&stato=1"</code></pre>
<p><strong>Esempio di reply</strong></p>
<pre><code>{
"total": 214,
"data": [
{
"id": 336589,
"oggetto": "Stampanti multifunzione e monitor multimediali",
"ente": "ATER DELLA PROVINCIA DI GORIZIA",
"provincia": "GO",
"dataPubblicazione": "30/06/2021"
}
]
}</code></pre>
<p class="muted">Per estrarre il CIG dell'atto, usa il dettaglio con l'id:</p>
<pre><code>curl -k -X POST \
"https://www.serviziocontrattipubblici.it/WSConsultBandi/rest/Bandi/Dettaglio" \
-H "Content-Type: application/json" \
--data "336589"</code></pre>
<p class="muted">Qui sopra c'è un estratto. Sotto trovi l'output completo in accordion.</p>
<pre><code>{
"id": 336589,
"lotti": [{ "cig": "8678320836" }],
"atti": [{ "listaCig": "8678320836-" }]
}</code></pre>
<details>
<summary><strong>Output completo Bandi/Dettaglio (id=336589)</strong></summary>
<pre id="atti-full-output"><code></code></pre>
</details>
</section>
<section class="card">
<h2>5) Perché questo deve essere documentato pubblicamente</h2>
<p>Se un portale pubblico espone dati via API (anche se usate internamente dal frontend), è buona pratica rendere <strong>ufficiali e pubbliche</strong> almeno:</p>
<ul>
<li>lista endpoint e metodi HTTP;</li>
<li>parametri supportati e significato;</li>
<li>schema delle risposte e codici errore;</li>
<li>limiti d'uso, rate-limit e policy etiche;</li>
<li>esempi di query replicabili.</li>
</ul>
<p>Questo aumenta trasparenza, qualità del controllo civico e riduce scraping fragile.</p>
</section>
</main>
<footer>
Pagina dimostrativa per formazione data journalism. Verificare sempre termini d'uso e basi giuridiche prima di automatizzare.
</footer>
</div>
<script type="application/json" id="bandi-full-json">
{
"total": 1,
"page_limit": 1,
"offset": 0,
"data": [
{
"id": 172810,
"oggetto": "Affidamento del servizio di manutenzioni meccaniche impianti",
"ente": "CONSORZIO OBBLIGATORIO SMALTIMENTO RIFIUTI - TECNICO",
"provincia": "MC",
"dataPubblicazione": "20/02/2018",
"importo": 432000.0,
"dataScadenza": "15/03/2018"
}
]
}
</script>
<script type="application/json" id="bandi-detail-json">
{
"id": 739222,
"ente": "UNIONE MONTANA POTENZA ESINO MUSONE - CENTRALE UNICA DI COMMITTENZA",
"cfente": "01874330432",
"settore": "O",
"realizzazione": 1,
"oggetto": "CUC p/c COMUNE DI FIUMINATA: PROCEDURA APERTA TELEMATICA A RILEVANZA COMUNITARIA PER L'AFFIDAMENTO DEI SERVIZI TECNICI DI ARCHITETTURA E INGEGNERIA PER LA PROGETTAZIONE DI FATTIBILIT TECNICA ED ECONOMICA, ESECUTIVA, RELAZIONE GEOLOGICA, COORDINAMENTO DELLA SICUREZZA IN FASE DI PROGETTAZIONE CON RISERVA DI AFFIDAMENTO DELLE ATTIVITA' DI DIREZIONE DEI LAVORI E COORDINAMENTO DELLA SICUREZZA IN FASE DI ESECUZIONE RELATIVI ALL'INTERVENTO DI MIGLIORAMENTO SISMICO DELL'EDIFICIO DENOMINATO EX FONDERIA SITO IN LOC. COLLE SAN PIETRO PER ATTIVITA' SOCIO CULTURALI IDENTIFICATIVO OPERA N. 283 - OO.PP._F1_2021_MAR_0238 - ALL. A1 ORD. N. 137 DEL 29.03.2023",
"rup": "FOLCHI VICI D'ARCEVIA IOLE-ANNA",
"importoGara": 381761.22,
"lotti": [
{
"numero": 1,
"oggetto": "SERVIZI TECNICI DI ARCHITETTURA E INGEGNERIA PER LA PROGETTAZIONE DI FATTIBILITA TECNICA ED ECONOMICA, ESECUTIVA, RELAZIONE GEOLOGICA, COORDINAMENTO DELLA SICUREZZA IN FASE DI PROGETTAZIONE CON RISERVA DI AFFIDAMENTO DELLE ATTIVITA DI DIREZIONE DEI LAVORI E COORDINAMENTO DELLA SICUREZZA IN FASE DI ESECUZIONE RELATIVI ALL'INTERVENTO DI MIGLIORAMENTO SISMICO DELL'EDIFICIO DENOMINATO EX FONDERIA SITO IN LOC. COLLE SAN PIETRO PER ATTIVITA' SOCIO CULTURALI - IDENTIFICATIVO OPERA N. 283 - OO.PP._F1_2021_MAR_0238 - ALL. A1 ORD. N. 137 DEL 29.03.2023",
"cig": "A02B7B4D94",
"cup": "I42C21000340001",
"importoSicurezza": 0,
"importoLotto": 381761.22,
"cpv": "71250000-5 - Servizi architettonici, di ingegneria e misurazione",
"categoria": "FS",
"classe": null,
"tipoAppalto": "S",
"tipoProcedura": 1,
"criterioAggiudicazione": 2,
"luogoIstat": "011043015",
"luogoNuts": "ITI33",
"luogoEsecuzione": "FIUMINATA",
"urlProfiloComm": null,
"cpvSecondari": [],
"categorieScorporabili": []
}
],
"atti": [
{
"numeroPubblicazione": 1,
"tipoDocumento": 1,
"dataPubblicazione": "04/12/2023",
"dataScadenza": null,
"dataProvvedimento": "27/11/2023",
"numeroProvvedimento": "179/528",
"listaCig": "A02B7B4D94-"
},
{
"numeroPubblicazione": 2,
"tipoDocumento": 3,
"dataPubblicazione": "04/12/2023",
"dataScadenza": "11/01/2024",
"dataProvvedimento": null,
"numeroProvvedimento": null,
"listaCig": "A02B7B4D94-"
}
]
}
</script>
<script type="application/json" id="avvisi-full-json">
{
"total": 166570,
"page_limit": 1,
"offset": 0,
"data": [
{
"id": 41655,
"codiceSA": "00161090428",
"codiceSistema": 1,
"descrizione": "LAVORI DI MANUTENZIONE STRAORDINARIA DEI PIANI VIABILI DI VIA OLIVETO, VIA CASSIANO, VIA DANTE ALIGHIERI (CUP: C17H18000280001) - AFFIDAMENTO TRAMITE ADESIONE CONVENZIONE CUC -",
"ente": "COMUNE DI MONTEMARCIANO - COMUNE DI MONTEMARCIANO",
"provincia": "AN",
"dataPubblicazione": "22/02/2109",
"tipologia": 6
}
]
}
</script>
<script type="application/json" id="avvisi-detail-json">
{
"id": 41655,
"codiceSA": "00161090428",
"codiceSistema": 1,
"ente": "COMUNE DI MONTEMARCIANO - COMUNE DI MONTEMARCIANO",
"codiceFiscaleSA": "00161090428",
"tipologia": 6,
"descrizione": "LAVORI DI MANUTENZIONE STRAORDINARIA DEI PIANI VIABILI DI VIA OLIVETO, VIA CASSIANO, VIA DANTE ALIGHIERI (CUP: C17H18000280001) - AFFIDAMENTO TRAMITE ADESIONE CONVENZIONE CUC -",
"cig": "7722018AD5",
"cup": "C17H18000250001",
"cui": null,
"rup": "GRASSUCCI FABIO",
"data": "22/02/2109",
"dataScadenza": "09/03/2019",
"pubblicazioni": [
{
"codice": 408026,
"data": "22/02/2019",
"tipoInvio": 1
}
],
"documenti": [
{
"codiceSA": "00161090428",
"id": 41655,
"codiceSistema": 1,
"nrDoc": 1,
"titolo": "AFFIDAMENTO",
"url": "http://www.comune.montemarciano.ancona.it/c042027/zf/index.php/bandi-di-gara/bandi-di-gara/bando/sezione/attivi/cigBando/7722018AD5/serialBando/2631"
}
],
"idGenerato": 561887
}
</script>
<script type="application/json" id="esiti-detail-json">
{
"idGara": 172810,
"ente": "CONSORZIO OBBLIGATORIO SMALTIMENTO RIFIUTI - TECNICO",
"cfente": "80010900431",
"settore": "O",
"realizzazione": 1,
"oggetto": "Affidamento del servizio di manutenzioni meccaniche impianti",
"rup": "Giampaoli Giuseppe",
"importoAggiudicazione": 400795.42,
"lotti": [
{
"numero": 1,
"oggetto": "Affidamento del servizio di manutenzioni meccaniche impianti",
"cig": "7383208FF8",
"cup": null,
"importoSicurezza": 8600.0,
"importoLotto": 432000.0,
"cpv": "45259000-7 - Riparazione e manutenzione di impianti",
"categoria": "FS",
"classe": null,
"tipoAppalto": "F",
"tipoProcedura": 1,
"criterioAggiudicazione": 2,
"luogoIstat": "011043053",
"luogoNuts": null,
"luogoEsecuzione": "TOLENTINO",
"urlProfiloComm": "www.cosmarimc.it",
"cpvSecondari": [],
"categorieScorporabili": []
}
],
"esito": {
"numeroPubblicazione": 2,
"tipoDocumento": 20,
"eventualeSpecificazione": null,
"dataPubblicazione": "25/09/2018",
"dataScadenza": null,
"dataDecreto": null,
"dataProvvedimento": null,
"numeroProvvedimento": null,
"dataStipula": null,
"numeroRepertorio": null,
"ribassoAggiudicazione": 7.37,
"offertaAumento": null,
"importoAggiudicazione": 400795.42,
"dataAggiudicazione": "15/05/2018",
"urlCommittente": null,
"urlEProcurement": null,
"listaCig": null,
"documenti": [
{
"id": 172810,
"numeroPubblicazione": 2,
"nrDoc": 1,
"titolo": "Esito di gara",
"url": "https://www.serviziocontrattipubblici.it/PubbAvvisiBandiEsiti/VisualizzaAllegato.do?codice=161120&entita=ESITI&nr_doc=1"
}
],
"aggiudicatari": [
{
"number": 1,
"name": "C.S.T. - S.R.L.",
"ruolo": null
}
],
"pubblicazioni": [
{
"codice": 368202,
"data": "25/09/2018",
"tipoInvio": 1
}
],
"idGenerato": 517587
},
"idGenerato": 213366
}
</script>
<script type="application/json" id="esiti-full-json">
{
"total": 1,
"page_limit": 1,
"offset": 0,
"data": [
{
"idGara": 172810,
"numeroPubblicazione": 2,
"oggetto": "Affidamento del servizio di manutenzioni meccaniche impianti",
"ente": "CONSORZIO OBBLIGATORIO SMALTIMENTO RIFIUTI - TECNICO",
"provincia": "MC",
"dataPubblicazione": "25/09/2018",
"importo": 400795.42,
"cig": "7383208FF8-"
}
]
}
</script>
<script type="application/json" id="atti-full-json">
{
"id": 336589,
"ente": "ATER DELLA PROVINCIA DI GORIZIA",
"cfente": "00051390318",
"settore": "O",
"realizzazione": 1,
"oggetto": "Stampanti multifunzione e monitor multimediali",
"rup": "Gargiulo Alessandra ",
"importoGara": 127000.0,
"lotti": [
{
"numero": 1,
"oggetto": "Stampanti multifunzione e monitor multimediali",
"cig": "8678320836",
"cup": null,
"importoSicurezza": 0.0,
"importoLotto": 127000.0,
"cpv": "30230000-0 - Apparecchiature informatiche",
"categoria": "FS",
"classe": null,
"tipoAppalto": "S",
"tipoProcedura": 28,
"criterioAggiudicazione": 4,
"luogoIstat": null,
"luogoNuts": "ITH43",
"luogoEsecuzione": "Gorizia",
"urlProfiloComm": null,
"cpvSecondari": [
{
"code": "30120000-6",
"value": "Fotocopiatrici e stampanti offset"
}
],
"categorieScorporabili": []
}
],
"atti": [
{
"numeroPubblicazione": 1,
"tipoDocumento": 1,
"eventualeSpecificazione": null,
"dataPubblicazione": "29/01/2021",
"dataScadenza": "31/12/2026",
"dataDecreto": null,
"dataProvvedimento": "25/11/2020",
"numeroProvvedimento": "170",
"dataStipula": null,
"numeroRepertorio": null,
"ribassoAggiudicazione": null,
"offertaAumento": null,
"importoAggiudicazione": null,
"dataAggiudicazione": null,
"urlCommittente": null,
"urlEProcurement": null,
"listaCig": "8678320836-",
"documenti": [
{
"id": 336589,
"numeroPubblicazione": 1,
"nrDoc": 1,
"titolo": "Provvedimento del Direttore n. 170 del 25.11.2020 di avvio della procedura di affidamento",
"url": "https://bandi-gara.regione.fvg.it/ater-gorizia/provvedimenti?p_p_id=it_insiel_bandigara_portlet_PortletBandigara_INSTANCE_3IpwnpnVNv1l&p_p_lifecycle=0&p_p_state=normal&p_p_mode=view&_it_insiel_bandigara_portlet_PortletBandigara_INSTANCE_3IpwnpnVNv1l_mvcRenderCommandName=%2Fdettaglio&_it_insiel_bandigara_portlet_PortletBandigara_INSTANCE_3IpwnpnVNv1l_id=9813"
}
],
"aggiudicatari": [],
"pubblicazioni": [
{
"codice": 761963,
"data": "22/04/2021",
"tipoInvio": 1
}
],
"idGenerato": 1017887
},
{
"numeroPubblicazione": 2,
"tipoDocumento": 1,
"eventualeSpecificazione": null,
"dataPubblicazione": "22/04/2021",
"dataScadenza": "31/12/2026",
"dataDecreto": null,
"dataProvvedimento": "22/03/2021",
"numeroProvvedimento": "35",
"dataStipula": null,
"numeroRepertorio": null,
"ribassoAggiudicazione": null,
"offertaAumento": null,
"importoAggiudicazione": null,
"dataAggiudicazione": null,
"urlCommittente": null,
"urlEProcurement": null,
"listaCig": "8678320836-",
"documenti": [
{
"id": 336589,
"numeroPubblicazione": 2,
"nrDoc": 1,
"titolo": "Provvedimento del Direttore di approvazione del CSA e invio della Lettera di invito",
"url": "https://bandi-gara.regione.fvg.it/ater-gorizia/provvedimenti?p_p_id=it_insiel_bandigara_portlet_PortletBandigara_INSTANCE_3IpwnpnVNv1l&p_p_lifecycle=0&p_p_state=normal&p_p_mode=view&_it_insiel_bandigara_portlet_PortletBandigara_INSTANCE_3IpwnpnVNv1l_mvcRenderCommandName=%2Fdettaglio&_it_insiel_bandigara_portlet_PortletBandigara_INSTANCE_3IpwnpnVNv1l_id=10934"
}
],
"aggiudicatari": [],
"pubblicazioni": [
{
"codice": 761969,
"data": "22/04/2021",
"tipoInvio": 1
}
],
"idGenerato": 1017896
},
{
"numeroPubblicazione": 3,
"tipoDocumento": 6,
"eventualeSpecificazione": null,
"dataPubblicazione": "24/05/2021",
"dataScadenza": "31/12/2026",
"dataDecreto": null,
"dataProvvedimento": null,
"numeroProvvedimento": null,
"dataStipula": null,
"numeroRepertorio": null,
"ribassoAggiudicazione": 44.635350319,
"offertaAumento": null,
"importoAggiudicazione": 70938.0,
"dataAggiudicazione": null,
"urlCommittente": null,
"urlEProcurement": null,
"listaCig": "8678320836-",
"documenti": [
{
"id": 336589,
"numeroPubblicazione": 3,
"nrDoc": 1,
"titolo": "Procedura negoziata per l’affidamento del servizio di noleggio full service di stampanti multifunzione e di apparati ed impianti monitor multimediali per la durata di 60 mesi. - Lettera di invito (12/05/2021)",
"url": "https://bandi-gara.regione.fvg.it/ater-gorizia/procedure?p_p_id=it_insiel_bandigara_portlet_PortletBandigara_INSTANCE_3IpwnpnVNv1l&p_p_lifecycle=0&p_p_state=normal&p_p_mode=view&_it_insiel_bandigara_portlet_PortletBandigara_INSTANCE_3IpwnpnVNv1l_mvcRenderCommandName=%2FdettaglioProc&_it_insiel_bandigara_portlet_PortletBandigara_INSTANCE_3IpwnpnVNv1l_id=cig_23257"
}
],
"aggiudicatari": [
{
"number": 1,
"name": "CENTRO FRIULI SRL CON SOCIO UNICO",
"ruolo": null
}
],
"pubblicazioni": [
{
"codice": 786303,
"data": "24/05/2021",
"tipoInvio": 1
}
],
"idGenerato": 1051359
},
{
"numeroPubblicazione": 4,
"tipoDocumento": 18,
"eventualeSpecificazione": null,
"dataPubblicazione": "24/05/2021",
"dataScadenza": "31/12/2021",
"dataDecreto": null,
"dataProvvedimento": "11/05/2021",
"numeroProvvedimento": "48",
"dataStipula": null,
"numeroRepertorio": null,
"ribassoAggiudicazione": 44.635350319,
"offertaAumento": null,
"importoAggiudicazione": 70938.0,
"dataAggiudicazione": null,
"urlCommittente": null,
"urlEProcurement": null,
"listaCig": "8678320836-",
"documenti": [
{
"id": 336589,
"numeroPubblicazione": 4,
"nrDoc": 1,
"titolo": "Provvedimento di aggiudicazione relativo al servizio di noleggio full servizio di stampanti multifunzione e monitor multimediali",
"url": "https://bandi-gara.regione.fvg.it/ater-gorizia/avvisi-sui-risultati-delle-procedure-di-affidamento?p_p_id=it_insiel_bandigara_portlet_PortletBandigara_INSTANCE_3IpwnpnVNv1l&p_p_lifecycle=0&p_p_state=normal&p_p_mode=view&_it_insiel_bandigara_portlet_PortletBandigara_INSTANCE_3IpwnpnVNv1l_mvcRenderCommandName=%2Fdettaglio&_it_insiel_bandigara_portlet_PortletBandigara_INSTANCE_3IpwnpnVNv1l_id=11327"
}
],
"aggiudicatari": [
{
"number": 1,
"name": "CENTRO FRIULI SRL CON SOCIO UNICO",
"ruolo": null
}
],
"pubblicazioni": [
{
"codice": 786316,
"data": "24/05/2021",
"tipoInvio": 1
}
],
"idGenerato": 1051377
},
{
"numeroPubblicazione": 5,
"tipoDocumento": 20,
"eventualeSpecificazione": "EDG-SER-8678320836-062021",
"dataPubblicazione": "30/06/2021",
"dataScadenza": "31/12/2026",
"dataDecreto": null,
"dataProvvedimento": null,
"numeroProvvedimento": null,
"dataStipula": null,
"numeroRepertorio": null,
"ribassoAggiudicazione": 44.635350319,
"offertaAumento": null,
"importoAggiudicazione": 70938.0,
"dataAggiudicazione": null,
"urlCommittente": null,
"urlEProcurement": null,
"listaCig": "8678320836-",
"documenti": [
{
"id": 336589,
"numeroPubblicazione": 5,
"nrDoc": 1,
"titolo": "Avviso esito procedura di affidamento del servizio di noleggio full service stampanti multifunzione e monitor multimediali per 60 mesi",
"url": "https://bandi-gara.regione.fvg.it/ater-gorizia/avvisi-sui-risultati-delle-procedure-di-affidamento?p_p_id=it_insiel_bandigara_portlet_PortletBandigara_INSTANCE_3IpwnpnVNv1l&p_p_lifecycle=0&p_p_state=normal&p_p_mode=view&_it_insiel_bandigara_portlet_PortletBandigara_INSTANCE_3IpwnpnVNv1l_mvcRenderCommandName=%2Fdettaglio&_it_insiel_bandigara_portlet_PortletBandigara_INSTANCE_3IpwnpnVNv1l_id=12002"
}
],
"aggiudicatari": [
{
"number": 1,
"name": "CENTRO FRIULI SRL CON SOCIO UNICO",
"ruolo": null
}
],
"pubblicazioni": [
{
"codice": 813248,
"data": "30/06/2021",
"tipoInvio": 1
}
],
"idGenerato": 1088056
}
],
"idGenerato": 1017886
}
</script>
<script>
async function copyText(text) {
try {
await navigator.clipboard.writeText(text);
} catch (_) {
const ta = document.createElement('textarea');
ta.value = text;
ta.style.position = 'fixed';
ta.style.opacity = '0';
document.body.appendChild(ta);
ta.select();
document.execCommand('copy');
document.body.removeChild(ta);
}
}
document.querySelectorAll('button.copy').forEach((btn) => {
btn.addEventListener('click', async () => {
const id = btn.getAttribute('data-copy');
const pre = document.getElementById(id);
if (!pre) return;
const text = pre.innerText.trim();
await copyText(text);
const old = btn.textContent;
btn.textContent = 'Copiato';
setTimeout(() => (btn.textContent = old), 1200);
});
});
function bindFullJson(sourceId, targetId) {
const src = document.getElementById(sourceId);
const dst = document.getElementById(targetId);
if (src && dst) dst.textContent = src.textContent.trim();
}
bindFullJson('bandi-full-json', 'bandi-full-output');
bindFullJson('bandi-detail-json', 'bandi-detail-output');
bindFullJson('avvisi-full-json', 'avvisi-full-output');
bindFullJson('avvisi-detail-json', 'avvisi-detail-output');
bindFullJson('esiti-full-json', 'esiti-full-output');
bindFullJson('esiti-detail-json', 'esiti-detail-output');
bindFullJson('atti-full-json', 'atti-full-output');
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment