← Torna alla home

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
curl "https://bandiup.it/api/bandi?limit=5"

Questo restituisce i primi 5 bandi disponibili in formato JSON.

Base URL

https://bandiup.it/api

Tutti gli endpoint iniziano con questo URL base.

Endpoint disponibili

GET/api/bandi
GET/api/bandi/:id
GET/api/notizie
GET/api/stats
POST/api/contatti

GET /api/bandi

Restituisce la lista dei bandi. Puoi filtrare per fonte, categoria, stato, regione, importo e testo libero.

Parametri query

ParametroTipoDescrizione
qstringRicerca testuale nel titolo, descrizione, tags e destinatari
fontestringFiltra per fonte. Valori: "eu", "nazionale", "regionale", "pnrr"
categoriastringFiltra per categoria. Valori: "innovazione", "digitalizzazione", "sostenibilita", "agricoltura", "cultura", "formazione", "infrastrutture", "sociale", "ricerca", "pmi", "startup", "altro"
statostringFiltra per stato. Valori: "aperto", "in_scadenza", "prossimo"
regionestringFiltra per regione. Es: "Lombardia", "Lazio", "Campania"
importoMinnumberImporto minimo in euro. Es: 10000
importoMaxnumberImporto massimo in euro. Es: 500000
tipoAgevolazionestringTipo agevolazione. Valori: "fondo_perduto", "credito_imposta", "finanziamento_agevolato", "garanzia", "voucher", "appalto", "misto"
certificazionestringCertificazione richiesta. Valori: "iso_9001", "iso_14001", "iso_27001", "iso_45001", "soa", "durc", "antimafia", "rating_legalita", "dnsh", "parita_genere"
pagenumberNumero pagina (default: 1)
limitnumberRisultati per pagina (default: 20, max: 200)

Esempi

Tutti i bandi europei aperti:

curl
curl "https://bandiup.it/api/bandi?fonte=eu&stato=aperto"

Bandi per startup in Lombardia con importo fino a 100K:

curl
curl "https://bandiup.it/api/bandi?categoria=startup&regione=Lombardia&importoMax=100000"

Cerca bandi con parola chiave "digitale", pagina 2:

curl
curl "https://bandiup.it/api/bandi?q=digitale&page=2&limit=50"

Bandi PNRR in scadenza:

curl
curl "https://bandiup.it/api/bandi?fonte=pnrr&stato=in_scadenza"

Risposta

JSON Response
{
  "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
curl "https://bandiup.it/api/bandi/eu-HORIZON-2025-001"

Risposta

JSON Response
{
  "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

ParametroTipoDescrizione
qstringRicerca testuale
fontestringValori: "mimit", "mise", "pnrr", "regionale"
categoriastringStesse categorie dei bandi
regionestringEs: "Lombardia", "Campania"
pagenumberNumero pagina (default: 1)
limitnumberRisultati per pagina (default: 20, max: 200)
curl
# 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&regione=Lombardia"

# Cerca "digitalizzazione"
curl "https://bandiup.it/api/notizie?q=digitalizzazione"

Risposta

JSON Response
{
  "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
curl "https://bandiup.it/api/stats"

Risposta

JSON Response
{
  "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)

CampoTipoDescrizione
nome*stringNome del mittente
email*stringEmail valida del mittente
oggettostringOggetto del messaggio (opzionale)
messaggio*stringTesto del messaggio (max 5000 caratteri)
curl
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

JSON Response
{
  "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

JavaScript (fetch)
// 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

Python (requests)
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

n8n - Configurazione nodo HTTP Request
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

n8n - Configurazione
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

n8n - Configurazione
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)

Make - Configurazione modulo HTTP
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

Zapier - Configurazione
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)

Power Automate - Configurazione
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

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 timer

cURL avanzato

Bash / Terminal
# 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!"
fi

Best 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

CampoTipoDescrizione
idstringIdentificativo univoco del bando
titolostringTitolo del bando (max 250 caratteri)
descrizionestringDescrizione completa
descrizioneBrevestringDescrizione breve (max 200 caratteri)
fontestring"eu" | "nazionale" | "regionale" | "pnrr"
fonteNomestringNome leggibile della fonte (es. "Commissione Europea")
fonteUrlstringURL del sito della fonte
categoriastringCategoria tematica del bando
importoMinnumber | nullImporto minimo in euro
importoMaxnumber | nullImporto massimo in euro
dataAperturastring | nullData apertura (formato YYYY-MM-DD)
dataScadenzastring | nullData scadenza (formato YYYY-MM-DD)
statostring"aperto" | "in_scadenza" | "prossimo"
destinataristring[]Lista destinatari (es. ["PMI", "Startup"])
regionestring | nullRegione (solo per bandi regionali)
tipoAgevolazionestring | null"fondo_perduto" | "credito_imposta" | "finanziamento_agevolato" | "garanzia" | "voucher" | "appalto" | "misto"
certificazionistring[]Certificazioni richieste (es. ["durc", "iso_14001"])
tagsstring[]Tag tematici
urlBandostringLink diretto al bando ufficiale
ultimoAggiornamentostringData ultimo aggiornamento (ISO 8601)

Oggetto Notizia

CampoTipoDescrizione
idstringIdentificativo univoco
titolostringTitolo della notizia
descrizionestringTesto completo
descrizioneBrevestringAnteprima (max 200 caratteri)
fontestring"mimit" | "mise" | "pnrr" | "regionale"
fonteNomestringNome della fonte
categoriastringCategoria tematica
dataPubblicazionestring | nullData pubblicazione (YYYY-MM-DD)
tagsstring[]Tag tematici auto-generati (es. "PNRR", "green", "fondo perduto", "PMI", "Lombardia")
urlstringLink alla notizia originale
regionestring | nullRegione (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.