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]>=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.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 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)

Source distribution for oprindo 1.0.1
File Size Uploaded
oprindo-1.0.1.tar.gz 56.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for oprindo 1.0.1
File Interpreter ABI Platform
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 log

Release 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

Release history Release notifications | RSS feed

This release

1.0.1 This release

2 release files

1.0.0

2 release files

0.1.0

2 release 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