Skip to main content

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.created on an asset that already carries provenance is refused.
  • c2pa.opened must not carry a digitalSourceType — 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, with gathered_assertions empty;
  • 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

oprindo-1.0.0.tar.gz (54.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

oprindo-1.0.0-py3-none-any.whl (53.3 kB view details)

Uploaded Python 3

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

Hashes for oprindo-1.0.0.tar.gz
Algorithm Hash digest
SHA256 898e80930a1f813d9214cad62fb635398cc038ef22dec2bf23b58afbbc33f55d
MD5 cfa32f345f36f3e68e657713ad11ffe1
BLAKE2b-256 ba04afdb733d537877abb894b0af2e967f4ea543224b317757f973c33a6eb1d7

See more details on using hashes here.

Provenance

The following attestation bundles were made for oprindo-1.0.0.tar.gz:

Publisher: publish.yml on hexrift/oprindo-sdk-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for oprindo-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b04c3bd2111c3b75668710a3db2e31aa14b6ef35fa0921a41e6b801f168a907a
MD5 15aa0e721a48354912726b75ad589f7e
BLAKE2b-256 20298fb6df5c07f6aba803ed8eee4cf84e233e7869f73d44446fa6a8532fdb5b

See more details on using hashes here.

Provenance

The following attestation bundles were made for oprindo-1.0.0-py3-none-any.whl:

Publisher: publish.yml on hexrift/oprindo-sdk-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 files

0.1.0

2 files

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