Zum Inhalt springen

Eine Datei prüfen

POST https://api.kennmarq.com/v1/verify

GET https://api.kennmarq.com/v1/credentials/{watermark_id}

GET https://api.kennmarq.com/v1/verify/key

Was das C2PA-Manifest und die unsichtbaren Wasserzeichen eines Bildes, Songs oder Clips aussagen, ob von uns oder von anderen; auf Wunsch als ein von uns signiertes Ergebnis. Kostenlos, kein Schlüssel nötig. Das Prüftool tut dasselbe für Bilder in Ihrem Browser, ohne etwas hochzuladen.

POST /v1/verify

Senden Sie das Bild als multipart/form-data in file (PNG, JPEG oder WebP; die Anfrage ist höchstens 4 MB groß). Fügen Sie signed=true hinzu, um ein signiertes Ergebnis zu erhalten. Unsere Server in Zürich lesen die Datei im Arbeitsspeicher und bewahren nichts auf. Ein größeres Bild bis 25 MB geht über einen Upload, angegeben in upload, was den Schlüssel erfordert, der ihn erstellt hat; oder prüfen Sie es im Prüftool, in Ihrem Browser, in jeder Größe bis 25 MB. Songs (MP3, WAV, M4A) und Clips (MP4) werden auf dieselbe Weise auf unseren Servern gelesen, bis 25 MB, mit einem Schlüssel (einem beliebigen Ihrer Schlüssel, kostenlos; es wird nichts gezählt): siehe Songs und Clips.

curl
curl https://api.kennmarq.com/v1/verify -F file=@picture.jpg -F signed=true
200 application/json
{
  "object": "check",
  "checked_at": "2026-11-12T10:00:00Z",
  "checker": { "name": "Kennmarq.com", "version": "0.4.0" },
  "file": { "type": "image/jpeg", "bytes": 482113, "width": 1024, "height": 768, "sha256": "…" },
  "c2pa": {
    "state": "Trusted",
    "manifest": "urn:c2pa:3fa85f64-…",
    "signer": { "common_name": "Kennmarq.com", "issuer": "Neuramare", "ours": true, "environment": "live" },
    "signed_at": "2026-11-12T09:58:31+00:00",
    "time_stamp": { "validated": true, "trusted": true },
    "claim_generator": "Kennmarq.com 0.4.0",
    "ai": { "digital_source_type": "http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia", "generated": true },
    "soft_binding": { "alg": "com.adobe.trustmark.Q", "value": "1*0101…" },
    "failures": []
  },
  "watermark": { "found": true, "alg": "com.adobe.trustmark.Q", "schema": "BCH_5", "id": "1d455a804e9802a6", "matches_manifest": true },
  "durable_credential": {
    "watermark_id": "1d455a804e9802a6",
    "manifest": "urn:c2pa:3fa85f64-…",
    "environment": "live",
    "asset_sha256": "…",
    "same_file": true,
    "log_index": 1834001,
    "url": "https://api.kennmarq.com/v1/credentials/1d455a804e9802a6"
  },
  "log": { "leaf_index": 1834001, "status": "included", "proof_url": "https://api.kennmarq.com/v1/log/proof/1834001" },
  "signed": { "jws": "eyJhbGciOiJFUzI1NiIs…", "key_id": "…", "log_index": 1834530 }
}
  • c2pa ist null, wenn die Datei kein Manifest trägt. state ist Trusted, wenn die Signatur auf unsere Wurzelzertifikate zurückgeht (ours), Valid bei einem anderen Unterzeichner, dessen Signatur stimmt, und Invalid, wenn die Datei nach dem Signieren verändert wurde; failures listet die Codes auf.
  • watermark.id ist bei Wasserzeichen in unserem Schema (BCH_5) gesetzt; andere TrustMark-Wasserzeichen erscheinen mit ihrem Schema als gefunden, wenn auch in der Bildmitte genau dasselbe gelesen wird, sodass ein Bild ohne Markierung nicht zufällig eine anzeigt. Unseres wird auch in einem Bild gelesen, das seitlich gedreht oder auf dem Kopf stehend gespeichert wurde.
  • durable_credential: wozu das Wasserzeichen in unseren Aufzeichnungen führt, wenn wir die Datei signiert haben. Entfernt eine Plattform die Metadaten, werden die Content Credentials auf diesem Weg wiedergefunden; same_file gibt an, ob es genau die Datei ist, die wir signiert haben, und ist null bei einer im lokalen Modus markierten Datei, die uns nie erreicht hat.
  • log: der Eintrag des Manifests in unserem Transparenzprotokoll.
  • Songs und Clips: file enthält seconds (und bei einem Clip seine Größe); watermarks enthält die Video-Seal-Lesung des Clips (id, aus 64 Einzelbildern gelesen, und agreement, der Anteil seiner 256 Bit, die übereinstimmen) und die von AudioSeal (detected, der Anteil des Tons, der als markiert gelesen wird, und bits von 16); c2pa ergänzt claims, die Wasserzeichen, die die Datei laut Manifest trägt, und bei einem Clip watermark_record. watermark ist dann das Video Seal des Clips, das wie bei einem Bild zu seinen dauerhaften Content Credentials führt, oder das AudioSeal des Songs, das angibt, dass die Datei von uns markiert wurde, aber keine ID trägt.

