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.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file normattiva_sdk-0.1.0.tar.gz.
File metadata
- Download URL: normattiva_sdk-0.1.0.tar.gz
- Upload date:
- Size: 363.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4405f8c7bf324ba6e86b4aba1f94f2e91d3309c1693bf1657d142d51a1ab15d9
|
|
| MD5 |
7692dd640f11ff35f8b9bd36bb138aa3
|
|
| BLAKE2b-256 |
38247f2630ed7fe93d437cf2f9b42a7f0824866e98e72e5d3bfa26df6694eed1
|
Provenance
The following attestation bundles were made for normattiva_sdk-0.1.0.tar.gz:
Publisher:
release.yml on IreneBurresi/normattiva-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
normattiva_sdk-0.1.0.tar.gz -
Subject digest:
4405f8c7bf324ba6e86b4aba1f94f2e91d3309c1693bf1657d142d51a1ab15d9 - Sigstore transparency entry: 2617898954
- Sigstore integration time:
-
Permalink:
IreneBurresi/normattiva-sdk@eef39f2def4ed9847ea0a17d2ce45e2c6ea2b534 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/IreneBurresi
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@eef39f2def4ed9847ea0a17d2ce45e2c6ea2b534 -
Trigger Event:
push
-
Statement type:
File details
Details for the file normattiva_sdk-0.1.0-py3-none-any.whl.
File metadata
- Download URL: normattiva_sdk-0.1.0-py3-none-any.whl
- Upload date:
- Size: 65.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c4de30d36054b1d76c7f86b22e5bc4a6f549d1ee0036c708a2ebb1d09950f55a
|
|
| MD5 |
f5f701e10c4bf5cf2a55856b7dc9c8e1
|
|
| BLAKE2b-256 |
ca429a30467404ab0303146fb74b6abbec47850c3d965bfbe13189b84ff23a51
|
Provenance
The following attestation bundles were made for normattiva_sdk-0.1.0-py3-none-any.whl:
Publisher:
release.yml on IreneBurresi/normattiva-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
normattiva_sdk-0.1.0-py3-none-any.whl -
Subject digest:
c4de30d36054b1d76c7f86b22e5bc4a6f549d1ee0036c708a2ebb1d09950f55a - Sigstore transparency entry: 2617898963
- Sigstore integration time:
-
Permalink:
IreneBurresi/normattiva-sdk@eef39f2def4ed9847ea0a17d2ce45e2c6ea2b534 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/IreneBurresi
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@eef39f2def4ed9847ea0a17d2ce45e2c6ea2b534 -
Trigger Event:
push
-
Statement type: