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]>=1.0.1" # content-local marking (recommended)
pip install oprindo # stdlib-only: hosted verify + evidence
Mark
import os
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)
Version 1.0.1 sends the actual claim to the broker and embeds its complete
COSE signature, including the signing certificate and timestamp. The SDK
validates the completed asset before returning it. Production rejects the
older digest-only signing flow with claim_bytes_required; upgrade from 1.0.0.
A trusted result requires both a trusted credential and a validated timestamp.
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 stages a local manifest, permutes the claim before sending
it to the broker, then embeds both the permuted claim and the broker's complete
COSE response into the manifest store. 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
Metadata
Release files for oprindo 1.0.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 | |
|---|---|---|---|
| oprindo-1.0.1.tar.gz | 56.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| oprindo-1.0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 110.9 kB
Release files / oprindo-1.0.1.tar.gz
| Download URL | oprindo-1.0.1.tar.gz |
|---|---|
| Size | 56.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
806908368383acc489d18ec5f71f00ba5b0112a679cfb1ecb73a72d441e9618c
|
|
BLAKE2b-256 checksum How to use checksums |
83774312172d9c238eaa7fb84b3bd6fed1af5487156872fef96d0ada9d0af5ee
|
| 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 Oct 8, 2026.
Transparency logRelease files / oprindo-1.0.1-py3-none-any.whl
| Download URL | oprindo-1.0.1-py3-none-any.whl |
|---|---|
| Size | 54.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
dfe456d4f3ff252491a973a36da64ea4f10f5bfb52a9388c4167aad1c7286b7d
|
|
BLAKE2b-256 checksum How to use checksums |
0b73b77b7d806c560713f8ad617c2547e3ec1375fb476ebb1192bf30abe03f66
|
| 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 Oct 8, 2026.
Transparency log