POST /v1/verify
Verify content against a stored provenance record. No authentication required. Always free.
Single verification
Section titled “Single verification”POST /v1/verifyContent-Type: multipart/form-dataForm fields
Section titled “Form fields”| Field | Required | Description |
|---|---|---|
content | Yes | Content to verify (image, audio, text, or video) |
token | No | ctv_… token. If omitted, extracted automatically |
format | No | "image", "audio", "text", or "video". Auto-detected from magic bytes if omitted. |
Token extraction order
Section titled “Token extraction order”- Token provided explicitly → fast path, skip extraction
- Format-native metadata container (XMP for images/PDF, ID3v2/VORBIS_COMMENT/CTV chunk for audio, HTML meta for HTML,
cervatom / Certivu trailer for video) → instant - Resilient watermark (DCT spread-spectrum for images, DCT frame for WAV 16/24-bit, ZWC steganography for plain text and HTML body) → slower, survives transformations
- Perceptual hash (pHash) → fuzzy lookup against records with stored pHash, Hamming distance ≤ 8 (images and video — video uses first I-frame via ffmpeg)
- Acoustic fingerprint → landmark-pair FFT fingerprint match against audio records (WAV PCM only; activates when metadata tags have been stripped)
- Nothing found →
no_provenance_found
Response
Section titled “Response”{ "authentic": true, "tampered": false, "confidence": "high", "token_source": "xmp", "format": "image", "signals": { "watermark_found": true, "record_found": true, "signature_valid": true, "phash_match": false, "fingerprint_match": false, "neural_watermark_found": false }, "provenance": { "org": "acme-ai", "model": "stable-diffusion-xl", "signed_at": "2026-03-29T00:00:00Z" }, "c2pa": { "found": true, "validation_status": "valid", "assertions": ["c2pa.actions", "c2pa.hash.data"] }}token_source values
Section titled “token_source values”| Value | Meaning |
|---|---|
"provided" | Token was supplied explicitly in the request |
"xmp" | Token extracted from format-native metadata (XMP / ID3v2 / VORBIS_COMMENT / CTV chunk / HTML meta / PDF /Metadata) |
"watermark" | Token resolved via resilient watermark (DCT for images/WAV, ZWC for plain text/HTML body) |
"phash" | Record found via perceptual hash similarity (images and video) |
"fingerprint" | Record found via acoustic fingerprint match (WAV PCM only) |
"neural_watermark" | Record found via neural watermark (TrustMark image / WavMark audio / keyframe video) — survives social round-trips and re-encodes |
null | No provenance found |
signals fields
Section titled “signals fields”| Field | Type | Description |
|---|---|---|
watermark_found | boolean | Resilient watermark was successfully extracted |
record_found | boolean | A matching provenance record exists in the database |
signature_valid | boolean | ML-DSA signature verified against generator’s public key |
phash_match | boolean | Record was located via perceptual hash similarity (Hamming ≤ 8, images and video) |
fingerprint_match | boolean | Record was located via acoustic fingerprint match (WAV PCM only) |
neural_watermark_found | boolean | A neural watermark (TrustMark image / WavMark audio / keyframe video) was decoded — survives recompression, resize, and re-encode |
Confidence levels
Section titled “Confidence levels”| Confidence | Signals | Meaning |
|---|---|---|
high | (Watermark or neural watermark) ✓ + Record ✓ + Signature ✓ | Full chain intact, incl. social/re-encode survival |
medium | Record ✓ + Signature ✓, no watermark | Re-uploaded without watermark, still verifiable |
low | Partial signals | Something is off |
none | Nothing found | Not signed by Certivu — no claim either way |
c2pa field (optional)
Section titled “c2pa field (optional)”Present when the uploaded content contains a C2PA manifest. null or absent when no manifest is detected.
| Field | Type | Description |
|---|---|---|
found | boolean | A C2PA manifest was detected |
validation_status | string | "valid" or "invalid" based on C2PA manifest assertions |
assertions | string[] | Labels of the assertions present in the manifest |
manifest_count | number | Number of manifests in the asset’s C2PA store |
signature_issuer | string | Issuer from the active manifest’s signature certificate |
is_certivu | boolean | True when the active manifest was produced by Certivu |
When authentic: false
Section titled “When authentic: false”A reason field is included:
| Reason | Meaning |
|---|---|
no_provenance_found | No token, XMP, watermark, pHash, or fingerprint match detected |
record_not_found | Token decoded but record missing from DB |
content_tampered | Content hash does not match stored hash |
signature_invalid | ML-DSA signature verification failed |
invalid_token | Token could not be decoded |
phash_false_positive | Record found via pHash but content hash doesn’t match (perceptually similar but different file) |
Batch verification
Section titled “Batch verification”POST /v1/verify/batchContent-Type: application/jsonUp to 50 items per request.
{ "items": [ { "content": "<base64 image>", "token": "ctv_..." }, { "content": "<base64 image>" } ]}Returns an array of VerificationResult objects in the same order.
Token status lookup
Section titled “Token status lookup”GET /v1/verify/status/:tokenLightweight status check by ctv_ token — no content upload required. Returns generator and signing metadata for a token without running a full verification. The response is CDN-cacheable (Cache-Control: public, max-age=3600), making it efficient for badge endpoints, link previews, or pre-flight checks before embedding a token in content.
Path parameter
| Parameter | Description |
|---|---|
:token | A ctv_ token returned by the sign endpoint |
Response 200
{ "record_id": "rec-uuid", "generator_status": "active", "model": "stable-diffusion-xl", "signed_at": "2026-03-29T00:00:00Z", "org_id": "org_xyz789"}| Field | Type | Description |
|---|---|---|
record_id | string | Provenance record ID |
generator_status | string | "active" or "revoked" — if revoked, content provenance cannot be trusted |
model | string | AI model that produced the content |
signed_at | string | ISO 8601 timestamp of when the record was signed |
org_id | string | Org that created the record |
Errors
| Status | Reason |
|---|---|
400 | Token missing or malformed |
404 | No record found for this token |
- 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
- The pHash lookup scans the most recent records with a stored
phash. For high-volume deployments, Atlas Vector Search is recommended to scale this path beyond the default scan window - C2PA signals are read-only — Certivu reports what the manifest says, not whether the C2PA signer is trusted