chronoverify
Python client for the ChronoVerify image capture-time and provenance verification API. Send any image, get one plain verdict (provenance_confirmed, consistent, inconclusive, metadata_anomaly, or manipulation_indicated) with a 0 to 100 confidence and the signals behind it. It reads C2PA Content Credentials when present and falls back to EXIF, XMP, and pixel forensics when they are not, so it works on any image, signed or not.
Get an API key (a flat $0.003 per image from prepaid credit, no per-operation multipliers, plus 100 free verifications a month that stay as a fallback when the credit runs out): https://chronoverify.com/pricing
ChronoVerify is provenance-first and deliberately not a deepfake detector. Verdicts are investigative triage to support human review, not proof.
ChronoVerify is a C2PA Conformant Validator, listed on the C2PA Conforming Products List (record 019f8a20-6452-7a43-b11b-59d0b0e4a84a; validation of JPEG, PNG, WebP, and AVIF). Details: https://chronoverify.com/compliance#conformance
Install
pip install chronoverify
Use
from chronoverify import Client
client = Client("cv_live_...") # or omit the key to use the free, rate-limited public path
result = client.verify(file="photo.jpg")
print(result["verdict"], result["confidence"])
print(result["capture_time"]) # {"value": "...", "source": "exif", ...}
Verify a remote image by URL (the server fetches it):
result = client.verify(url="https://example.com/photo.jpg")
You can pass a path, raw bytes, or an open binary file:
with open("photo.jpg", "rb") as fh:
result = client.verify(file=fh)
The key can also come from the CHRONOVERIFY_API_KEY environment variable.
Signed audit report
Get a shareable, independently verifiable PDF audit record for one image (an Ed25519 signature over the canonical verdict, with an optional RFC 3161 timestamp). A report requires an API key. It is the premium artifact: $2.00 from your prepaid balance from the first report (the free 100 a month covers verifications only), or included in a monthly subscription's quota.
client.report(file="photo.jpg", out="report.pdf") # writes the PDF, returns the path
pdf_bytes = client.report(file="photo.jpg") # or get the raw bytes
Verify a report's signature against the public key at https://chronoverify.com/v1/key .
Command line
chronoverify verify photo.jpg
chronoverify verify --url https://example.com/photo.jpg
chronoverify verify photo.jpg --json
chronoverify report photo.jpg -o report.pdf
Set CHRONOVERIFY_API_KEY (or pass --key) to use a metered key; omit it for the free public path.
Response
The verdict object is documented in full, with field reference and examples, at https://chronoverify.com/method#api . A clean result means a file's saved data is internally consistent, not that the scene it shows is real.
License
MIT
Metadata
Release files for chronoverify 0.1.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| chronoverify-0.1.3.tar.gz | 6.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| chronoverify-0.1.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 13.6 kB
Release files / chronoverify-0.1.3.tar.gz
| Download URL | chronoverify-0.1.3.tar.gz |
|---|---|
| Size | 6.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5c5938a82a92763c15e7b7ffd1f7abaca09cb02e7e30b85d39fe97f91524229d
|
|
BLAKE2b-256 checksum How to use checksums |
56f9dee8ac681fe078cf082a1a19a5d46517910c3d09d9e7c5e04d2cb8cc8b45
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.2
|
Release files / chronoverify-0.1.3-py3-none-any.whl
| Download URL | chronoverify-0.1.3-py3-none-any.whl |
|---|---|
| Size | 7.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
afd68714bc0e65b1760b2fbb1012ac039c99d14cfbbe852165deddd8796ecd24
|
|
BLAKE2b-256 checksum How to use checksums |
90f9adb802e6252b1dcb8b03d6304e3ebdb4230d1181773ccec1cad9c22da77c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.2
|