Skip to content

POST /v1/lookup

POST /v1/lookup

Look up an asset by its fingerprint. Useful when a file has been stripped of its C2PA manifest but may still carry a watermark, or when you have a modified copy (cropped, recompressed) and want to find the original signed record.

POST https://api.verbitas.io/v1/lookup
Authorization: Bearer vb_live_...
Content-Type: multipart/form-data (file upload)
-- or --
Content-Type: application/json (pre-computed fingerprint)

Lookup modes

Three lookup strategies run in order of confidence. The API returns all matches across all strategies.

ModeHow it worksConfidence
exact_watermarkDecode TrustMark/AudioSeal watermark; match on watermark_idHighest
exact_hashBLAKE3 hash of full file bytes; exact matchHigh
perceptual_hashpHash (image) or audio fingerprint; Hamming-distance matchMedium

Request: file upload

Terminal window
curl -X POST https://api.verbitas.io/v1/lookup \
-H "Authorization: Bearer $VERBITAS_API_KEY" \
-F "asset=@cropped_image.jpg"

Request: pre-computed fingerprint

If you have already computed the fingerprint client-side:

Terminal window
curl -X POST https://api.verbitas.io/v1/lookup \
-H "Authorization: Bearer $VERBITAS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"algorithm": "perceptual_hash",
"binding_hash": "f0e1d2c3b4a59687..."
}'

Response: 200 OK

{
"matches": [
{
"asset_id": "a_01j...",
"match_type": "perceptual_hash",
"confidence": 0.81,
"distance": 12,
"manifest_uri": "https://m.verbitas.io/manifests/a_01j.../manifest.c2pa",
"verifier_url": "https://v.verbitas.io/v/a_01j..."
}
],
"request_id": "req_01j..."
}

Response fields

FieldTypeDescription
matchesarrayRanked list of matches; empty if none found
matches[].asset_idstringID of the matching signed asset
matches[].match_typestringexact_watermark, exact_hash, or perceptual_hash
matches[].confidencefloat0.0–1.0, decayed by distance for pHash matches
matches[].distanceint or nullHamming distance for pHash; null for exact matches
matches[].manifest_uristringURI to the C2PA manifest for this asset
matches[].verifier_urlstringPublic verifier URL

Multiple candidates

When more than one match is found with overlapping confidence:

{
"matches": [
{ "asset_id": "a_01j...", "match_type": "perceptual_hash", "confidence": 0.79, "distance": 14 },
{ "asset_id": "a_02k...", "match_type": "perceptual_hash", "confidence": 0.74, "distance": 18 }
],
"request_id": "req_01j..."
}

A recipe with ambiguous_match_behavior: manual_review will surface the multiple_candidates verification state when this occurs during a verify call. See Verification States.

No match

{
"matches": [],
"request_id": "req_01j..."
}

Python SDK example

import verbitas
client = verbitas.Client()
result = client.lookup("cropped_image.jpg")
for match in result.matches:
print(match.asset_id, match.match_type, match.confidence)
# a_01j... perceptual_hash 0.81

TypeScript SDK example

import { VerbitasClient } from "@verbitas/sdk";
const client = new VerbitasClient();
const result = await client.lookup("cropped_image.jpg");
for (const match of result.matches) {
console.log(match.assetId, match.matchType, match.confidence);
}

Error codes

HTTPCodeMeaning
400verbitas.lookup.no_inputNo asset or fingerprint provided
401verbitas.auth.invalid_keyAPI key invalid
415verbitas.lookup.unsupported_file_typeFile format not supported
429verbitas.ratelimit.exceededRate limit exceeded

Scope requirements

Lookup is available to both sign-scoped and verify-scoped keys. No admin scope required.