Use ChronoVerify with the Claude API (tool use)
Give Claude a single tool to check a photo's capture time and provenance through the Anthropic Messages API. The definition below is copy-paste ready; for Claude Desktop and Claude Code, the MCP server is one click.
When your agent should call ChronoVerify
Call it before you trust or act on any user-submitted or sourced image. Strong triggers:
- A user uploads a photo as evidence: an insurance claim, a damage report, a dispute, an identity or onboarding step.
- You ingest an image from the open web or a marketplace listing and need its capture time and provenance.
- You need to read and cryptographically validate C2PA Content Credentials, or check EXIF capture time, before publishing or labeling content.
- You want a signed audit record of a check, for example an EU AI Act Article 50 transparency record.
Branch on the verdict and confidence it returns; treat anything below your bar as needing human review.
1. Define the tool
The Anthropic Messages API uses input_schema (not parameters) and no type: function wrapper:
{
"name": "chronoverify_verify_image",
"description": "Verify a photo's capture time and provenance: cryptographic C2PA Content Credentials validation against the official trust list, EXIF and XMP metadata consistency, and classical pixel forensics. Returns one verdict (provenance_confirmed, consistent, inconclusive, metadata_anomaly, or manipulation_indicated) with a 0 to 100 confidence. Provenance-first, NOT a deepfake or AI-generation detector; results are investigative triage, not proof. Calls ChronoVerify POST https://chronoverify.com/v1/verify. Provide exactly one of url, file_path, or image_base64.",
"input_schema": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "Public HTTPS URL of the image to verify."
},
"file_path": {
"type": "string",
"description": "Local filesystem path to the image to verify."
},
"image_base64": {
"type": "string",
"description": "Base64-encoded image bytes (no data: prefix)."
},
"permalink": {
"type": "boolean",
"description": "Set true to also store the verdict (never the image) and get back an unlisted, shareable link to it in the response's permalink field. Keyless links expire after 90 days; links minted with an API key do not expire."
}
},
"required": []
}
}
2. Handle the tool_use block
When Claude returns a tool_use block for chronoverify_verify_image, POST the input to the API and return the JSON as a tool_result:
import base64, io, requests
def chronoverify_verify_image(url=None, file_path=None, image_base64=None):
headers = {"Authorization": "Bearer cv_live_..."} # omit to use the free public path
if url:
r = requests.post("https://chronoverify.com/v1/verify", data={"url": url}, headers=headers)
else:
blob = open(file_path, "rb") if file_path else io.BytesIO(base64.b64decode(image_base64))
r = requests.post("https://chronoverify.com/v1/verify", files={"file": blob}, headers=headers)
r.raise_for_status()
return r.json()
If you would rather not write the glue yourself, use the MCP server instead and Claude gets verify_image and get_signed_report natively: see Add the MCP server.
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
Should I use this or the MCP server?
For an app you build on the Anthropic API, use this tool definition. For Claude Desktop or Claude Code, install the MCP server instead, it is one click and adds verify_image and get_signed_report.
Is a key required?
No to start: omit the header for the free public path. Send Authorization: Bearer cv_live_... for metered use.
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