Skip to content

POST /v1/verify

Verify content against a stored provenance record. No authentication required. Always free.


POST /v1/verify
Content-Type: multipart/form-data
FieldRequiredDescription
contentYesImage file (any format)
tokenNoctv_… token. If omitted, extracted automatically from XMP then watermark
  1. Token provided explicitly → fast path, skip extraction
  2. XMP metadata → instant, zero computation
  3. Frequency-domain watermark → slower, survives social media re-uploads
  4. Nothing found → no_provenance_found

{
"authentic": true,
"tampered": false,
"confidence": "high",
"token_source": "xmp",
"signals": {
"watermark_found": true,
"record_found": true,
"signature_valid": true
},
"provenance": {
"org": "acme-ai",
"model": "stable-diffusion-xl",
"signed_at": "2026-03-29T00:00:00Z"
}
}
ConfidenceSignalsMeaning
highWatermark ✓ + Record ✓ + Signature ✓Full chain intact
mediumRecord ✓ + Signature ✓, no watermarkRe-uploaded without watermark, still verifiable
lowPartial signalsSomething is off
noneNothing foundNot signed by Certivu — no claim either way

A reason field is included:

ReasonMeaning
no_provenance_foundNo token, XMP, or watermark detected
record_not_foundToken decoded but record missing from DB
content_tamperedContent hash does not match stored hash
signature_invalidML-DSA signature verification failed
invalid_tokenToken could not be decoded

POST /v1/verify/batch
Content-Type: application/json

Up to 50 items per request.

{
"items": [
{ "content": "<base64 image>", "token": "ctv_..." },
{ "content": "<base64 image>" }
]
}

Returns an array of VerificationResult objects in the same order.


  • Verification never requires authentication
  • Verification is not rate-limited per plan — IP rate limiting only (abuse prevention)
  • Absence of provenance data does not imply human origin