Skip to main content

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, 429 ou 5xx, l'appel est rejoué avec la même Idempotency-Key : jamais de second débit.
  • Erreurs typées : CleInvalide, CreditsInsuffisants (avec solde), TropDeDemandes, Introuvable…
  • Typé : annotations complètes, vérifiables par votre éditeur ou mypy.

Liens

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)

Source distribution for opacte 0.3.1
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)

Table of built distributions (wheels) for opacte 0.3.1
File Interpreter ABI Platform Actions
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.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page