normattiva-sdk
SDK non ufficiale per Normattiva, il portale della legge vigente dello Stato italiano
Unofficial Python client for Normattiva, the Italian legislation database. Documentation is in Italian, as is the domain.
Normattiva conserva di ogni atto tutte le versioni che si sono succedute: ogni modifica ne apre una nuova senza cancellare la precedente. Si chiama multivigenza. La legge 241 del 1990 ha sessantuno versioni, e per leggerne una si indica una data.
Lo stesso corpus è pubblicato come open data su dati.normattiva.it, con un'API HTTP gratuita. Questa libreria la interroga da Python, in versione sincrona e asincrona, e traduce le risposte in oggetti tipizzati.
Progetto indipendente e non ufficiale. Non è affiliato con l'Istituto Poligrafico e Zecca dello Stato, con Normattiva né con la Presidenza del Consiglio dei Ministri, e non è approvato da loro. Il testo restituito non è autentico: l'unico ufficiale è quello pubblicato sulla Gazzetta Ufficiale a mezzo stampa, che prevale in caso di discordanza.
Indice
Installazione
pip install normattiva-sdk
Si installa come normattiva-sdk e si importa come normattiva.
L'installazione porta anche il comando normattiva.
Dipendenze
Python da 3.10 a 3.14, e httpx come unica dipendenza a runtime. Il pacchetto dichiara i propri tipi secondo il PEP 561.
Uso
from datetime import date
from normattiva import Normattiva, Urn, codici
with Normattiva() as normattiva:
art2043 = normattiva.dettaglio(codici.CODICE_CIVILE.articolo("2043"))
print(art2043.testo)
divorzio = normattiva.dettaglio(Urn.legge(1970, 898, articolo="5"), vigenza=date(2005, 1, 1))
print(divorzio.finestra) # 1987-03-12 → 2023-02-27
Ogni DettaglioAtto porta il testo e i dati per citarlo e verificarlo:
atto.testo # il testo piano, senza le note redazionali
atto.commi # (Comma(numero="1", testo="..."), ...)
atto.note_aggiornamento # le note di aggiornamento, separate dal testo
atto.finestra # la finestra di vigenza in cui quel testo è valido
atto.permalink # il link pubblico, per verificare sulla fonte
atto.attribuzione # la citazione che la licenza dei dati richiede
Riga di comando
normattiva testo codice-civile --articolo 2043
normattiva cerca procedimento amministrativo --anno 1990 --faccette
normattiva cronologia urn:nir:stato:legge:1990-08-07\;241 --articolo 19
normattiva esporta --denominazione LEGGE --anno 1990 --numero 241 --archivio 241.zip
Con --json l'output è un documento pronto per jq, e il codice di uscita
distingue le famiglie di errore: 3 l'atto non esiste, 4 la richiesta era
sbagliata, 5 il servizio è in avaria.
Documentazione
https://ireneburresi.github.io/normattiva-sdk/
Il tutorial porta dall'installazione al testo di un articolo; le guide di come fare sono una per obiettivo; capire spiega com'è fatto il servizio e come si comporta la libreria quando il servizio risponde male; il riferimento elenca classi, metodi ed eccezioni.
API
Normattiva e AsyncNormattiva coprono l'intera API open data e si
rispecchiano metodo per metodo; nella versione asincrona gli iteratori diventano
iteratori asincroni.
dettaglio(), cronologia() |
il testo di un atto a una data, e tutte le sue versioni |
ricerca(), ricerca_completa() |
una pagina di risultati, o un iteratore pigro su tutte |
start_export(), export_from_token() |
avviare un'esportazione, o riprenderne una dal suo token |
wait(), download() |
attendere che finisca e leggerne il risultato |
Corpus.from_zip(), save() |
rileggere e salvare un archivio senza rete |
Urn.legge(), Urn.decreto_legislativo() |
comporre gli identificatori NIR |
codici |
gli atti notissimi, con l'allegato attraverso cui rispondono |
NormattivaError e discendenti |
un'eccezione per ciascun caso da gestire |
Gli errori che indicano una richiesta sbagliata sono tutti ValueError oltre
che NormattivaError, così si prendono insieme senza sapere quale strato li ha
sollevati.
Un taccuino Jupyter percorre la libreria su dati reali, con gli output salvati.
Manutentori
Contribuire
Le domande e le segnalazioni vanno negli issue. Le pull request sono benvenute; per un cambiamento sostanziale conviene aprire prima un issue.
uv sync --all-groups
uv run pytest # la suite offline, su risposte reali registrate
uv run pytest -m rete # le prove di contratto, contro il servizio reale
uv run ruff check && uv run ruff format --check
uv run ty check src
Le prove di contratto interrogano la produzione e restano fuori
dall'esecuzione predefinita: come funziona il monitoraggio è spiegato in
tests/contratto/.
Le prove nuove partono da una risposta reale registrata: quelle già raccolte
stanno in tests/fixtures/ e in tests/contratto/dataset/.
Licenza
Il codice è rilasciato con licenza MIT, Copyright (c) 2026 Irene Burresi. Il testo completo sta in LICENSE.
I dati sono di IPZS, in licenza CC BY 4.0 dal 1° gennaio 2026. L'uso commerciale e la ridistribuzione sono consentiti, e l'unico obbligo è l'attribuzione, che l'avviso legale del portale vuole in tre parti: la fonte, il carattere non autentico del testo e la sua gratuità. Ogni modello la espone già completa:
Fonte: Normattiva (https://www.normattiva.it), Istituto Poligrafico e Zecca
dello Stato, in licenza CC BY 4.0. Testo non autentico e gratuito: l'unico
testo ufficiale è quello pubblicato sulla Gazzetta Ufficiale a mezzo stampa.
Chi ridistribuisce i dati include quella riga.
Metadata
Release files for normattiva-sdk 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| normattiva_sdk-0.1.0.tar.gz | 363.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| normattiva_sdk-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 428.4 kB
Release files / normattiva_sdk-0.1.0.tar.gz
| Download URL | normattiva_sdk-0.1.0.tar.gz |
|---|---|
| Size | 363.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4405f8c7bf324ba6e86b4aba1f94f2e91d3309c1693bf1657d142d51a1ab15d9
|
|
BLAKE2b-256 checksum How to use checksums |
38247f2630ed7fe93d437cf2f9b42a7f0824866e98e72e5d3bfa26df6694eed1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 27, 2026.
Transparency logRelease files / normattiva_sdk-0.1.0-py3-none-any.whl
| Download URL | normattiva_sdk-0.1.0-py3-none-any.whl |
|---|---|
| Size | 65.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c4de30d36054b1d76c7f86b22e5bc4a6f549d1ee0036c708a2ebb1d09950f55a
|
|
BLAKE2b-256 checksum How to use checksums |
ca429a30467404ab0303146fb74b6abbec47850c3d965bfbe13189b84ff23a51
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 27, 2026.
Transparency log