ChronoVerify

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:

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)."
      }
    },
    "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()

Prefer not to 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

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 it does and does not tell you

ChronoVerify validates provenance and metadata and flags possible editing for human review. 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.

Does it detect AI-generated images?

No. It validates provenance and metadata and flags possible editing for review; it is not a deepfake or AI-generation detector.

Is a key required?

No to start: omit the header for the free public path. Send Authorization: Bearer cv_live_... for metered use.

The fastest way to see it is to run a photo through it.

Try the free verifier