opacte — SDK Python de l'API Opacte
Attestez, vérifiez et faites signer des documents depuis votre logiciel, sans captcha ni code. Comme sur opacte.eu, le document ne quitte jamais votre serveur en clair : pour une attestation, Opacte n'en garde que les empreintes, et la preuve est ancrée dans Bitcoin ; pour une signature, le SDK le chiffre chez vous et la clé ne vient jamais chez Opacte.
Installation
pip install opacte
Python 3.10 ou plus. Créez un compte sur opacte.eu, puis une clé API dans Réglages,
et rendez-la disponible dans la variable d'environnement OPACTE_API_KEY (jamais dans votre code).
Exemple
from opacte import Client, CreditsInsuffisants
client = Client() # clé lue dans OPACTE_API_KEY
print(client.compte().solde)
# Attester un fichier : 1 crédit. Envoyé en flux, lu à la volée, jamais conservé.
attestation = client.attestations.creer("facture-2026-118.pdf", email_visible=False)
print(attestation.id_attestation, attestation.url_recu) # gardez url_recu : accès pérenne au reçu
# Vérifier un document reçu : ses empreintes sont calculées ici, le fichier ne part pas. Gratuit.
for candidate in client.verifier("document-recu.pdf"):
print(candidate["id_attestation"], candidate["horodatage"])
Faire signer
circuit = client.circuits.creer(
"contrat.pdf",
signataires=[{"email": "lea@exemple.fr", "prenom": "Léa", "nom": "MARTIN"}],
zones=[
{
"signataire": "lea@exemple.fr",
"page": 1,
"x": 0.6,
"y": 0.8,
"largeur": 0.3,
"hauteur": 0.08,
"type": "signature",
}
],
initiateur={"prenom": "Claire", "nom": "MOREAU"}, # si votre compte ne signe pas
)
envoyer_par_ma_messagerie(circuit.lien) # https://opacte.eu/sign/…#k=… : Opacte ne l'envoie jamais
conserver(circuit.id_circuit, circuit.cle) # sans la clé, personne ne relit le document signé
# plus tard : statut, puis le document signé, déchiffré ici
if client.circuits.lire(circuit.id_circuit).statut == "complet":
pdf = client.circuits.document(circuit.id_circuit, circuit.cle)
1 crédit par circuit. Le SDK fait chez vous ce que fait le navigateur sur le site : contrôles, clé AES-256-GCM,
chiffrement du PDF et des zones, empreintes ; les signataires signent sur la page /sign d'Opacte.
Webhooks
from opacte import webhooks
hook = client.webhooks.creer("https://crm.exemple.fr/opacte", ["circuit.signature", "circuit.complet"])
SECRET = hook.secret # whsec_… : montré une seule fois
# à la réception, sur le corps brut :
evenement = webhooks.verifier(corps, entetes["Opacte-Signature"], SECRET) # lève SignatureInvalide
Événements : attestation.definitive, attestation.ancree, circuit.signature, circuit.complet,
circuit.expire, circuit.annule — identifiants, statuts et dates seulement.
Vérifier hors ligne
from opacte import hors_ligne
# Une fois : un exemplaire de l'outil hors ligne (son SHA-256 est publié chaque jour hors d'Opacte)
outil = hors_ligne.telecharger_outil()
open("said-verification.html", "wb").write(outil)
# Ensuite, sans réseau ni compte : la même fonction de verdict que l'outil
donnees = hors_ligne.Donnees.depuis_outil("said-verification.html")
v = hors_ligne.verifier("facture-2026-118.pdf", "said-recu-01J….json", donnees)
print(v.etat, v.reserves) # valide [] ; valide ['ancrage-retarde'] ; non_concluant ; invalide ; impossible
if v.bloc:
print("existait avant le bloc Bitcoin", v.bloc.hauteur, v.bloc.temps)
# Document signé : la piste d'audit du circuit, en plus
v = hors_ligne.verifier("contrat-signe.pdf", "said-recu-….json", donnees, piste="said-piste-….json")
print(v.piste.ok, [c.id for c in v.piste.controles if not c.ok])
Signature Ed25519, chemin de Merkle, journal public, preuve OpenTimestamps confrontée à l'en-tête du bloc
Bitcoin, engagement de l'adresse : tout est vérifié localement. Ce que les données ne permettent pas de savoir (clé,
algorithme ou bloc plus récents que l'exemplaire) donne impossible ou une réserve, jamais invalide.
Ce que fait le SDK
- Fichiers en flux : un fichier à attester est envoyé par blocs, jamais chargé en entier en mémoire.
- Chiffrement chez vous : même format que le navigateur (AES-256-GCM, données authentifiées par circuit et par version) ; la clé ne figure que dans le fragment du lien, qu'aucun navigateur n'envoie au serveur.
- Nouvelles tentatives : sur coupure,
429ou5xx, l'appel est rejoué avec la mêmeIdempotency-Key: jamais de second débit. - Erreurs typées :
CleInvalide,CreditsInsuffisants(avecsolde),TropDeDemandes,Introuvable… - Typé : annotations complètes, vérifiables par votre éditeur ou mypy.
Liens
- Documentation et référence : opacte.eu/api
- Tutoriel : opacte.eu/api-tutorial
- Contrat HTTP publié (OpenAPI) : opacte.eu/api/openapi.json — le SDK n'en est qu'une mise en forme : vous pouvez vérifier ce qu'il envoie.
Licence MIT.
Metadata
Release files for opacte 0.3.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| opacte-0.3.1.tar.gz | 32.7 kB | Without provenance | Details for opacte-0.3.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| opacte-0.3.1-py3-none-any.whl | Python 3 | none | any | Details for opacte-0.3.1-py3-none-any.whl |
Total release size: 59.3 kB
Release files / opacte-0.3.1.tar.gz
| Download URL | opacte-0.3.1.tar.gz |
|---|---|
| Size | 32.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8bfa6a3aea7110c88823a49edec0066bb0080e5a3f745ebea3582ea8f94f0b1a
|
|
BLAKE2b-256 checksum How to use checksums |
0eab92738cc179aa49ee93e9c46be5ce898b5afb5ebae6b6fe14ce41ad3a9f5c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.3
|
Release files / opacte-0.3.1-py3-none-any.whl
| Download URL | opacte-0.3.1-py3-none-any.whl |
|---|---|
| Size | 26.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
805874196ab689d6e3403234b3da3dc9c6c9203766e6096f712b190dfc26bc40
|
|
BLAKE2b-256 checksum How to use checksums |
ff7ceaa076c290629a9159ef1f5fc48a489bdf2708ebd6a9707ef82ae0839de5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.3
|
Security for opacte 0.3.1
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.