EU AI Act · Article 50 Effective 2 August 2026

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.

Providers
Art. 50(2)

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.

Deployers
Art. 50(4)

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.

Enforcement date 2 August 2026
Extension for existing systems 2 December 2026 (AI Omnibus)
Penalties Up to €15 million or 3% of worldwide annual turnover
Scope Synthetic audio, image, video, and text

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.

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.

Assertion Standard Purpose
c2pa.actions › digitalSourceType IPTC Declares whether the image is AI-generated, composite, or human-captured
cawg.training-mining › cawg.ai_inference CAWG Entry in cawg.training-mining stating whether the content may be used as input to AI inference (allowed, notAllowed or constrained)
cawg.training-mining › cawg.ai_training CAWG Entry in cawg.training-mining stating whether the content may be used to train AI models (allowed, notAllowed or constrained)
c2pa.actions C2PA Logs every edit action performed on the image
c2pa.hash.data C2PA Tamper-evident hash of the pixel data

Digital source types for AI content

trainedAlgorithmicMedia Fully AI-generated (e.g. Stable Diffusion, DALL-E, Midjourney)
compositeWithTrainedAlgorithmicMedia Human photo with AI modifications (e.g. generative fill, AI upscale)
algorithmicMedia Generated by non-trained algorithm (e.g. CGI renders)

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.

ai-labelling profile checks
✓Signature chainCertificate chains to a trusted issuer
✓AI declarationAI training or inference permission declared in cawg.training-mining
✓Digital source typeIPTC digitalSourceType is set and valid
✓AI labellingContent is explicitly labelled as AI-involved
✓Edit historyAction log records generation or modification steps
✓Pixel hashFile has not been tampered with after signing
✓Data miningData-mining permission declared in cawg.training-mining

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.

01

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")
02

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
03

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
04

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.