ChronoVerify

Call the ChronoVerify API from any language

Every integration here is one HTTP call underneath. Use curl, the first-party SDKs, or a webhook step in any platform to verify a photo's capture time and provenance.

When your agent should call ChronoVerify

Call it before you trust or act on any user-submitted or sourced image. Strong triggers:

Branch on the verdict and confidence it returns; treat anything below your bar as needing human review.

One call from any language

curl -X POST https://chronoverify.com/v1/verify \
  -H "Authorization: Bearer cv_live_..." \
  -F "file=@photo.jpg"

Or verify by URL:

curl -X POST https://chronoverify.com/v1/verify \
  -H "Authorization: Bearer cv_live_..." \
  -F "url=https://example.com/photo.jpg"

Omit the Authorization header to use the free, rate-limited public path.

First-party SDKs

The first-party SDK wraps the same call: pip install chronoverify (and npm i chronoverify for TypeScript).

from chronoverify import Client

client = Client()                      # or Client("cv_live_...") for metered use
result = client.verify(file="photo.jpg")   # or url="https://example.com/photo.jpg"
print(result["verdict"], result["confidence"])

TypeScript (Node 18+):

import { ChronoVerify } from "chronoverify";

const cv = new ChronoVerify();     // or new ChronoVerify("cv_live_...") for metered use
const result = await cv.verify({ file: "photo.jpg" });   // or { url: "https://..." }
console.log(result.verdict, result.confidence);

For a signed PDF audit record, POST the same multipart file field to /v1/report with a paid key. The response body is the signed PDF. $2.00 each from a prepaid balance, from the first report (the free 100 a month covers verifications only), or included in a monthly subscription's quota.

What comes back

The response is one JSON object, the same in the browser and the API. The verdict is one of provenance_confirmed, consistent, inconclusive, metadata_anomaly, or manipulation_indicated.

{
  "schema_version": "v1",
  "verdict": "consistent",
  "confidence": 61,
  "headline": "Metadata is internally consistent. No manipulation signals fired.",
  "capture_time": {
    "value": "2026-05-18T14:32:10",
    "source": "exif",
    "consistent": null
  },
  "capture_device": {
    "make": "Canon",
    "model": "EOS R6",
    "software": "Firmware 1.8.1"
  },
  "c2pa": {
    "present": false,
    "validated": null,
    "validation_state": null,
    "signer": null
  },
  "integrity": {
    "sha256": "1313339a...",
    "sha512": "93a81e4a...",
    "format": "JPEG"
  }
}

Full field reference, including the C2PA validation state and signer, is on the method and API page and in /openapi.json.

What a verdict tells you

ChronoVerify returns the photo's capture time, the capture device, the validated provenance state, and the file hashes, as a typed verdict with a confidence. It is not a deepfake or AI-generation detector, and a verdict is investigative triage, not proof: a clean result means a file's saved data is internally consistent, not that the scene it shows is real. Never use a verdict as the sole basis for an automated decision about a person.

Common questions

What do I send?

A multipart form with a file, or a url form field. Exactly one image per call.

How do I get a signed report?

POST the file to /v1/report with your API key; it returns a signed, timestamped PDF audit record. Reports cost $2.00 from a prepaid balance, from the first report: the free 100 a month covers verifications only. On a monthly subscription they come out of the plan's included quota instead.

Is ChronoVerify C2PA conformant?

Yes. ChronoVerify is a C2PA Conformant Validator on the C2PA Conforming Products List, record 019f8a20-6452-7a43-b11b-59d0b0e4a84a, covering validation of JPEG, PNG, WebP and AVIF under C2PA specification 2.2. The list is public, so you can check the record yourself. It covers validation rather than generation: ChronoVerify reads and validates Content Credentials, it does not sign them.

See what it returns on one of your own photos.

Try the free verifier