Skip to content

Riferimento API ​

La Piattaforma NIS2 espone un'API REST all'indirizzo http://localhost:8000. Tutte le rotte sono precedute dal prefisso /api/v1/. La documentazione interattiva OpenAPI è disponibile in /docs (Swagger UI) e /redoc (ReDoc).

Tutti gli endpoint restituiscono JSON. Due modalità di autenticazione sono accettate su ogni rotta protetta:

  • Sessione con Cookie (web) — Cookie access_token httpOnly impostato da /auth/login o /auth/register. Le richieste che modificano lo stato devono inviare nuovamente il cookie csrf_token tramite l'header X-CSRF-Token (pattern double-submit).
  • Token Bearer (SDK / CLI) — Header Authorization: Bearer <jwt>. I token emessi da /auth/login sono validi; in questa modalità può essere utilizzato lo stesso access token del cookie.

Gli endpoint di sola lettura sotto scansioni / findings / asset accettano inoltre una Chiave API a lunga scadenza nel formato Authorization: Bearer nis2_… (nessun cookie richiesto). Le chiavi vengono emesse tramite POST /api/v1/api-keys (solo admin) e il valore grezzo viene mostrato una sola volta. Gli endpoint di mutazione (POST / PATCH / DELETE) su tali risorse richiedono comunque una sessione: le colonne di audit log e created_by necessitano infatti di un'identità utente a cui attribuire la modifica.

Autenticazione ​

MetodoPercorsoDescrizioneAuth
POST/api/v1/auth/registerRegistra un nuovo utente e crea un'organizzazione. Restituisce token di accesso e di aggiornamento (impostati anche come cookie httpOnly per il client web)No
POST/api/v1/auth/loginOttiene i token di accesso e di aggiornamentoNo
POST/api/v1/auth/refreshRuota il token di accesso utilizzando il cookie del token di aggiornamento. I refresh token sono monouso (jti tracciato in revoked_tokens); il riutilizzo di uno di essi revoca l'intera famigliaNo
POST/api/v1/auth/logoutPulisce i cookie e revoca il token di aggiornamentoSì
GET/api/v1/auth/meOttiene il profilo dell'utente correnteSì
PATCH/api/v1/auth/meAggiorna il profilo dell'utente corrente (nome / locale / avatar). Non accetta current_password / new_password — vedi /auth/change-passwordSì
POST/api/v1/auth/change-passwordCambia la password dell'utente. Verifica current_password, esegue l'hash di new_password, marca la data in password_changed_at (invalidando alla prima richiesta tutte le altre sessioni attive) e riemette i cookie per questa sessione. Rate limit: 5/min/IPSì
POST/api/v1/auth/forgot-passwordAvvia il flusso di ripristino via email. Restituisce sempre 204 a prescindere dall'esistenza dell'email, in modo da non permettere l'enumerazione degli utenti. Rate limit: 5/min/IPNo
POST/api/v1/auth/reset-passwordCompleta il flusso di ripristino con un token monouso (inviato out-of-band via email) e una nuova password. I token sono sottoposti ad hash sha256 a riposo, scadono dopo RESET_TOKEN_TTL_MINUTES (default 30) e un singolo 400 copre gli stati {sconosciuto, scaduto, usato} — impedendo attacchi oracolo. Rate limit: 10/min/IPNo
POST/api/v1/auth/switch-orgCambia l'organizzazione attiva per la sessione corrente. Body: {"organization_id": "<uuid>"}. Valida che il chiamante sia membro dell'organizzazione target (altrimenti 403), dopodiché emette nuovi token access / refresh / csrf con il claim org_id aggiornato e ruota i cookie. Restituisce TokenResponse (stessa struttura di /login). Rate limit: 10/min/IPSì
POST/api/v1/auth/accept-inviteAttiva l'account di un utente invitato impostandone la password. Il token dell'invito è monousoNo
GET/api/v1/auth/me/exportEsportazione GDPR Art. 15: tutto ciò che è conservato sull'utente chiamante, in JSONSì
DELETE/api/v1/auth/meCancellazione GDPR Art. 17 dell'account dell'utente chiamanteSì
POST/api/v1/auth/totp/setupAvvia la registrazione TOTP/MFA. Restituisce l'URI di provisioning; il seed è cifrato a riposo con DATA_ENCRYPTION_KEYSì
POST/api/v1/auth/totp/verifyConferma la registrazione (o una sfida di login) con un codice a 6 cifreSì
POST/api/v1/auth/totp/disableDisattiva TOTP/MFA per l'utente chiamanteSì

