Fingerprints
A fingerprint is a compact description of what a published file looks or sounds like. Every recipe that decodes the asset computes fingerprints of the bytes it publishes and keeps them on our servers, scoped to your account. When a copy arrives at verification without a usable manifest, recovery compares the copy’s fingerprints with yours to find the original; see Lookup and recovery. A recovered match is reported as recovery, never as cryptographic validity.
Only one fingerprint ever enters a manifest: ISCC Image-Code, which is the image soft binding the C2PA manifest carries. Every other fingerprint is a server-side recovery signal. It is not written into the manifest, not returned by any public response and not shared between accounts.
Choosing a set
Section titled “Choosing a set”POST /v1/sign takes an optional fingerprint_algorithms list; the rules are in
Sign. In short:
- Omit it for the default set of the asset’s media type.
- A list replaces that set. ISCC Image-Code is always added for images, and at least one fingerprint is required, so recovery is never switched off.
- Only a set that differs from the default is priced, as one
fingerprintline; see Retention and pricing. - A job keeps the set it was admitted with. A later change of default never reaches it.
GET /v1/capabilities lists, per media type, the ids
your deployment offers, which are in the default set and which are locked on, with a one-line
note on each. Structural and sidecar containers are not decoded, so they list none and refuse the
field.
What each fingerprint survives
Section titled “What each fingerprint survives”The notes come from our 2026 fingerprint benchmark, which transformed a fixed corpus (re-encoding, resizing, cropping, overlays, rotation, pitch and tempo changes) and measured how often each fingerprint still found the original while keeping false matches rare.
| Id | Media | Good at | Weak at |
|---|---|---|---|
iscc-image |
image | JPEG, resizing, colour changes, added borders | crops, rotation, overlays |
dinov2 |
image | crops and overlays; the most robust image descriptor we run | nothing measured stands out |
dinov2-lsh256 |
image | the same edits as dinov2, as a compact keyed 256-bit hash |
slightly weaker than dinov2 |
pdq |
image | flips and 90-degree rotations; widely used for hash sharing | crops |
chromaprint |
audio | codecs, noise, re-recording | pitch or tempo change |
audfprint |
audio | loud background speech or music; re-recording | the first 10 minutes only |
iscc-audio |
audio | whole recordings, as a compact open-standard code | excerpts |
tmk-pdqf |
video | re-encoding of the whole clip | a border crop of about 10% |
vpdq |
video | partial clips, frame by frame | a border crop of about 10% |
The image default is iscc-image with dinov2. Audio and video keep chromaprint and
tmk-pdqf as their defaults; audfprint, iscc-audio and vpdq are computed only when named.
ISCC Audio-Code is kept as a recovery signal only; it is not written into the manifest.
dinov2-lsh256 projects the DINOv2 descriptor through a random matrix derived from a key held for
your account alone, so its bits are meaningless under another account’s key. Changing that key
would be a new calibration, recorded as such; bindings made under the old one are never compared
with the new.
Catalog
Section titled “Catalog”The tables below are generated from the capability snapshot the API is built with. A deployment
can enable fewer, so GET /v1/capabilities stays the
authority at run time.
Defaults
Section titled “Defaults”| Modality | Default (field omitted) | Always added | Selectable |
|---|---|---|---|
| audio | chromaprint |
none | chromaprint, audfprint, iscc-audio |
| image | iscc-image, dinov2 |
iscc-image |
iscc-image, dinov2, pdq, dinov2-lsh256 |
| video | tmk-pdqf |
none | tmk-pdqf, vpdq |
Media types that keep fingerprints
Section titled “Media types that keep fingerprints”| Media type | Modality | Default | Selectable |
|---|---|---|---|
audio/mp4 |
audio | chromaprint |
chromaprint, audfprint, iscc-audio |
audio/mpeg |
audio | chromaprint |
chromaprint, audfprint, iscc-audio |
audio/wav |
audio | chromaprint |
chromaprint, audfprint, iscc-audio |
image/avif |
image | iscc-image, dinov2 |
iscc-image, dinov2, pdq, dinov2-lsh256 |
image/jpeg |
image | iscc-image, dinov2 |
iscc-image, dinov2, pdq, dinov2-lsh256 |
image/png |
image | iscc-image, dinov2 |
iscc-image, dinov2, pdq, dinov2-lsh256 |
image/tiff |
image | iscc-image, dinov2 |
iscc-image, dinov2, pdq, dinov2-lsh256 |
image/webp |
image | iscc-image, dinov2 |
iscc-image, dinov2, pdq, dinov2-lsh256 |
video/mp4 |
video | tmk-pdqf |
tmk-pdqf, vpdq |
Algorithms
Section titled “Algorithms”| Fingerprint | Name | Modality | In the manifest |
|---|---|---|---|
audfprint |
audfprint landmarks | audio | No (server-side recovery signal) |
chromaprint |
Chromaprint | audio | No (server-side recovery signal) |
dinov2 |
DINOv2-S descriptor | image | No (server-side recovery signal) |
dinov2-lsh256 |
DINOv2-S keyed LSH (256 bit) | image | No (server-side recovery signal) |
iscc-audio |
ISCC Audio-Code (256 bit) | audio | No (server-side recovery signal) |
iscc-image |
ISCC Image-Code | image | Yes (C2PA soft binding) |
pdq |
PDQ | image | No (server-side recovery signal) |
tmk-pdqf |
TMK+PDQF | video | No (server-side recovery signal) |
vpdq |
vPDQ | video | No (server-side recovery signal) |
Licences
Section titled “Licences”The fingerprints added to the choice are under permissive licences: DINOv2 code and weights
(Apache-2.0), PDQ and vPDQ (BSD, from Meta’s ThreatExchange), audfprint (MIT) and ISCC
Audio-Code (Apache-2.0). The ones every job already computed keep
theirs: ISCC (Apache-2.0), TMK+PDQF (BSD) and Chromaprint (MIT core; the fpcalc binary we run is
LGPL-2.1). ISCC Video-Code is not offered: the FFmpeg filter it depends on is GPL-licensed.
ISCC’s bitarray dependency is under the Python Software Foundation licence (PSF-2.0).
Jobs admitted before the image default changed
Section titled “Jobs admitted before the image default changed”Image jobs admitted before DINOv2 replaced SSCD in the image default computed SSCD. SSCD has since been stopped entirely (licence decision, 2026-09-28): nothing computes it, recovery never searches it, and its model is no longer part of the service. Those jobs stay recoverable by the exact SHA-256, their watermark and their ISCC Image-Code. Their stored SSCD bindings are kept only until they expire with their outputs.
