Especificação aberta

v1.0.0 Stable · In production CC BY 4.0 · MIT

ai-disclosure.json: Site-Level AI Transparency Manifest

A machine-readable, site-level declaration of the AI systems a website operates or publishes content from, the disclosure and marking methods in use, and where compliance evidence lives. It is an open standard for AI-content disclosure: an on-site publisher declaration mapped to EU AI Act Article 50 (Regulation (EU) 2024/1689), California SB 942 (the AI Transparency Act), and a growing set of other regimes. Anyone can adopt it as a global best-practice baseline where no law yet applies. The per-jurisdiction registry marks which duties are legally binding versus voluntary, and jurisdictions carried as tags only (no mapped provisions yet) are noted as such. The current AIDisclose reference implementation (snippet, scanner, evidence engine) runs against this version in production.

The disclosure obligations by jurisdiction are catalogued in a cited registry, published as the AI disclosure laws directory and shipped as data in packages/shared/src/jurisdictions.json.

Pattern precedents: robots.txt, security.txt (RFC 9116), /.well-known/gpc.json (Global Privacy Control). Namespace check (July 2026): ai-plugin.json (deprecated OpenAI plugins), agent.json, mcp.json / mcp/server-card.json, ai-catalog.json, and the ai-manifest.json IETF draft all serve agent discovery/automation; none declares transparency compliance. This spec occupies the compliance slot.

#1. Discovery

  • Canonical location: https://<domain>/.well-known/ai-disclosure.json
  • MUST return HTTP 200 (no redirect chains beyond same-origin), Content-Type: application/json; charset=utf-8
  • Each subdomain operating distinct AI systems SHOULD serve its own manifest
  • Pages MAY additionally declare: <link rel="ai-disclosure" href="/.well-known/ai-disclosure.json">
  • IANA well-known URI registration (RFC 8615) is intended once ≥2 independent implementations exist

#2. Design principles

  1. Declares, never detects. The manifest is a publisher's self-declaration; it makes no claim about content it does not list. Scanners audit marking coverage; they do not judge whether content is AI.
  2. Jurisdiction-neutral obligations. Each AI system optionally records the obligations it answers to, keyed by jurisdiction (obligations: [{ jurisdiction, provisions }]). Provision tags are jurisdiction-scoped strings. For example, the EU's art50-1art50-4 map to Article 50(1) interaction disclosure, 50(2) machine-readable marking, 50(3) emotion/biometric notice, and 50(4) deepfake & public-interest-text labelling; California's sb942-latent/sb942-visible/sb942-detection-tool map to SB 942. Adding a jurisdiction is a registry entry and requires no schema change. obligations is OPTIONAL: a voluntary adopter can publish a fully valid manifest with none.
  3. Assembles existing standards. Machine-readable marking references C2PA Content Credentials, IPTC DigitalSourceType, and schema.org; it does not invent a watermark.
  4. Code-of-Practice-aligned. The "AI" acronym label (localized: KI/IA/etc.) with minimum design standards (prominence, contrast, visibility from first exposure) is the central visible-disclosure tool, following the EU Code of Practice on Transparency of AI-Generated Content (published 10 June 2026). The fully-generated/AI-assisted taxonomy is OPTIONAL metadata here.
  5. Accessible and multilingual by construction: disclosure texts carry BCP-47 language tags; the reference snippet ships localized disclosure strings in the 24 official EU languages plus Simplified Chinese, Korean, Hindi, and Brazilian Portuguese (28 in total), and implementations MUST cover the languages of the audiences they serve.

#3. Schema (normative summary; full JSON Schema in /schema)