Scansioni ​

Legenda colonna Auth: Sessione = cookie o Bearer <jwt>. Chiave API = ammesso anche Bearer nis2_… (cookie non richiesto).

MetodoPercorsoDescrizioneAuth
GET/api/v1/scansElenca le scansioni per l'organizzazione corrente. Filtrabile tramite status. ImpaginatoSessione o Chiave API
POST/api/v1/scansCrea e accoda una nuova scansioneSessione
GET/api/v1/scans/{scan_id}Ottiene i dettagli e lo stato della scansioneSessione o Chiave API
DELETE/api/v1/scans/{scan_id}Elimina una scansione e i relativi finding (solo admin)Sessione
GET/api/v1/scans/{scan_id}/resultsElenca i risultati grezzi di una scansione. ImpaginatoSessione o Chiave API
GET/api/v1/scans/{scan_id}/findingsElenca i finding di una scansione. ImpaginatoSessione o Chiave API
POST/api/v1/scans/{scan_id}/cancelAnnulla una scansione in coda o in esecuzioneSessione
GET/api/v1/scans/{scan_id}/compare/{other_id}Confronta due scansioni: scarto del punteggio, finding nuovi/risolti/persistentiSessione o Chiave API

Risultati (Findings) ​

MetodoPercorsoDescrizioneAuth
GET/api/v1/findingsElenca tutti i finding. Filtrabile per severity, status, category. ImpaginatoSessione o Chiave API
GET/api/v1/findings/statsOttiene il conteggio dei finding raggruppati per gravità e statoSessione o Chiave API
GET/api/v1/findings/{finding_id}Ottiene i dettagli del findingSessione o Chiave API
PATCH/api/v1/findings/{finding_id}Aggiorna lo stato del finding o la nota di risoluzioneSessione
POST/api/v1/findings/bulk-updateAggiornamento in massa (bulk) dello stato per più findingSessione

Asset ​

MetodoPercorsoDescrizioneAuth
GET/api/v1/assetsElenca gli asset dell'organizzazione corrente. ImpaginatoSessione o Chiave API
POST/api/v1/assetsCrea un nuovo assetSessione
GET/api/v1/assets/{asset_id}Ottiene i dettagli dell'assetSessione o Chiave API
PATCH/api/v1/assets/{asset_id}Aggiorna un assetSessione
DELETE/api/v1/assets/{asset_id}Elimina un assetSessione
POST/api/v1/assets/importImporta asset da un file CSVSessione
POST/api/v1/assets/{asset_id}/verification/startEmette una sfida DNS TXT che prova il controllo di un dominio. Restituisce nome e valore del record da pubblicareAdmin/Auditor
POST/api/v1/assets/{asset_id}/verification/checkCerca il record della sfida e, se lo trova, marca l'asset come verifiedAdmin/Auditor
POST/api/v1/assets/{asset_id}/attestPer indirizzi IP e intervalli CIDR, che non hanno un DNS con cui provare nulla: una dichiarazione di autorità nominativa e datata, registrata nell'audit log. Rifiutata per i domini, che hanno evidenze disponibiliAdmin

Pianificazioni (Schedules) ​

MetodoPercorsoDescrizioneAuth
GET/api/v1/schedulesElenca le pianificazioni di scansioneSì
POST/api/v1/schedulesCrea una pianificazione (espressione cron). Solo admin o auditorSì
PATCH/api/v1/schedules/{schedule_id}Aggiorna una pianificazioneSì
DELETE/api/v1/schedules/{schedule_id}Elimina una pianificazioneSì
POST/api/v1/schedules/{schedule_id}/runAttiva immediatamente un'esecuzione manuale della pianificazioneSì

