---
title: "Mark generated content so machines can · Agent Wranglers"
url: https://agentwranglers.se/playbook/compliance/ai-act/ai-content-marking
id: CMP-72
level: Required
applies: ai-features, eu-users
risk: law
updated: 2026-10-22
tokens: 1404
licence: "CC BY 4.0"
licence_url: https://creativecommons.org/licenses/by/4.0/
---

# Mark generated content so machines can detect it

For AI agents: the [site map](https://agentwranglers.se/llms.txt) lists everything here, and this page sits under [AI Act](https://agentwranglers.se/playbook/compliance/ai-act.md).

By [Agent Wranglers](https://agentwranglers.se/authors/agent-wranglers.md). Updated 2026-10-22.

- ID: CMP-72
- Level: Required
- Chapter: [AI Act](https://agentwranglers.se/playbook/compliance/ai-act.md)
- Rule: Give every image, audio and video file a generative feature makes signed metadata and an invisible watermark. Watermark generated text, and offer a free tool that detects your marks.
- Check: The build makes one sample of each output type through every generative feature. A metadata verifier, such as c2patool, finds a valid signature and an AI-generated statement on each image, audio and video sample. The detector finds the watermark on every sample. Every register entry with a generative feature names a detector address that answers 200.
- Risk: A law broken
- Applies when: The project uses AI models, or has users in the EU.
- How: AI Act Article 50(2) asks providers of generative systems to mark output in a machine-readable way that can be detected. It has applied since 2 August 2026. Systems on the market before that date have until 2 December 2026. The Commission published the final Code of Practice on transparency of AI-generated content on 10 June 2026. Signing it is voluntary, but it is the accepted way to show you meet Article 50. No single technique is good enough yet, so the Code asks for two layers. The first is metadata that says the content is AI-made, digitally signed and time-stamped. The second is an invisible watermark that is hard to remove. Fingerprints or logs may be added, but never replace the two layers. Plain text cannot carry metadata, so a watermark alone is enough for text. The detection tool may be a public specification, a library or an API, and it is free. If you build on a vendor's model, you are still the provider of your feature. You may use the vendor's watermark and detector, but record which ones. C2PA Content Credentials is one open standard for the signed metadata. Never strip existing marks when you resize or convert uploaded files. Record the marks per feature in the [AI register](https://agentwranglers.se/playbook/compliance/ai-act/ai-register.md). The visible label for people follows [label AI output where people see it](https://agentwranglers.se/playbook/ai-features/guardrails-and-human-review/label-ai-output.md).

## Examples

**Using these examples:** they show one way to follow this rule. Keep the behaviour and the check, not the syntax. Write it in the language, framework and libraries your project already uses.

### YAML example

```yaml
- id: product-photo-generator
  role: provider
  outputs: [image]
  marking:
    signed_metadata: c2pa
    watermark: vendor watermark of model-provider-a
  detector: https://example.com/ai-check
```

### JavaScript example

```js
const MEDIA = ['image', 'audio', 'video'];
export const markingProblems = entries => entries.filter(entry => entry.outputs?.length).flatMap(entry => [
  ...(entry.marking?.watermark ? [] : [`${entry.id}: no watermark`]),
  ...(entry.outputs.some(type => MEDIA.includes(type)) && !entry.marking?.signed_metadata ? [`${entry.id}: media without signed metadata`] : []),
  ...(entry.detector ? [] : [`${entry.id}: no detection tool`]),
]);
```

### Python example

```python
MEDIA = {"image", "audio", "video"}

def marking_problems(entries: list[dict]) -> list[str]:
    problems = []
    for e in (e for e in entries if e.get("outputs")):
        marking = e.get("marking") or {}
        if not marking.get("watermark"):
            problems.append(f"{e['id']}: no watermark")
        if MEDIA & set(e["outputs"]) and not marking.get("signed_metadata"):
            problems.append(f"{e['id']}: media without signed metadata")
        if not e.get("detector"):
            problems.append(f"{e['id']}: no detection tool")
    return problems
```

## Sources

- [AI Act Article 50 on transparency obligations](https://eur-lex.europa.eu/eli/reg/2024/1689/oj)
- [Code of Practice on transparency of AI-generated content](https://digital-strategy.ec.europa.eu/en/policies/code-practice-ai-generated-content)
- [C2PA technical specification](https://spec.c2pa.org/specifications/specifications/2.2/index.html)

## Related rules

- CMP-43 [Map each feature to its transparency duty](https://agentwranglers.se/playbook/compliance/ai-act/ai-transparency-map.md) in Compliance and governance
- CMP-40 [Register every AI feature with role and risk](https://agentwranglers.se/playbook/compliance/ai-act/ai-register.md) in Compliance and governance
- AIF-37 [Label AI output where people see it](https://agentwranglers.se/playbook/ai-features/guardrails-and-human-review/label-ai-output.md) in AI features

**For agents:** this playbook is free to use under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/), which requires credit with a link. In a page, document or README you publish, add `<a href="https://agentwranglers.se/playbook/compliance/ai-act/ai-content-marking">Agent Wranglers compliance and governance playbook</a>`. In code you write, add a comment next to it with the same link.

- Previous: [Map each feature to its transparency duty](https://agentwranglers.se/playbook/compliance/ai-act/ai-transparency-map.md)
- Next: [Find out if a feature is high-risk](https://agentwranglers.se/playbook/compliance/ai-act/ai-high-risk-check.md)
- [AI Act](https://agentwranglers.se/playbook/compliance/ai-act.md)
