An example of how to comply with EU AI Act Article 50 using JPEG Trust
Article 50 requires AI-generated content to be marked in a machine-readable format. JPEG Trust embeds and verifies exactly the metadata the regulation demands — using open standards, with no vendor lock-in.
What Article 50 requires
Article 50 of the EU AI Act creates transparency obligations for anyone who builds or deploys AI systems that generate or manipulate content. It entered the final text of Regulation (EU) 2024/1689 and takes effect on 2 August 2026.
If your AI system generates synthetic images, audio, video, or text, you must ensure the output is marked in a machine-readable format and detectable as artificially generated or manipulated.
If you use an AI system that generates or manipulates images, audio, or video — including deep fakes — you must disclose that the content was artificially generated or manipulated.
Why AI-generated media needs labelling
Generative AI can now produce photorealistic images, convincing audio, and fluid video that are indistinguishable from human-created content. Without labelling, there is no reliable way for viewers, journalists, fact-checkers, or automated systems to know what they are looking at.
Article 50 addresses this by requiring that the provenance of AI-generated content travel with the content itself — not as a disclaimer on a webpage, but as metadata embedded in the file. This makes the label machine-readable, persistent, and verifiable downstream regardless of where the content ends up.
The EU's recommended approach
The European Commission's draft Code of Practice for AI-generated content (published December 2025, final version expected mid-2026) specifies a multi-layered approach. No single technique is sufficient on its own:
Provenance metadata
Embed origin and edit history using the JPEG Trust Trust Record (ISO/IEC 21617), which builds on C2PA Content Credentials, the standard named in the Code of Practice.
JPEG Trust covers this layerInvisible watermark
A pixel-level signal that survives resizing, cropping, and re-encoding. Provides detection even when metadata is stripped.
JPEG Trust covers this layerFingerprinting / logging
Server-side record of generated content. Enables traceability even when both metadata and watermarks are removed.
JPEG Trust covers this layerJPEG Trust implements the first and most critical layer: cryptographically signed provenance metadata using the JPEG Trust Trust Record. This is the layer that makes AI labelling machine-readable, interoperable, and legally auditable.
How JPEG Trust embeds compliance metadata
When an AI system generates or modifies an image, JPEG Trust embeds the required provenance assertions directly into the JPEG file. These assertions declare the AI involvement using standardised vocabularies that JPEG Trust tools can read, and that any C2PA-compatible tool can also read.
Digital source types for AI content
Python example: embed AI provenance
from jpegtrust import embed_image, create_profile, save_profile # 1. Create an AI-labelling profile profile = create_profile(template="ai-labelling", name="Article 50 Compliance") save_profile(profile, "article50.yml") # 2. Embed provenance into an AI-generated image embed_image( "ai_generated_photo.jpg", "ai_metadata.json", "labelled_output.jpg", digital_source_type="trainedAlgorithmicMedia" ) # The output file now contains: # - digitalSourceType "trainedAlgorithmicMedia" on the c2pa.created action # - the assertions from ai_metadata.json, e.g. c2pa.actions.v2 (generation # action log) and cawg.training-mining (AI training/inference permissions)
CLI example
# Embed AI provenance metadata jpegtrust embed ai_photo.jpg ai_metadata.json -o labelled.jpg \ --digital-source-type trainedAlgorithmicMedia # Inspect what was embedded jpegtrust extract labelled.jpg
How JPEG Trust can verify compliance
Downstream consumers — platforms, newsrooms, regulators, or automated pipelines — can verify that an image carries valid Article 50 metadata using the ai-labelling trust profile. The profile defines exactly which assertions must be present and valid.
Python example: verify compliance
from jpegtrust import verify_image # Verify an image against the AI-labelling profile report = verify_image("labelled_output.jpg", "article50.yml") print(f"Verdict: {report.status}") # 'pass' print(f"AI label: {report.ai_label}") # 'trainedAlgorithmicMedia' print(f"Checks passed: {report.passed_checks}/{report.total_checks}") if "ai_declaration" in report.failed: print("WARNING: No AI training/inference permission declared") if "digital_source_type" in report.failed: print("WARNING: Missing IPTC digital source type")
CLI example
# Verify against the ai-labelling profile jpegtrust verify labelled.jpg article50.yml # Batch-verify a folder of AI-generated content jpegtrust batch verify ./ai_outputs article50.yml
Example end-to-end compliance pipeline
Here is a typical workflow for an organisation that generates AI content and needs to comply with Article 50 — from generation through to downstream verification.
Generate
Your AI system produces an image. At this point the file has no provenance metadata.
output = model.generate(prompt="sunset over lake") output.save("raw_output.jpg")
Label
Embed Article 50 metadata — digital source type, AI model details, and a cryptographic signature.
jpegtrust embed raw_output.jpg \ ai_meta.json -o labelled.jpg \ --digital-source-type \ trainedAlgorithmicMedia
Distribute
Publish or share the image. The provenance metadata travels inside the file — no external database needed.
# The labelled JPEG can be: # - Published on a website # - Shared via messaging # - Uploaded to a platform # - Sent to a client
Verify
Anyone downstream can check the image for valid AI labelling — platforms, regulators, fact-checkers, or end users.
jpegtrust verify labelled.jpg \ article50.yml # verdict: pass # ai_label: trainedAlgorithmicMedia # checks: 7/7 passed
Get started
JPEG Trust is available as a Python package, a browser-based tool, and an HTTP API. Choose the integration that fits your workflow.
Python package
Install with pip. Embed, extract, and verify from any Python script or backend.
pip install jpegtrustBrowser tools
Embed and verify directly in the browser. No installation required.
Open tools →AI labelling template
Pre-built trust profile with all 7 checks required for AI content compliance.
View use cases →