Report ​

MetodoPercorsoDescrizioneAuth
POST/api/v1/reports/generateAccoda la generazione del report. Parametri: scan_id, format (pdf, html, markdown, json, csv, junit). Restituisce un task_id. Deduplicazione: richieste identiche entro 5 min restituiscono il task_id esistente con deduplicated: true. Rate limit 5/min/IP. Il report è renderizzato nella lingua dell'utenteSì
GET/api/v1/reports/status/{task_id}Controlla lo stato della generazione del report tramite ID del task CelerySì
GET/api/v1/reports/download/{task_id}Scarica un report generatoSì

Organizzazioni ​

MetodoPercorsoDescrizioneAuth
GET/api/v1/organizationsElenca le organizzazioni a cui appartiene l'utente correnteSì
POST/api/v1/organizationsCrea una nuova organizzazioneSì
GET/api/v1/organizations/{org_id}Ottiene i dettagli dell'organizzazioneSì
PATCH/api/v1/organizations/{org_id}Aggiorna le impostazioni dell'organizzazione (solo admin)Sì
GET/api/v1/organizations/{org_id}/membersElenca i membri dell'organizzazioneSì
POST/api/v1/organizations/{org_id}/membersInvita un membro tramite email (solo admin)Sì
PATCH/api/v1/organizations/{org_id}/members/{member_id}Aggiorna il ruolo di un membro (solo admin)Sì
DELETE/api/v1/organizations/{org_id}/members/{member_id}Rimuove un membro (solo admin). Non può rimuovere l'ultimo adminSì

Integrità (Health) ​

MetodoPercorsoDescrizioneAuth
GET/api/v1/healthControllo di liveness. Restituisce {"status": "ok"}No
GET/api/v1/health/readyControllo di readiness. Testa la connettività al database e RedisNo
GET/api/v1/health/liveAlias esplicito di liveness, per la convenzione di denominazione k8sNo

Certificati ​

MetodoPercorsoDescrizioneAuth
POST/api/v1/certificates/checkAnalisi profonda dei certificati per un singolo dominio. Restituisce catena, OCSP, log CT, forza della chiave, punteggio da 0-100Sì
POST/api/v1/certificates/bulk-checkAnalizza fino a 50 domini in blocco con statistiche riepilogativeSì
GET/api/v1/certificates/ct-logs/{domain}Interroga i registri di Certificate Transparency via crt.shSì

Remediation ​

MetodoPercorsoDescrizioneAuth
GET/api/v1/remediation/playbooksElenca tutti i playbook di remediation disponibiliNo
GET/api/v1/remediation/playbooks/{id}Ottiene l'intero playbook con step, config e stime dell'effortNo
GET/api/v1/remediation/for-finding/{finding_id}Assegna automaticamente il playbook migliore per uno specifico findingSì
GET/api/v1/remediation/estimate/{scan_id}Calcola l'effort e il costo totale della remediation per l'intera scansioneSì
POST/api/v1/remediation/explain/{finding_id}Spiegazione potenziata dall'AI del finding. Prova prima il LLM locale, poi OpenAI, infine ricade sui playbookSì

Incidenti ​