{
  "$schema": "https://aidisclose.io/schema/1.0.0/ai-disclosure.schema.json", // OPTIONAL
  "specVersion": "1.0.0",                  // REQUIRED
  "publisher": {                           // REQUIRED
    "name": "Acme GmbH",
    "domain": "acme.example",
    "contact": "mailto:ai-transparency@acme.example",
    "euRepresentative": "…"                // OPTIONAL (non-EU providers, EU AI Act Art. 22)
  },
  "lastUpdated": "2026-07-02",             // REQUIRED, full-date YYYY-MM-DD
  "languages": ["en", "fr", "de"],         // REQUIRED, BCP-47
  "aiSystems": [                           // REQUIRED, may be empty array
    {
      "id": "support-bot",                 // REQUIRED, unique slug
      "name": "Acme Support Assistant",
      "role": "deployer",                  // "provider" | "deployer" | "both"
      "kind": "conversational",            // conversational | content-generation |
                                           // emotion-recognition | biometric-categorisation | other
      "vendor": "…", "model": "…",         // OPTIONAL
      "purpose": "Customer support chat",
      "obligations": [                     // OPTIONAL; jurisdiction ids match the registry
        { "jurisdiction": "eu", "provisions": ["art50-1"] }
      ],
      "disclosure": {
        "methods": ["banner"],             // OPTIONAL, descriptive: banner | inline-label | icon | audio-notice | metadata
        "scope": "site",                   // OPTIONAL: site | page | element (default element).
                                           // site = one persistent notice on every page;
                                           // page = a notice only on URLs matching `pages`;
                                           // element = labels on [data-ai-content] elements.
        "pages": ["/blog/*", "/news/*"],   // OPTIONAL: URL path globs for scope "page"
        "placement": "chat-widget, first interaction",
        "texts": { "en": "You are chatting with an AI system.", "fr": "…" }
      },
      "editorialResponsibility": {         // OPTIONAL, per system: overrides the manifest-level
        "humanReview": true                // default. Drives the reviewed vs generated wording.
      },
      "agentInteractionPolicy": "always",  // OPTIONAL; "always" implements the EU Guidelines
                                           // rule for agents where human interaction is plausible
      "generationDegree": "ai-assisted"    // OPTIONAL: fully-ai-generated | ai-assisted | manipulated | unspecified
    }
  ],
  "contentMarking": {                      // RECOMMENDED where synthetic media is published
    "machineReadable": [
      { "standard": "C2PA", "scope": "images,video" },
      { "standard": "IPTC-DigitalSourceType", "scope": "images" },
      { "standard": "schema.org", "scope": "text" }
    ],
    "visibleLabel": { "style": "AI-acronym", "localized": true }
  },
  "editorialResponsibility": {             // OPTIONAL: site-wide default; the EU 50(4) text
    "humanReview": true,                   // exemption basis. A system's own value overrides it.
    "statementUrl": "https://acme.example/editorial-policy"
  },
  "evidence": {                            // REQUIRED
    "retentionMonths": 6,                  // ≥ 6
    "registerUrl": "…"                     // OPTIONAL (may be private)
  },
  "exemptions": [                          // OPTIONAL, documented per system
    { "systemId": "…", "basis": "obviousness | artistic | law-enforcement | editorial-review", "rationale": "…" }
  ]
}

A system's visible disclosure is placed by disclosure.scope: site and page render a persistent AI-content notice (site-wide, or on the URL globs in disclosure.pages, which is required when scope is page); element labels each [data-ai-content] element. The notice wording follows editorialResponsibility.humanReview (reviewed vs generated), except that generationDegree: fully-ai-generated or manipulated always reads as AI-generated regardless of review.

The skeleton above is illustrative. The JSON Schema at /schema/1.0.0/ is authoritative and includes fields not shown here (for example contentMarking.detectionToolUrl, contentMarking.machineReadable[].detectionEndpoint, visibleLabel.customLabel, publisher.legalName).

No-AI sites. A publisher operating no AI systems and publishing no AI-generated content sets noAiDeclared: true with an empty aiSystems: []. This relaxes the otherwise-required evidence object and renders a "Made by humans" badge. It is a publisher statement; AIDisclose does not verify it, since it does not detect AI.

