# IPTC

> How OWG labels how an asset came to be, using IPTC's Digital Source Type vocabulary and AI properties, so the record reads the same in C2PA and in image and video metadata.

**Status:**
- **v0.93 (draft, for review):** a typed `asset.iptc` field, checked by the validator against the task that produced the asset.
- **v0.92:** the same object goes under `metadata.iptc` as a convention set by this page.

## What IPTC defines

The [International Press Telecommunications Council](https://iptc.org/) maintains the metadata that image and video pipelines already carry. Two parts of it describe AI involvement:

- **Digital Source Type** is a controlled vocabulary for how media came to be: captured, edited by people, enhanced by an algorithm, created in software, or made or edited by generative AI. Each value is a URI under `http://cv.iptc.org/newscodes/digitalsourcetype/`. See the [vocabulary](https://cv.iptc.org/newscodes/digitalsourcetype/).
- **AI properties.** [Photo Metadata 2025.1](https://iptc.org/std/photometadata/specification/IPTC-PhotoMetadata-2025.1.html) added four: AI System Used, AI System Version Used, AI Prompt Information and AI Prompt Writer Name. [Video Metadata Hub](https://iptc.org/standards/video-metadata-hub/) 1.7 added AI properties for video.

C2PA carries the same Digital Source Type URIs on its actions and ingredients. An asset labeled in these terms reads the same in an OWG document, in its embedded IPTC metadata and in its content credential.

## The hook

The labels sit on the **asset**, keyed by the IPTC property's XMP name. In v0.93:

```json
{
  "id": "cui_out_lighthouse_00001_png",
  "role": "output", "type": "image", "produced_by": "generate",
  "iptc": {
    "DigitalSourceType": "http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia",
    "AISystemUsed": "ComfyUI (sd_xl_base_1.0.safetensors)",
    "AIPromptInformation": "a lighthouse on a sea cliff at golden hour, 35mm film, cinematic\nNegative: blurry, text, watermark",
    "AIPromptWriterName": "Dana Ortiz"
  }
}
```

A v0.92 document carries the same object one level down, as `metadata.iptc`. Moving to v0.93 moves it up.

| Key in `iptc` | IPTC property (XMP) | Holds |
|---|---|---|
| `DigitalSourceType` | `Iptc4xmpExt:DigitalSourceType` | One of the current NewsCodes, as the full URI. The v0.93 schema enforces this |
| `AISystemUsed` | `Iptc4xmpExt:AISystemUsed` | The AI engine or model used |
| `AISystemVersionUsed` | `Iptc4xmpExt:AISystemVersionUsed` | Its version, if known |
| `AIPromptInformation` | `Iptc4xmpExt:AIPromptInformation` | The prompts given to the model. IPTC puts positive and negative statements in this one field |
| `AIPromptWriterName` | `Iptc4xmpExt:AIPromptWriterName` | Who wrote the prompt |

Unknown keys are rejected. Extensions use the `x-` prefix, as everywhere in OWG.

Three rules keep the record honest:

- **Omit what you don't know.** Leave a property out rather than writing an empty value or a guess.
- **Record the prompt writer only when someone states it.** A system cannot infer it. IPTC notes that the prompt writer is not thereby the creator.
- **Name every generation that reached the asset.** A composite of a local model's output and a hosted model's output names both systems and both prompts.

## How it maps

The Digital Source Type follows from what the producing task did, as declared by its [`ai_role`](/compliance#declaring-ai-involvement):

| The producing task | Digital Source Type |
|---|---|
| `generative`, made new content | `trainedAlgorithmicMedia` |
| `generative`, edited existing material (inpainting, outpainting, image-to-image below full strength) | `compositeWithTrainedAlgorithmicMedia` |
| `generative`, an AI element placed into other material | `compositeSynthetic` |
| `assistive` (denoise, up-res, model upscale) | `algorithmicallyEnhanced` |
| `none`, captured | `digitalCapture` |
| `none`, edited by people | `humanEdits` |
| `none`, made in software | `digitalCreation` |
| `ai_role` unset | No value until the task is reviewed |

IPTC retired three codes in 2024: `minorHumanEdits` (now `humanEdits`), and `softwareImage` and `digitalArt` (now `digitalCreation`). Map them forward when reading older assets. The v0.93 schema does not accept them in an OWG document.

## The agreement check (v0.93)

`OWG_IPTC_AI_MISMATCH` reports an asset whose Digital Source Type contradicts the `ai_role` of the task that produced it:

| Producing task | Digital Source Type | Result |
|---|---|---|
| `generative` | `trainedAlgorithmicMedia`, `compositeWithTrainedAlgorithmicMedia` or `compositeSynthetic` | Passes |
| `generative` | Any other value | `OWG_IPTC_AI_MISMATCH` |
| `assistive` or `none` | One of the three generative values | `OWG_IPTC_AI_MISMATCH` |
| `assistive` or `none` | Any other value | Passes |
| `ai_role` unset | Anything | Not checked here. [Rule R1](/compliance#the-baseline-rule-pack) reports the unset role |

The error points at the asset's label and names the task, because either one can be the side that is wrong.

## With C2PA and disclosure

- **With C2PA.** A [C2PA](/c2pa) manifest records a Digital Source Type on its actions. When an asset carries both a verified credential and `iptc`, the two should agree, and a disagreement is a finding.
- **With disclosure.** The Digital Source Type is a machine-readable statement of AI involvement on the asset itself. A compliance rule pack can accept it as the marking [rule R2](/compliance#the-baseline-rule-pack) looks for. Whether it satisfies a particular regulation is for the pack and the jurisdiction to decide.

## Reference workflow

[`comfyui-text-to-image.owg.json`](/corpus/comfyui-text-to-image.owg.json), from the [ComfyUI](/comfyui) binding. It is a v0.92 document, so its labels sit under `metadata.iptc`. All four are derived from the run.

## Known gaps

- **Agreement with C2PA is not checked.** The validator compares `iptc` with `ai_role`, but not with a C2PA credential's `ai_generated`. The [C2PA](/c2pa) page notes the same gap.
- **Labels cover whole assets only.** IPTC can scope a type to part of an image (Image Region) or a segment of a video (Video Metadata Hub markers), but OWG has no region field, so a label covers the whole asset.
- **The vocabulary is fixed in the schema.** The v0.93 schema lists IPTC's codes as they stand. A code IPTC adds later needs a schema revision before an OWG document can carry it.

See also: [ComfyUI](/comfyui), [C2PA](/c2pa), [Compliance](/compliance), [Assets and versioning](/assets-and-versioning), [Changelog](/changelog).