MetodoPercorsoDescrizioneAuth
GET/api/v1/incidents/taxonomyTassonomia degli incidenti NIS2 (tipi, gravità, stati): il vocabolario condiviso da form ed esportazione ACNSì
POST/api/v1/incidentsSegnala un incidente (Tassonomia Art. 23 CSIRT)Sì
GET/api/v1/incidentsElenca gli incidenti dell'organizzazioneSì
GET/api/v1/incidents/{id}Dettagli di un incidenteSì
PATCH/api/v1/incidents/{id}Aggiorna i dettagli o lo stato dell'incidenteSì
DELETE/api/v1/incidents/{id}Elimina un incidenteAdmin
POST/api/v1/incidents/{id}/exportProduce il pacchetto di notifica ACN/CSIRT per l'incidenteAdmin/Auditor
GET/api/v1/incident-monitorMonitor delle scadenze Art. 23: incidenti con i conti alla rovescia 24h/72h/1 mese calcolati dal server (seconds_remaining / breached)Sì
GET/api/v1/incident-monitor/{id}Singolo incidente con lo stato calcolato delle sue scadenze Art. 23Sì
POST/api/v1/incident-monitorAvvia l'orologio Art. 23 su un incidente: registra il momento di rilevazione da cui decorrono le scadenze 24h / 72h / 1 meseSì
PATCH/api/v1/incident-monitor/{id}Aggiorna l'incidente monitoratoAdmin/Auditor
DELETE/api/v1/incident-monitor/{id}Interrompe il monitoraggio dell'incidenteAdmin
POST/api/v1/incident-monitor/{id}/submissionsRegistra l'avvenuto invio di una notifica. L'Art. 23(4)(d) àncora la relazione finale alla notifica, non alla rilevazione: è questo a rendere corretta l'ultima scadenzaAdmin/Auditor

Governance ​

MetodoPercorsoDescrizioneAuth
GET/api/v1/governanceOttiene i 30 elementi della checklist NIS2 Art. 21 con stati e statisticheSì
PATCH/api/v1/governance/{item_id}Aggiorna una voce della checklist (stato / responsabile / evidenza)Sì
POST/api/v1/governance/seedPopola la checklist dal template di governanceSì
GET/api/v1/governance/scorePunteggio di conformità pesato (CRITICAL×3 / HIGH×2 / MEDIUM×1)Sì
POST/api/v1/governance/sync-riskIl ponte scanner→conformità: importa i finding aperti come evidenza ed eleva le voci della checklist interessateSì
GET/api/v1/governance/risk-summarySegnali di rischio per sotto-paragrafo, derivati dai finding apertiSì
POST/api/v1/governance/bulk-updateAggiorna più voci della checklist in una sola richiestaSì
GET/api/v1/governance/subparagraphsCatalogo dei sotto-paragrafi dell'Art. 21(2) riconosciutiSì
GET/api/v1/governance/by-subparagraphVoci della checklist raggruppate per sotto-paragrafo dell'Art. 21(2)Sì

Chiavi API ​

MetodoPercorsoDescrizioneAuth
GET/api/v1/api-keysElenca le chiavi API dell'organizzazione (admin o auditor)Sì
POST/api/v1/api-keysCrea una nuova chiave API (solo admin). Il token grezzo è mostrato solo una voltaSì
DELETE/api/v1/api-keys/{key_id}Revoca una chiave API (solo admin)Sì

Canali di Notifica ​

MetodoPercorsoDescrizioneAuth
GET/api/v1/notification-channelsElenca i canali dell'organizzazione. Le credenziali non vengono mai restituiteSì
POST/api/v1/notification-channelsCrea un canale (email / webhook / Slack). La credenziale è cifrata a riposo con DATA_ENCRYPTION_KEYAdmin
PATCH/api/v1/notification-channels/{channel_id}Aggiorna un canaleAdmin
DELETE/api/v1/notification-channels/{channel_id}Elimina un canaleAdmin
POST/api/v1/notification-channels/{channel_id}/testInvia una notifica di prova attraverso il canaleAdmin

Audit Log ​

MetodoPercorsoDescrizioneAuth
GET/api/v1/audit-logsElenca le voci di audit per l'organizzazione. Filtrabile. ImpaginatoSì

Fornitori (Art. 18 Supply Chain) ​

