Skip to content

What machines see

On the canonical page of any entity with a resolved disclosure, the module adds two things to the document head: a schema.org JSON-LD block and a <meta name="ai-disclosure"> tag. Both are on by default and each has its own checkbox on the Output tab.

The JSON-LD block

The block carries digitalSourceType, the schema.org property whose values echo the IPTC digital source type vocabulary. A grade stores the IPTC URI. The module translates that URI into the matching schema.org enumeration member, which is the form Google's structured data documentation asks for. Three IPTC terms have no schema.org member yet, and those come out as the IPTC URI itself.

Those URIs start with http://. The IPTC vocabulary declares its own identifiers that way, and schema.org repeats the same http:// URIs in its skos:exactMatch statements. Changing the scheme would name a different resource.

The @type is Article for nodes. A media entity gets ImageObject, VideoObject or AudioObject when the module maps its source plugin, and MediaObject when it does not. Everything else gets CreativeWork. A site that needs another type replaces the ai_disclosure.machine_readable service through a ServiceProvider. See For Developers.

The meta tag

The tag carries the grade, the verdict and the icon:

<meta name="ai-disclosure" content="ai_summarized; required=undetermined; icon=ai_generated">

required is one of required, not-required or undetermined, spelled out rather than reduced to 0 or 1. A consumer reading a zero could not tell "assessed and out of scope" from "not assessed", and that is the distinction the assessment exists to make. Where an evidently artistic work limits the manner of the disclosure, modality=unobtrusive is appended.

icon names the icon the page actually renders. A grade carrying an icon the module does not know draws no image, and the tag says icon=none rather than repeating the value stored on the grade. The two surfaces answer the same question, so a consumer never reads an icon that the reader cannot see.

Sites reading the previous required=0 / required=1 form need to be told: this is a published format that changed.

Media

A media entity only gets the marking above where it has a canonical page of its own. Drupal ships media.settings.standalone_url disabled, which leaves /media/1 without a page to mark. An AI image shown inside an article would go unmarked, so the page of the article lists it too.

When the JSON-LD block is on, the canonical page of an entity adds an ImageObject, VideoObject or AudioObject node to its document for every image, video or audio file it shows whose disclosure resolves to a grade with an IPTC URI, whatever the grade. The nodes sit under associatedMedia of the page's main entity:

{
  "@context": "https://schema.org",
  "@type": "Article",
  "@id": "https://example.com/node/1",
  "associatedMedia": [
    {
      "@type": "ImageObject",
      "contentUrl": "https://example.com/sites/default/files/team.png",
      "digitalSourceType": {"@id": "https://schema.org/TrainedAlgorithmicMediaDigitalSource"},
      "disambiguatingDescription": "This is synthetic media produced by AI."
    }
  ]
}

What counts as shown is what the entity's full view display holds, or its default display when full has no custom settings:

  • Image and file fields. Images are ImageObject, other files are typed by their MIME type (image/, video/, audio/), and the rest is left out.
  • Entity reference fields to media. The type comes from the media source and the file from its source field.
  • <drupal-media> elements in long formatted text. They are read from the stored text, so they count whatever the text format does with them.

Nothing is followed further. The media referenced by a media entity are not visited, and neither are those of an entity referenced from the page.

contentUrl is the original file, not an image style derivative. Each file is resolved as described in resolving disclosures for files, so a media entity with a disclosure of its own decides for its file. A file used twice on a page appears once, in display order, and a page lists at most 50.

A disclosure whose scope medium is text is skipped. It says the AI work was on the words, and an article graded that way would otherwise mark every photo in it as AI. A grade without an IPTC URI is skipped too, as there is nothing machine-readable to say.

A page whose entity has no disclosure of its own still gets a document when it shows AI media: @context, @type, url and associatedMedia, and no meta tag. A page with no AI media keeps the document described above, with no associatedMedia key.

Remote video

A media item whose source is an oEmbed video, such as one from YouTube or Vimeo, has no file. When it has a disclosure of its own that resolves to a grade with an IPTC URI, the page that shows it lists a VideoObject with the video's page URL as embedUrl, as contentUrl would claim a file the site does not serve:

{
  "@type": "VideoObject",
  "embedUrl": "https://www.youtube.com/watch?v=abc",
  "digitalSourceType": {"@id": "https://schema.org/TrainedAlgorithmicMediaDigitalSource"},
  "disambiguatingDescription": "This is synthetic media produced by AI."
}

The URL is the one stored in the media item's source field. Nothing is fetched from the provider. The same scope and IPTC rules apply as for files, and the node counts towards the limit of 50.

Turning off the JSON-LD block turns all of this off. The meta tag is unaffected, since it speaks for the page and not for its media. A media entity's own standalone page is not given an associatedMedia list.

Scope

This marking is a page-level signal for crawlers and aggregators. Article 50(2) asks a provider to mark the file itself, and a JSON-LD block does not survive someone saving the image. C2PA and watermark embedding stay out of scope for 1.0.