Roles and duties. role records whether a system's operator is the AI system's provider, its deployer, or both. The 50(1) interaction notice is a provider design duty that the deployer routinely surfaces, so art50-1 is valid on any role. Only 50(2) machine-readable marking is provider-exclusive to embed, so art50-2 attaches to provider/both; a deployer republishing a provider's output preserves that marking rather than embedding it. The deployer duties (50(3) emotion/biometric notice, 50(4) deepfake and public-interest text) attach to deployer/both. mediaTypes and publicInterest record the medium and public-interest status so the applicable duties are unambiguous per medium: the 50(4) editorial-responsibility exemption (editorialResponsibility.humanReview with a statementUrl) applies to text systems on matters of public interest, not to synthetic image, audio, or video, which have only the narrow law-enforcement and (limiting, not eliminating) artistic bases.

Field constraints (enforced by the schema and the reference validator). publisher.contact MUST be a mailto: email or an https:// URL. publisher.domain MUST be a bare lowercase host (acme.example), with no scheme or path. Each aiSystems[].id MUST be a slug ([a-z0-9-], up to 64 characters) and MUST be unique within the manifest. Every exemptions[].systemId MUST reference a declared system's id. lastUpdated MUST be a full date YYYY-MM-DD (the pattern validates shape, not calendar validity). evidence.retentionMonths MUST be at least 6. When contentMarking.visibleLabel.style is custom, customLabel MUST be present.

Scope applies to content notices. disclosure.scope governs where a content-generation system's visible notice renders (site, page, or element). A conversational system's interaction banner is driven by kind, so scope does not change it.

Declaration-only metadata. Some fields are recorded for humans and auditors and are not acted on by the reference snippet or scanner: disclosure.methods (descriptive; kind and scope drive rendering), agentInteractionPolicy, contentMarking.visibleLabel (the reference snippet renders its own localized acronym label), mediaTypes, and publicInterest. They make a manifest self-describing and support downstream duty determination; a later revision may add consumers for them.

Extensibility. Every structural object accepts x--prefixed extension fields (e.g. x-vendor-note); the one exception is the disclosure.texts language map, which permits only BCP-47 keys. The known-value enums (kind, disclosure.methods, contentMarking.standard, exemptions.basis, …) tolerate new values, so vendors and future revisions can carry additional data without a breaking schema change. Parameterized obligations carry their data in obligations[].params (e.g. a re-disclosure cadence, a takedown window, a user threshold), keyed by the registry, so a new law's parameters ship without a schema change. Readers ignore what they do not recognize. specVersion is validated by major (^1.): a reader accepts any compatible 1.x manifest.

#4. Conformance levels

Jurisdiction-neutral: they describe how mature a publisher's disclosure is, independent of any single law.

  • L1 Declared: valid manifest served at the well-known path.
  • L2 Rendered: L1 + visible disclosures/labels present at declared placements (verifiable by crawler screenshot).
  • L3 Evidenced: L2 + evidence register with ≥6-month retention and per-item records (tool, version, reviewer, date).

The ≥6-month retention is the AIDisclose L3 evidence baseline. It is a product default; individual jurisdictions may require longer, which the registry records.

#5. Versioning & governance

Semver on specVersion, validated by major: the schema matches ^1., so any compatible 1.x manifest validates. The full-version document is frozen at its $id (/schema/1.0.0/); additive 1.x changes are published to the mutable major alias /schema/1/. Within a major the format is additive-only (new optional fields and enum values, never a removal or a tightened constraint), and the x- extension namespace plus open enums carry newer data through older readers and validators. Obligations are jurisdiction-keyed (obligations: [{ jurisdiction, provisions }]), so adding a jurisdiction is a registry entry and requires no schema change. Spec text CC-BY-4.0; reference implementation MIT. Changes go through public issues. The spec is designed for independent implementers, and the schema compiles under a stock JSON Schema validator with no plugins.

#6. Scope

The manifest declares and evidences on-site AI disclosures across jurisdictions. It states what a publisher discloses; it is operational tooling, not legal advice, and the per-jurisdiction registry marks where a duty is legally binding versus voluntary. Adjacent concerns have their own conventions and compose with this one: training-data opt-out belongs to ai.txt and TDM reservation; agent task automation belongs to agent.json and MCP.