MetodoPercorsoDescrizioneAuth
GET/api/v1/vendorsElenca i fornitori dell'organizzazione, ordinati per criticitàSì
POST/api/v1/vendorsRegistra un nuovo fornitore/supplierSì
GET/api/v1/vendors/statsPanoramica del rischio della supply chainSì
GET/api/v1/vendors/{vendor_id}Dettagli del fornitoreSì
GET/api/v1/vendors/{vendor_id}/scorePunteggio di rischio della catena di fornitura per un singolo fornitore, con i fattori che lo compongonoSì
POST/api/v1/vendors/{vendor_id}/score/applySalva il punteggio calcolato sulla scheda del fornitoreAdmin/Auditor
PATCH/api/v1/vendors/{vendor_id}Aggiorna dettagli, stato o assessment di sicurezzaSì
DELETE/api/v1/vendors/{vendor_id}Rimuove un fornitoreSì
GET/api/v1/vendors/score-formulaLa formula di punteggio del rischio fornitori applicata dalla piattaforma, pubblicata perché un punteggio possa essere verificato a manoSì

Analisi di Impatto Aziendale (BIA) ​

MetodoPercorsoDescrizioneAuth
GET/api/v1/biaElenca i processi aziendali dell'organizzazioneSì
POST/api/v1/biaRegistra un processo aziendale per la BIASì
GET/api/v1/bia/matrixMatrice d'impatto BIASì
GET/api/v1/bia/{process_id}Dettagli del processo aziendaleSì
PATCH/api/v1/bia/{process_id}Aggiorna un processo aziendale (RTO / RPO / criticità / dipendenze)Sì
DELETE/api/v1/bia/{process_id}Rimuove un processo aziendaleSì

Esportazione ACN (Italia) ​

MetodoPercorsoDescrizioneAuth
GET/api/v1/acn-export/art18Esporta l'inventario dei fornitori (Art. 18) in JSON compatibile ACNSì
GET/api/v1/acn-export/biaEsporta i dati BIA in JSON compatibile ACNSì

Scadenze di Conformità ​

MetodoPercorsoDescrizioneAuth
GET/api/v1/deadlinesTimeline delle scadenze di conformità NIS2No

Emergenza CSIRT (Art. 23) ​

MetodoPercorsoDescrizioneAuth
POST/api/v1/csirt/emergencyGenera il payload di Early Warning per l'Art. 23 a partire da dati minimiSì

MCP (Model Context Protocol) ​

MetodoPercorsoDescrizioneAuth
GET/api/v1/mcp/toolsElenca gli strumenti MCP esposti sul trasporto HTTPSì
POST/api/v1/mcp/callInvoca uno strumento MCP. Eredita lo stesso scoping RLS per organizzazione di ogni altro endpoint multi-tenantSì

Paginazione ​

Gli endpoint di elenco accettano i parametri di query skip (offset) e limit (dimensione pagina):

GET /api/v1/findings?skip=0&limit=50&severity=high

Le risposte includono un campo total per il conteggio non filtrato.


Errori (Risposte) ​

Tutti gli errori seguono un formato coerente:

json
{
  "detail": "Descrizione dell'errore"
}
CodiceSignificato
400Bad request (errore di validazione)
401Unauthorized (token mancante o non valido)
403Forbidden (permessi insufficienti)
404Risorsa non trovata
409Conflitto (risorsa duplicata)
422Entità non elaborabile (corpo della richiesta non valido)
429Troppe richieste (rate limit raggiunto)
500Errore interno del server

Esempi SDK ​

Python (httpx) ​

python
import httpx

BASE = "https://nis2.esempio.it/api/v1"

# Login e recupero dei token
resp = httpx.post(f"{BASE}/auth/login", json={
    "email": "utente@esempio.it",
    "password": "PasswordRobusta1!"
})
token = resp.json()["access_token"]
headers = {"Authorization": f"Bearer {token}"}

# Elenco dei finding ad alta gravità
findings = httpx.get(f"{BASE}/findings", params={"severity": "high"}, headers=headers)
print(findings.json())

Con una chiave API ​

bash
curl -s \
  -H "Authorization: Bearer nis2_<chiave>" \
  https://nis2.esempio.it/api/v1/findings?severity=critical | jq .