Skip to main content
Embed cryptographically signed provenance directly into image and video files. Interoperable with Adobe, Microsoft, BBC, and others via the C2PA standard. Satisfies EU AI Act Art. 50(2) for AI-generated media.

What is C2PA?

The Coalition for Content Provenance and Authenticity (C2PA) is an open standard for embedding signed provenance manifests directly into media files. ProvenanceKit bridges C2PA ↔ the EAA type system, giving you both formats from a single workflow.

Installation

The package wraps @contentauth/c2pa-node, which requires a native binary. It’s an optional peer dependency — C2PA features gracefully degrade if unavailable:

Reading a C2PA Manifest

Writing a C2PA Manifest

Detecting AI-Generated Content

C2PA ↔ EAA Conversion

Bidirectional conversion between C2PA manifests and EAA types:

EU AI Act Art. 50 Compliance Pattern

Art. 50(2) requires AI-generated content to be “marked in a machine-readable format” so it can be detected by automated tools. C2PA is the designated standard.

Supported Formats

The ext:c2pa@1.0.0 Extension

When a media file with a C2PA manifest is recorded via ProvenanceKit, the manifest summary is stored in the ext:c2pa@1.0.0 extension on the resource:

Via the ProvenanceKit API

The API exposes C2PA endpoints for direct use without the npm package:

Gotchas

  • @contentauth/c2pa-node is optional: The package is listed as a peer dependency. Install it explicitly; it ships a native binary compiled per platform.
  • Signing certificates: C2PA manifests must be signed with a valid X.509 certificate. For testing, use the C2PA test credentials. For production, obtain a certificate from a C2PA-approved certificate authority.
  • Manifest validation: Reading a manifest with readManifest returns null if no valid manifest is present — it does not throw. Check the return value before using.
  • HEIC on Linux: HEIC support requires libheif to be installed on the host OS. On macOS it’s available by default.
  • File mutation: embedManifest returns a new buffer — it does not modify the input file. Write the returned buffer to a new path.