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 https://api.kennmarq.com/v1/verify -F file=@picture.jpg -F signed=true{
"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 }
}c2paistnull, wenn die Datei kein Manifest trägt.stateistTrusted, wenn die Signatur auf unsere Wurzelzertifikate zurückgeht (ours),Validbei einem anderen Unterzeichner, dessen Signatur stimmt, undInvalid, wenn die Datei nach dem Signieren verändert wurde;failureslistet die Codes auf.watermark.idist 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_filegibt an, ob es genau die Datei ist, die wir signiert haben, und istnullbei einer im lokalen Modus markierten Datei, die uns nie erreicht hat.log: der Eintrag des Manifests in unserem Transparenzprotokoll.- Songs und Clips:
fileenthältseconds(und bei einem Clip seine Größe);watermarksenthält die Video-Seal-Lesung des Clips (id, aus 64 Einzelbildern gelesen, undagreement, der Anteil seiner 256 Bit, die übereinstimmen) und die von AudioSeal (detected, der Anteil des Tons, der als markiert gelesen wird, undbitsvon 16);c2paergänztclaims, die Wasserzeichen, die die Datei laut Manifest trägt, und bei einem Clipwatermark_record.watermarkist 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.
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 "https://api.kennmarq.com/v1/credentials/1d455a804e9802a6?format=c2pa" -o credential.c2paGET /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.
Fehler
| Status | Code | Wann |
|---|---|---|
| 400 | invalid_request | Keine 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. |
| 400 | unknown_field | Ein anderes Feld als file (oder upload) und signed. |
| 401 | missing_api_key, invalid_api_key, api_key_revoked | Ein Upload wurde ohne den Schlüssel angegeben, der ihn erstellt hat. |
| 400 | option_not_available | url: Das Prüfen einer Datei per URL ist noch nicht verfügbar. |
| 404 | not_found | Keine Content Credentials unter dieser Wasserzeichen-ID oder kein Schlüssel des Prüftools mit dieser key_id. |
| 404 | upload_not_found | Der angegebene Upload ist keiner, den dieser Schlüssel verwenden kann: unbekannt, schon verwendet, abgelaufen oder der eines anderen Schlüssels. |
| 413 | payload_too_large | Die 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). |
| 415 | unsupported_media_type | Nicht multipart, oder kein Bild, Song oder Clip, den wir lesen. |
| 429 | rate_limited | Mehr 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. |
| 503 | marker_unavailable, storage_unavailable | Das Prüftool (oder die Uploads) ist nicht verfügbar, oder ein signiertes Ergebnis ließ sich vor der Auslieferung nicht verifizieren. Versuchen Sie es erneut. |