Signierte Ergebnisse

Mit signed=true ist signed.jws ein JWS (RFC 7515, kompakt), den der Schlüssel unseres Prüftools mit ES256 signiert hat: Seine Payload ist das obige Ergebnis (die Datei, ihr Manifest und Wasserzeichen, der Zeitpunkt) sowie iss, iat und eine eindeutige jti; kid in seinem Header nennt den Schlüssel. Bevor er zurückgegeben wird, kommt er als Eintrag checker.result in unser Transparenzprotokoll (der SHA-256 des JWS, der SHA-256 der Datei und die Schlüssel-ID), an dem Index in X-Log-Index. Jede JWT-Bibliothek prüft ihn mit dem Schlüssel von GET /v1/verify/key.

Node.js (jose)
import { decodeProtectedHeader, importSPKI, jwtVerify } from "jose";

const { jws } = result.signed;
const { kid } = decodeProtectedHeader(jws);
const key = await (await fetch(`https://api.kennmarq.com/v1/verify/key?key_id=${kid}`)).json();
const { payload } = await jwtVerify(jws, await importSPKI(key.public_key, "ES256"), { issuer: "Kennmarq.com" });
// payload.file.sha256 is the SHA-256 of the file that was checked; compare it with yours.
console.log(payload.file.sha256, payload.checked_at);

GET /v1/credentials/{watermark_id}

Der C2PA-Manifest-Store, zu dem ein Wasserzeichen führt, aufbewahrt seit dem Moment, in dem wir die Datei signiert haben: als JSON (der Store in Base64 in manifest_store) oder mit ?format=c2pa als .c2pa-Datei, die jedes C2PA-Tool liest. Wer das Wasserzeichen lesen kann, kann ihn abrufen, also jeder, der das Bild hat.

curl
curl "https://api.kennmarq.com/v1/credentials/1d455a804e9802a6?format=c2pa" -o credential.c2pa

GET /v1/verify/key

Der öffentliche Schlüssel des Prüftools: key_id (SHA-256 seiner DER-codierten SubjectPublicKeyInfo), algorithm und public_key (PEM). Mit ?key_id= und der kid eines JWS der Schlüssel, der es signiert hat, auch Schlüssel, mit denen wir nicht mehr signieren; ohne den Parameter der neueste.

Eine Prüfung sagt, was eine Datei trägt, nicht, wer sie erstellt hat oder ob sie mit KI erstellt wurde: Markierungen lassen sich entfernen, und eine unmarkierte Datei beweist nichts. Der Unterzeichner und die KI-Angabe sind das, was der Ersteller der Datei angegeben hat.

Fehler

Fehler der Endpunkte des Prüftools
StatusCodeWann
400invalid_requestKeine Datei, ein doppelt gesendetes Feld, signed mit einem anderen Wert als true oder false, ein Bild, das sich nicht lesen lässt, oder eine fehlerhafte Wasserzeichen-ID oder key_id.
400unknown_fieldEin anderes Feld als file (oder upload) und signed.
401missing_api_key, invalid_api_key, api_key_revokedEin Upload wurde ohne den Schlüssel angegeben, der ihn erstellt hat.
400option_not_availableurl: Das Prüfen einer Datei per URL ist noch nicht verfügbar.
404not_foundKeine Content Credentials unter dieser Wasserzeichen-ID oder kein Schlüssel des Prüftools mit dieser key_id.
404upload_not_foundDer angegebene Upload ist keiner, den dieser Schlüssel verwenden kann: unbekannt, schon verwendet, abgelaufen oder der eines anderen Schlüssels.
413payload_too_largeDie Anfrage ist größer als 4 MB: Prüfen Sie größere Bilder im Prüftool, oder senden Sie Dateien über einen Upload (bis 25 MB).
415unsupported_media_typeNicht multipart, oder kein Bild, Song oder Clip, den wir lesen.
429rate_limitedMehr als 10 Prüfungen pro Minute oder 200 pro Tag von einer Adresse (eine IPv6-Adresse zählt nach ihrem /64; Abfragen: 120 pro Minute), die heutigen Prüfungen ohne Schlüssel sind für alle aufgebraucht, oder, mit einem Schlüssel, die Aufrufe pro Minute Ihrer Organisation.
503marker_unavailable, storage_unavailableDas Prüftool (oder die Uploads) ist nicht verfügbar, oder ein signiertes Ergebnis ließ sich vor der Auslieferung nicht verifizieren. Versuchen Sie es erneut.