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 aggiornamento
GET/api/v1/auth/meOttiene il profilo dell'utente corrente
PATCH/api/v1/auth/meAggiorna il profilo dell'utente corrente (nome / locale / avatar). Non accetta current_password / new_password — vedi /auth/change-password
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/IP
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/IP
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 JSON
DELETE/api/v1/auth/meCancellazione GDPR Art. 17 dell'account dell'utente chiamante
POST/api/v1/auth/totp/setupAvvia la registrazione TOTP/MFA. Restituisce l'URI di provisioning; il seed è cifrato a riposo con DATA_ENCRYPTION_KEY
POST/api/v1/auth/totp/verifyConferma la registrazione (o una sfida di login) con un codice a 6 cifre
POST/api/v1/auth/totp/disableDisattiva TOTP/MFA per l'utente chiamante

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 scansione
POST/api/v1/schedulesCrea una pianificazione (espressione cron). Solo admin o auditor
PATCH/api/v1/schedules/{schedule_id}Aggiorna una pianificazione
DELETE/api/v1/schedules/{schedule_id}Elimina una pianificazione
POST/api/v1/schedules/{schedule_id}/runAttiva immediatamente un'esecuzione manuale della pianificazione

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'utente
GET/api/v1/reports/status/{task_id}Controlla lo stato della generazione del report tramite ID del task Celery
GET/api/v1/reports/download/{task_id}Scarica un report generato

Organizzazioni

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

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-100
POST/api/v1/certificates/bulk-checkAnalizza fino a 50 domini in blocco con statistiche riepilogative
GET/api/v1/certificates/ct-logs/{domain}Interroga i registri di Certificate Transparency via crt.sh

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 finding
GET/api/v1/remediation/estimate/{scan_id}Calcola l'effort e il costo totale della remediation per l'intera scansione
POST/api/v1/remediation/explain/{finding_id}Spiegazione potenziata dall'AI del finding. Prova prima il LLM locale, poi OpenAI, infine ricade sui playbook

Incidenti

MetodoPercorsoDescrizioneAuth
GET/api/v1/incidents/taxonomyTassonomia degli incidenti NIS2 (tipi, gravità, stati): il vocabolario condiviso da form ed esportazione ACN
POST/api/v1/incidentsSegnala un incidente (Tassonomia Art. 23 CSIRT)
GET/api/v1/incidentsElenca gli incidenti dell'organizzazione
GET/api/v1/incidents/{id}Dettagli di un incidente
PATCH/api/v1/incidents/{id}Aggiorna i dettagli o lo stato dell'incidente
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)
GET/api/v1/incident-monitor/{id}Singolo incidente con lo stato calcolato delle sue scadenze Art. 23
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 mese
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 statistiche
PATCH/api/v1/governance/{item_id}Aggiorna una voce della checklist (stato / responsabile / evidenza)
POST/api/v1/governance/seedPopola la checklist dal template di governance
GET/api/v1/governance/scorePunteggio di conformità pesato (CRITICAL×3 / HIGH×2 / MEDIUM×1)
POST/api/v1/governance/sync-riskIl ponte scanner→conformità: importa i finding aperti come evidenza ed eleva le voci della checklist interessate
GET/api/v1/governance/risk-summarySegnali di rischio per sotto-paragrafo, derivati dai finding aperti
POST/api/v1/governance/bulk-updateAggiorna più voci della checklist in una sola richiesta
GET/api/v1/governance/subparagraphsCatalogo dei sotto-paragrafi dell'Art. 21(2) riconosciuti
GET/api/v1/governance/by-subparagraphVoci della checklist raggruppate per sotto-paragrafo dell'Art. 21(2)

Chiavi API

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

Canali di Notifica

MetodoPercorsoDescrizioneAuth
GET/api/v1/notification-channelsElenca i canali dell'organizzazione. Le credenziali non vengono mai restituite
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. Impaginato

Fornitori (Art. 18 Supply Chain)

MetodoPercorsoDescrizioneAuth
GET/api/v1/vendorsElenca i fornitori dell'organizzazione, ordinati per criticità
POST/api/v1/vendorsRegistra un nuovo fornitore/supplier
GET/api/v1/vendors/statsPanoramica del rischio della supply chain
GET/api/v1/vendors/{vendor_id}Dettagli del fornitore
GET/api/v1/vendors/{vendor_id}/scorePunteggio di rischio della catena di fornitura per un singolo fornitore, con i fattori che lo compongono
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 sicurezza
DELETE/api/v1/vendors/{vendor_id}Rimuove un fornitore
GET/api/v1/vendors/score-formulaLa formula di punteggio del rischio fornitori applicata dalla piattaforma, pubblicata perché un punteggio possa essere verificato a mano

Analisi di Impatto Aziendale (BIA)

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

Esportazione ACN (Italia)

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

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 minimi

MCP (Model Context Protocol)

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

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 .