API Documentation
Le API di BandiUp ti permettono di accedere a tutti i bandi e le notizie in formato JSON. Sono gratuite, non richiedono autenticazione e sono compatibili con qualsiasi tool di automazione.
Quick Start
Come funziona
- Tutte le API sono REST e rispondono in JSON
- Nessuna autenticazione richiesta (API Key non necessaria)
- CORS abilitato — puoi chiamarle da qualsiasi dominio, browser o tool
- I dati vengono aggiornati in tempo reale automaticamente
- Compatibili con n8n, Make, Zapier, Power Automate, curl, Python, JavaScript e qualsiasi client HTTP
Prova subito. Apri il terminale e copia questo comando:
curl "https://bandiup.it/api/bandi?limit=5"Questo restituisce i primi 5 bandi disponibili in formato JSON.
Base URL
https://bandiup.it/apiTutti gli endpoint iniziano con questo URL base.
Endpoint disponibili
/api/bandi/api/bandi/:id/api/notizie/api/stats/api/contattiGET /api/bandi
Restituisce la lista dei bandi. Puoi filtrare per fonte, categoria, stato, regione, importo e testo libero.
Parametri query
| Parametro | Tipo | Descrizione |
|---|---|---|
q | string | Ricerca testuale nel titolo, descrizione, tags e destinatari |
fonte | string | Filtra per fonte. Valori: "eu", "nazionale", "regionale", "pnrr" |
categoria | string | Filtra per categoria. Valori: "innovazione", "digitalizzazione", "sostenibilita", "agricoltura", "cultura", "formazione", "infrastrutture", "sociale", "ricerca", "pmi", "startup", "altro" |
stato | string | Filtra per stato. Valori: "aperto", "in_scadenza", "prossimo" |
regione | string | Filtra per regione. Es: "Lombardia", "Lazio", "Campania" |
importoMin | number | Importo minimo in euro. Es: 10000 |
importoMax | number | Importo massimo in euro. Es: 500000 |
tipoAgevolazione | string | Tipo agevolazione. Valori: "fondo_perduto", "credito_imposta", "finanziamento_agevolato", "garanzia", "voucher", "appalto", "misto" |
certificazione | string | Certificazione richiesta. Valori: "iso_9001", "iso_14001", "iso_27001", "iso_45001", "soa", "durc", "antimafia", "rating_legalita", "dnsh", "parita_genere" |
page | number | Numero pagina (default: 1) |
limit | number | Risultati per pagina (default: 20, max: 200) |
Esempi
Tutti i bandi europei aperti:
curl "https://bandiup.it/api/bandi?fonte=eu&stato=aperto"Bandi per startup in Lombardia con importo fino a 100K:
curl "https://bandiup.it/api/bandi?categoria=startup®ione=Lombardia&importoMax=100000"Cerca bandi con parola chiave "digitale", pagina 2:
curl "https://bandiup.it/api/bandi?q=digitale&page=2&limit=50"Bandi PNRR in scadenza:
curl "https://bandiup.it/api/bandi?fonte=pnrr&stato=in_scadenza"Risposta
{
"success": true,
"data": [
{
"id": "eu-HORIZON-2025-001",
"titolo": "Horizon Europe - Cluster 4 Digital",
"descrizione": "Bando per progetti di ricerca...",
"descrizioneBreve": "Bando Horizon Europe...",
"fonte": "eu",
"fonteNome": "Commissione Europea",
"fonteUrl": "https://ec.europa.eu",
"categoria": "ricerca",
"importoMin": 500000,
"importoMax": 3000000,
"dataApertura": "2025-01-15",
"dataScadenza": "2026-06-30",
"stato": "aperto",
"destinatari": ["Universita", "Enti di ricerca", "PMI"],
"regione": null,
"tipoAgevolazione": "fondo_perduto",
"certificazioni": ["durc", "dnsh"],
"tags": ["horizon", "ricerca", "digitale"],
"urlBando": "https://ec.europa.eu/...",
"ultimoAggiornamento": "2026-03-27T10:00:00.000Z"
}
],
"pagination": {
"page": 1,
"limit": 20,
"totale": 1309,
"pagine": 66
},
"fonti": [
"Commissione Europea",
"TED - Tenders Electronic Daily",
"Ministeri e Agenzie Nazionali",
"Incentivi.gov.it",
"Regioni Italiane",
"MePA / Consip"
],
"ultimoAggiornamento": "2026-03-27T10:00:00.000Z"
}GET /api/bandi/:id
Restituisce i dettagli completi di un singolo bando. L'ID lo trovi nel campo id della lista bandi.
curl "https://bandiup.it/api/bandi/eu-HORIZON-2025-001"Risposta
{
"success": true,
"data": {
"id": "eu-HORIZON-2025-001",
"titolo": "Horizon Europe - Cluster 4 Digital",
"descrizione": "...",
...tutti i campi del bando
}
}Errore 404:Se il bando non esiste, la risposta sarà{"success": false, "error": "Bando non trovato"}
GET /api/notizie
Restituisce le ultime notizie su finanziamenti e incentivi da fonti istituzionali italiane.
Parametri query
| Parametro | Tipo | Descrizione |
|---|---|---|
q | string | Ricerca testuale |
fonte | string | Valori: "mimit", "mise", "pnrr", "regionale" |
categoria | string | Stesse categorie dei bandi |
regione | string | Es: "Lombardia", "Campania" |
page | number | Numero pagina (default: 1) |
limit | number | Risultati per pagina (default: 20, max: 200) |
# Ultime notizie PNRR
curl "https://bandiup.it/api/notizie?fonte=pnrr&limit=10"
# Notizie regionali della Lombardia
curl "https://bandiup.it/api/notizie?fonte=regionale®ione=Lombardia"
# Cerca "digitalizzazione"
curl "https://bandiup.it/api/notizie?q=digitalizzazione"Risposta
{
"success": true,
"data": [
{
"id": "news-pnrr-horizon-europe-001",
"titolo": "PNRR: nuovi fondi per la digitalizzazione delle PMI",
"descrizione": "Il MIMIT ha stanziato 500 milioni...",
"descrizioneBreve": "Il MIMIT ha stanziato 500 milioni...",
"fonte": "pnrr",
"fonteNome": "PNRR - Amministrazioni",
"fonteUrl": "https://www.italiadomani.gov.it",
"categoria": "digitalizzazione",
"dataPubblicazione": "2026-03-25",
"tags": ["PNRR", "digitale", "PMI", "finanziamento", "MIMIT"],
"url": "https://www.italiadomani.gov.it/...",
"regione": null
}
],
"pagination": {
"page": 1,
"limit": 20,
"totale": 256,
"pagine": 13
},
"fonti": ["MIMIT", "PNRR - Amministrazioni", ...]
}GET /api/stats
Restituisce le statistiche aggregate: totale bandi, suddivisione per fonte, stato e categoria.
curl "https://bandiup.it/api/stats"Risposta
{
"success": true,
"data": {
"bandi": {
"totale": 1309,
"perFonte": {
"eu": 434,
"nazionale": 804,
"regionale": 18,
"pnrr": 53
},
"perStato": {
"aperto": 1135,
"in_scadenza": 87,
"prossimo": 75
},
"perCategoria": {
"digitalizzazione": 120,
"pmi": 340,
"innovazione": 89,
...
}
},
"notizie": {
"totale": 256
},
"fonti": ["Commissione Europea", "TED", ...],
"ultimoAggiornamento": "2026-03-27T10:00:00.000Z"
}
}POST /api/contatti
Invia un messaggio di contatto. Il body deve essere JSON con i campi obbligatori.
Body (JSON)
| Campo | Tipo | Descrizione |
|---|---|---|
nome* | string | Nome del mittente |
email* | string | Email valida del mittente |
oggetto | string | Oggetto del messaggio (opzionale) |
messaggio* | string | Testo del messaggio (max 5000 caratteri) |
curl -X POST "https://bandiup.it/api/contatti" \
-H "Content-Type: application/json" \
-d '{
"nome": "Mario Rossi",
"email": "mario@esempio.it",
"oggetto": "Richiesta informazioni API",
"messaggio": "Vorrei sapere di più sulle API..."
}'Risposta
{
"success": true,
"message": "Messaggio ricevuto. Ti risponderemo il prima possibile."
}Esempi di integrazione
Le API funzionano con qualsiasi linguaggio o piattaforma. Ecco come usarle nei tool più comuni.
JavaScript / TypeScript
// Tutti i bandi europei aperti
const response = await fetch(
"https://bandiup.it/api/bandi?fonte=eu&stato=aperto"
);
const { data, pagination } = await response.json();
console.log(`Trovati ${pagination.totale} bandi EU aperti`);
for (const bando of data) {
console.log(`- ${bando.titolo}`);
console.log(` Scadenza: ${bando.dataScadenza}`);
console.log(` Importo: ${bando.importoMax}€`);
console.log(` Link: ${bando.urlBando}`);
}Python
import requests
# Bandi per startup con importo max 50K
response = requests.get(
"https://bandiup.it/api/bandi",
params={
"categoria": "startup",
"importoMax": 50000,
"stato": "aperto",
"limit": 100
}
)
data = response.json()
print(f"Trovati {data['pagination']['totale']} bandi")
for bando in data["data"]:
print(f"- {bando['titolo']}")
print(f" Fonte: {bando['fonteNome']}")
print(f" Scadenza: {bando.get('dataScadenza', 'N/D')}")
print()
# Esporta in CSV
import csv
with open("bandi_startup.csv", "w", newline="") as f:
writer = csv.writer(f)
writer.writerow(["Titolo", "Fonte", "Scadenza", "Importo Max", "URL"])
for b in data["data"]:
writer.writerow([
b["titolo"],
b["fonteNome"],
b.get("dataScadenza", ""),
b.get("importoMax", ""),
b["urlBando"]
])n8n
n8nè un tool di automazione open source. Ecco come creare un workflow che ti avvisa dei nuovi bandi.
Workflow 1: Notifica nuovi bandi via email
Nodo: HTTP Request
Method: GET
URL: https://bandiup.it/api/bandi
Query Parameters:
stato = in_scadenza
limit = 10
Nodo successivo: IF
Condizione: {{ $json.pagination.totale > 0 }}
Nodo successivo: Email (Gmail/SMTP)
Oggetto: "🔔 {{ $json.pagination.totale }} bandi in scadenza!"
Corpo:
{{ $json.data.map(b =>
b.titolo + " - Scadenza: " + b.dataScadenza + "\n" + b.urlBando
).join("\n\n") }}Workflow 2: Salva bandi in Google Sheets
Nodo 1: Schedule Trigger
Ogni: 6 ore
Nodo 2: HTTP Request
Method: GET
URL: https://bandiup.it/api/bandi
Query Parameters:
stato = aperto
limit = 200
Nodo 3: Split In Batches
Input: {{ $json.data }}
Nodo 4: Google Sheets (Append Row)
Foglio: "Bandi"
Colonne:
A (ID): {{ $json.id }}
B (Titolo): {{ $json.titolo }}
C (Fonte): {{ $json.fonteNome }}
D (Categoria): {{ $json.categoria }}
E (Scadenza): {{ $json.dataScadenza }}
F (Importo Max): {{ $json.importoMax }}
G (Stato): {{ $json.stato }}
H (URL): {{ $json.urlBando }}Workflow 3: Filtra e invia su Slack/Telegram
Nodo 1: Schedule Trigger
Ogni: 1 giorno (mattina)
Nodo 2: HTTP Request
Method: GET
URL: https://bandiup.it/api/bandi
Query Parameters:
categoria = digitalizzazione
stato = aperto
regione = Lombardia
Nodo 3: IF
Condizione: {{ $json.pagination.totale > 0 }}
Nodo 4: Slack / Telegram
Messaggio:
"📋 *{{ $json.pagination.totale }} bandi digitalizzazione in Lombardia*\n\n"
+ {{ $json.data.slice(0, 5).map(b =>
"• *" + b.titolo.substring(0, 80) + "*\n"
+ " Scadenza: " + (b.dataScadenza || "N/D") + "\n"
+ " " + b.urlBando
).join("\n\n") }}Make (ex Integromat)
Modulo: HTTP - Make a request
URL: https://bandiup.it/api/bandi
Method: GET
Query string:
fonte = nazionale
stato = aperto
limit = 50
Modulo successivo: Iterator
Array: {{body.data}}
Modulo successivo: Google Sheets - Add a Row
Valori:
Titolo: {{item.titolo}}
Fonte: {{item.fonteNome}}
Scadenza: {{item.dataScadenza}}
URL: {{item.urlBando}}Zapier
Trigger: Schedule by Zapier
Frequenza: Ogni giorno
Action 1: Webhooks by Zapier (GET)
URL: https://bandiup.it/api/bandi?stato=in_scadenza&limit=5
Action 2: Filter by Zapier
Condizione: pagination__totale > 0
Action 3: Gmail - Send Email
To: tuaemail@esempio.com
Subject: Bandi in scadenza ({{pagination__totale}})
Body: {{data}}Power Automate (Microsoft)
Trigger: Ricorrenza
Frequenza: Giorno
Intervallo: 1
Azione: HTTP
Metodo: GET
URI: https://bandiup.it/api/bandi?stato=aperto&categoria=pmi&limit=20
Azione: Parse JSON
Contenuto: @body('HTTP')
Schema: (incolla la risposta di esempio)
Azione: Applica a ogni elemento -> @body('Parse_JSON')?['data']
Azione interna: Invia un messaggio di posta elettronica (V2)
A: tuaemail@outlook.com
Oggetto: Nuovo bando - @items('Applica_a_ogni_elemento')?['titolo']
Corpo: @items('Applica_a_ogni_elemento')?['descrizioneBreve']Google Apps Script
function importaBandi() {
const url = "https://bandiup.it/api/bandi?stato=aperto&limit=200";
const response = UrlFetchApp.fetch(url);
const json = JSON.parse(response.getContentText());
const sheet = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName("Bandi") || SpreadsheetApp.getActiveSpreadsheet()
.insertSheet("Bandi");
// Header
sheet.clear();
sheet.appendRow([
"Titolo", "Fonte", "Categoria", "Stato",
"Scadenza", "Importo Max", "Regione", "URL"
]);
// Dati
for (const b of json.data) {
sheet.appendRow([
b.titolo,
b.fonteNome,
b.categoria,
b.stato,
b.dataScadenza || "",
b.importoMax || "",
b.regione || "",
b.urlBando
]);
}
Logger.log("Importati " + json.data.length + " bandi");
}
// Imposta un trigger per eseguirlo ogni giorno:
// Edit > Current project's triggers > Add Trigger
// Function: importaBandi, Time-driven: Day timercURL avanzato
# Tutti i bandi aperti, salva in file JSON
curl -s "https://bandiup.it/api/bandi?stato=aperto&limit=200" \
| python3 -m json.tool > bandi_aperti.json
# Solo i titoli dei bandi EU
curl -s "https://bandiup.it/api/bandi?fonte=eu" \
| python3 -c "
import json, sys
data = json.load(sys.stdin)
for b in data['data']:
print(f"- {b['titolo']} (scade: {b.get('dataScadenza', 'N/D')})")"
# Statistiche rapide
curl -s "https://bandiup.it/api/stats" | python3 -m json.tool
# Controlla se ci sono bandi in scadenza (utile per cron jobs)
BANDI=$(curl -s "https://bandiup.it/api/bandi?stato=in_scadenza" \
| python3 -c "import json,sys; print(json.load(sys.stdin)['pagination']['totale'])")
if [ "$BANDI" -gt 0 ]; then
echo "⚠️ $BANDI bandi in scadenza!"
fiBest practices
Cache i risultati
I dati vengono aggiornati in tempo reale. Imposta i tuoi workflow per eseguire ogni 1-6 ore per un buon compromesso tra aggiornamento e performance.
Usa la paginazione
Se hai bisogno di tutti i bandi, usa limit=200 e incrementa il parametro page fino a coprire tutte le pagine indicate inpagination.pagine.
Filtra lato server
Usa i parametri query per filtrare i risultati. È più veloce e usa meno banda rispetto a scaricare tutto e filtrare lato client.
Gestisci gli errori
Controlla sempre il campo successnella risposta. In caso di errore sarà false con un campoerror che descrive il problema.
Riferimento campi
Oggetto Bando
| Campo | Tipo | Descrizione |
|---|---|---|
id | string | Identificativo univoco del bando |
titolo | string | Titolo del bando (max 250 caratteri) |
descrizione | string | Descrizione completa |
descrizioneBreve | string | Descrizione breve (max 200 caratteri) |
fonte | string | "eu" | "nazionale" | "regionale" | "pnrr" |
fonteNome | string | Nome leggibile della fonte (es. "Commissione Europea") |
fonteUrl | string | URL del sito della fonte |
categoria | string | Categoria tematica del bando |
importoMin | number | null | Importo minimo in euro |
importoMax | number | null | Importo massimo in euro |
dataApertura | string | null | Data apertura (formato YYYY-MM-DD) |
dataScadenza | string | null | Data scadenza (formato YYYY-MM-DD) |
stato | string | "aperto" | "in_scadenza" | "prossimo" |
destinatari | string[] | Lista destinatari (es. ["PMI", "Startup"]) |
regione | string | null | Regione (solo per bandi regionali) |
tipoAgevolazione | string | null | "fondo_perduto" | "credito_imposta" | "finanziamento_agevolato" | "garanzia" | "voucher" | "appalto" | "misto" |
certificazioni | string[] | Certificazioni richieste (es. ["durc", "iso_14001"]) |
tags | string[] | Tag tematici |
urlBando | string | Link diretto al bando ufficiale |
ultimoAggiornamento | string | Data ultimo aggiornamento (ISO 8601) |
Oggetto Notizia
| Campo | Tipo | Descrizione |
|---|---|---|
id | string | Identificativo univoco |
titolo | string | Titolo della notizia |
descrizione | string | Testo completo |
descrizioneBreve | string | Anteprima (max 200 caratteri) |
fonte | string | "mimit" | "mise" | "pnrr" | "regionale" |
fonteNome | string | Nome della fonte |
categoria | string | Categoria tematica |
dataPubblicazione | string | null | Data pubblicazione (YYYY-MM-DD) |
tags | string[] | Tag tematici auto-generati (es. "PNRR", "green", "fondo perduto", "PMI", "Lombardia") |
url | string | Link alla notizia originale |
regione | string | null | Regione (se regionale) |
Accesso per AI e Crawler
Le API di BandiUp sono progettate per essere facilmente accessibili da crawler AI e agenti automatici. Le risposte JSON sono strutturate e autodescrittive. Il CORS è aperto e non serve autenticazione.
Per ottenere una panoramica completa in una singola chiamata, usa l'endpoint/api/stats. Per scaricare tutti i dati, usa/api/bandi?limit=200 e pagina con&page=2, &page=3, ecc.
Hai bisogno di aiuto?
Prova subito le API nel browser. Basta cliccare uno dei link qui sotto per vedere la risposta JSON.
