oprindo
Python SDK for Oprindo — C2PA signing identity and implementation evidence for generative-AI providers.
Your content stays local
With the c2pa extra installed, mark() assembles and embeds the C2PA manifest
on your machine — only the claim (kilobytes of metadata and hashes) is sent to
Oprindo. Your media bytes never leave your process in this mode.
Without the extra, mark() refuses to run unless you explicitly pass
allow_full_service=True, which transmits the asset to the hosted marking endpoint.
The choice is always yours and always explicit.
Install
pip install oprindo[c2pa] # content-local marking (recommended)
pip install oprindo # stdlib-only: hosted verify + evidence
Mark
from oprindo import Oprindo
client = Oprindo(api_key=os.environ["OPRINDO_API_KEY"])
with open("generated.jpg", "rb") as f:
result = client.mark(f.read(), "image/jpeg", generator={"name": "YourProduct", "version": "1.0.0"})
with open("generated.marked.jpg", "wb") as f:
f.write(result.asset)
print(result.trust_state, result.evidence_id)
Every signature carries an explicit trust state (sandbox, pre_conformance, or
trusted) — never blurred. Test-key signatures carry a visible sandbox marker.
Provenance actions
Omit actions and the SDK inspects the asset and picks the correct inception
action:
| Input | Action asserted |
|---|---|
| No prior manifest | c2pa.created + digitalSourceType: trainedAlgorithmicMedia |
| Already carries provenance | c2pa.opened, with the prior manifest referenced as a parentOf ingredient |
This matters for conformance. C2PA requires the inception action to reflect
origin: asserting c2pa.created over content that arrived with a manifest
claims an origin you cannot vouch for. Accordingly:
c2pa.createdon an asset that already carries provenance is refused.c2pa.openedmust not carry adigitalSourceType— the origin of content you opened is the parent manifest's to state — and is refused if there is nothing to open.- An asset whose existing provenance cannot be read is refused rather than marked, because "unreadable" is not "absent".
Verify
report = client.verify(asset_bytes, "image/jpeg")
Local when the c2pa extra is installed; hosted otherwise. The C2PA
Conformance Program CA and TSA trust lists ship with the package and are loaded
on the local path, so a credential chaining to a listed root reads as trusted
and certificate validity is judged at the trusted timestamp rather than at
"now".
Conformance
Output conforms to the requirements the C2PA Conformance Program assessed
Oprindo against (record 019fa058-c512-7f87-a214-4d8cfbda73ce, Generator
Product, Assurance Level 1):
- every assertion in the claim's
created_assertions, withgathered_assertionsempty; - the actions assertion first in
created_assertions; - CA and TSA trust lists loaded on the validation and ingredient-ingestion paths;
- an inception action that reflects origin.
The second is not reachable through c2pa-rs configuration — it assembles claims
in a fixed order that never puts actions first when a claim thumbnail or
ingredient is present. The SDK therefore permutes the claim inside the bytes
handed to the signer, so the signature covers the permuted claim, then rewrites
the manifest store to match. The permutation moves raw CBOR byte slices, so the
claim keeps its exact length and JUMBF box lengths stay valid. See
oprindo/_claim_order.py.
Evidence
records = client.evidence(from_ts="2026-08-01")
Append-only, hash-chained implementation-evidence records, mapped to EU Transparency Code Section 1 measures.
Scope
This SDK helps you implement and evidence Article 50 marking measures. Compliance depends on your complete implementation and circumstances. Nothing here is legal advice.
License
Apache-2.0
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 oprindo-1.0.0.tar.gz.
File metadata
- Download URL: oprindo-1.0.0.tar.gz
- Upload date:
- Size: 54.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
898e80930a1f813d9214cad62fb635398cc038ef22dec2bf23b58afbbc33f55d
|
|
| MD5 |
cfa32f345f36f3e68e657713ad11ffe1
|
|
| BLAKE2b-256 |
ba04afdb733d537877abb894b0af2e967f4ea543224b317757f973c33a6eb1d7
|
Provenance
The following attestation bundles were made for oprindo-1.0.0.tar.gz:
Publisher:
publish.yml on hexrift/oprindo-sdk-py
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
oprindo-1.0.0.tar.gz -
Subject digest:
898e80930a1f813d9214cad62fb635398cc038ef22dec2bf23b58afbbc33f55d - Sigstore transparency entry: 2302755127
- Sigstore integration time:
-
Permalink:
hexrift/oprindo-sdk-py@da4073cd6c3c0ada615d2d0dcf6c57cac7f0ae41 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/hexrift
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@da4073cd6c3c0ada615d2d0dcf6c57cac7f0ae41 -
Trigger Event:
push
-
Statement type:
File details
Details for the file oprindo-1.0.0-py3-none-any.whl.
File metadata
- Download URL: oprindo-1.0.0-py3-none-any.whl
- Upload date:
- Size: 53.3 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 |
b04c3bd2111c3b75668710a3db2e31aa14b6ef35fa0921a41e6b801f168a907a
|
|
| MD5 |
15aa0e721a48354912726b75ad589f7e
|
|
| BLAKE2b-256 |
20298fb6df5c07f6aba803ed8eee4cf84e233e7869f73d44446fa6a8532fdb5b
|
Provenance
The following attestation bundles were made for oprindo-1.0.0-py3-none-any.whl:
Publisher:
publish.yml on hexrift/oprindo-sdk-py
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
oprindo-1.0.0-py3-none-any.whl -
Subject digest:
b04c3bd2111c3b75668710a3db2e31aa14b6ef35fa0921a41e6b801f168a907a - Sigstore transparency entry: 2302755186
- Sigstore integration time:
-
Permalink:
hexrift/oprindo-sdk-py@da4073cd6c3c0ada615d2d0dcf6c57cac7f0ae41 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/hexrift
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@da4073cd6c3c0ada615d2d0dcf6c57cac7f0ae41 -
Trigger Event:
push
-
Statement type: