Skip to content

Check declared origin. Keep the evidence.

Verification validates a file's C2PA manifest against its exact bytes and checks the signer. When no manifest survives, it searches your watermarks and fingerprints. Every result comes with reason codes.

POST /v1/verifications · what a result can say
  • ValidUnchanged since the signer signed it
  • Valid · signer not on the trust listUnchanged; treat the signer name as a claim
  • Does not matchThe bytes changed after signing
  • No Content CredentialsOrigin unknown, which is not the same as fake
  • Declared AI-generatedThe signer recorded a digital source type
  • RecoveredWatermark or fingerprint matched your record: a lead

What a verification checks

  • The manifest

    Reads the C2PA manifest in the file, or the separate .c2pa manifest for sidecar formats.

  • The signature and the hash binding

    The signature must be intact and the file must still match the hash recorded in the manifest.

  • The signer

    Checks the signing certificate against the C2PA trust list, and reports expired or revoked certificates.

  • Recovery when the manifest is gone

    Searches your account's watermark and fingerprint bindings. A match is reported as recovery, never as validity.

Submit an object, then poll

Verification is asynchronous. Send the object identifier of a stored file, then poll until the state is completed or failed.

# Verify an object stored in your account. OUTPUT_OBJECT_ID is the signed
# object named in the job's receipt, or the object id of any completed upload.
curl -sS -X POST "$OP_API/v1/verifications" \
  -H "Authorization: Bearer $OP_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d "{\"object_id\": \"$OUTPUT_OBJECT_ID\"}" > verification.json

# 202 returns a pollable verification. Poll until state is completed or failed.
curl -sS "$OP_API/v1/verifications/$(jq -r .verification_id verification.json)" \
  -H "Authorization: Bearer $OP_API_KEY" | jq .

Results you can act on

StatusWhat it means
ValidThe signature validates and the file matches its manifest.
untrustedThe file matches its manifest, but the signer is not on the C2PA trust list. Treat the signer name as a claim.
invalid_tamperedThe file no longer matches its manifest, or the signature or manifest is damaged.
expired, revokedA certificate in the chain had expired, or was revoked.
unavailableThe credentials use a form that cannot be read yet. No claim is made about them.

A result recovered from a watermark or fingerprint carries the reason VALIDATION_RECOVERY_ONLY. It is a lead to your original, not cryptographic proof.

Declared origin, not a verdict

A valid manifest shows who signed a file and that it has not changed since. When the credentials declare AI involvement, the result shows the IPTC digital source type the signer recorded. It does not prove that a depicted event happened, and a file with no credentials is neither fake nor authentic by that fact alone.

Evidence you can keep and share

Each completed verification is stored as evidence. You can generate a report from it and create an expiring, revocable share link that returns a minimal view.

Files signed elsewhere

For a sidecar format another product signed, upload the asset and its .c2pa file, then send both object identifiers. Verify never fetches a remote manifest.

In the console

Signed-in teams can verify a file in the console, including watermark and fingerprint recovery. How recovery searches your bindings is described in lookup and recovery.

Billing

One verification is one unit, priced at a tenth of the processing rates: from $0.0015 down to $0.00025 per verification, graduated per month.

Verify what you sign

Create an API key and verify your first signed file with two calls.