haAplo
Run a free audit

AI transparency

Last updated: 18 August 2026 · This page IS the scheme's documentation — written so anyone can build a parser

haAplo generates content: structured data (JSON-LD), FAQ drafts, rewrites, and machine-readable files. Under the EU AI Act (Regulation (EU) 2024/1689, Article 50, in force since 2 August 2026) AI-generated content must be identifiable. We go further than the minimum: we mark everything we generate, including blocks built deterministically from data already on your pages, and we document the scheme here in public.

1. What haAplo generates

OutputHow it is producedWhere it goes
JSON-LD blocksTemplates filled with data verified on your pages; where a description is missing, an AI model drafts it (grounding-checked, discarded if it invents anything)Fix ZIP; injected into your pages by the plugin or Worker
FAQ and rewrite draftsAI model, grounded in your own content; never published without your review and approvalFix ZIP (drafts/) and your dashboard
Approved contentAn AI draft that a person reviewed, possibly edited, and approvedFix ZIP (approved-content/); served as a page on connected sites
robots.txt, llms.txt, sitemap.xml, Markdown versionsDeterministic templates from your real pages — no AI model writes a word of themFix ZIP; served on connected sites

2. The provenance node (JSON-LD)

Every JSON-LD entity we generate carries a haaplo:aiProvenance node saying who generated it, when, with which model, with which rulebook version, and whether a person approved it. The haaplo: prefix is declared in @context and resolves to https://haaplo.com/ai-transparency#. Example:

<script type="application/ld+json" data-haaplo-ai="ha-x7k2m1">
{
  "@context": ["https://schema.org", { "haaplo": "https://haaplo.com/ai-transparency#" }],
  "@type": "Organization",
  "name": "Example S.r.l.",
  "url": "https://example.it",
  "haaplo:aiProvenance": {
    "haaplo:markId": "ha-x7k2m1",
    "haaplo:generator": "haAplo (https://haaplo.com)",
    "haaplo:model": "claude-haiku-4-5, claude-sonnet-4-6",
    "haaplo:rulebookVersion": "1.3.0",
    "haaplo:generatedAt": "2026-08-18T09:00:00.000Z",
    "haaplo:humanApproved": false,
    "haaplo:schema": "https://haaplo.com/ai-transparency"
  }
}
</script>
FieldTypeMeaning
haaplo:markIdstringShort identifier of the marked block; the SAME value appears in the data-haaplo-ai attribute of the HTML element that carries the block
haaplo:generatorstringWho generated the content
haaplo:modelstringThe AI model(s) that contributed to the block, comma-separated — or "none — deterministic template" when no AI model wrote a word of it
haaplo:rulebookVersionstringThe version of the haAplo rulebook in force at generation
haaplo:generatedAtstring (ISO 8601)When the block was generated
haaplo:humanApprovedbooleantrue only when a person reviewed and approved this content before publication
haaplo:schemastring (URL)This page — the documentation of the scheme

3. The HTML attribute

Every HTML element we inject or serve that carries generated content has the attribute data-haaplo-ai="<markId>": the <script> tag of each JSON-LD block, the <section> of a published FAQ, the <html> element of a page we serve. A parser can rely on this: an element is haAplo-AI-marked if and only if it has a data-haaplo-ai attribute; a JSON-LD entity is haAplo-generated if and only if it has a haaplo:aiProvenance key.

4. Text banners

Generated text files (drafts, approved content) start with a one-line HTML comment carrying the same fields:

<!-- data-haaplo-ai="ha-x7k2m1" · AI-generated by haAplo · model: … · rulebook 1.3.0 · human approved: no. … Marking scheme: https://haaplo.com/ai-transparency -->

Deterministic files carry a plain signature instead (e.g. # robots.txt — generated by haAplo on …): no AI model is involved in them, and saying otherwise would be false.

5. Human review, recorded (Article 50(4))

Drafts are never published automatically: a person reviews, edits and approves them first. Every approval and rejection is written to an append-only registry — who acted, which content (a SHA-256 fingerprint of the approved text), and when. The database itself refuses edits to that registry: not even we can rewrite it.

6. Short texts that cannot carry a mark

Some AI-drafted texts are single short fields — a title, a meta description — where an embedded mark would break the field itself. Those are shown as drafts in the dashboard, applied by the site owner by hand, and their approval is recorded in the registry like every other draft. Prompt suggestions in the dashboard are AI-generated, labelled as such where they appear, and never stored. The same applies to off-site materials (a Google Business description, a directory card, an outreach email): they are pasted by hand into third-party forms where an embedded mark would break the field, so each one is labelled as an AI draft in the dashboard and carries a recorded mark identifier instead.

7. The scheme will follow the European standard

A European code of practice for marking AI-generated text does not exist yet (it is expected under Article 50(7)). Our marker lives in a single replaceable module: when the standard arrives, we adopt it in one place and every output follows.

8. A notice you can publish on your site

If haAplo prepared content for your website, you can copy this notice as is:

Parts of this website (structured data and some texts) were prepared with the help of artificial intelligence and reviewed by a person before publication. Every AI-generated block carries a machine-readable mark; the marking scheme is public at https://haaplo.com/ai-transparency.

Questions about the scheme: info@haaplo.com.

haAplo — user and AI-friendly websites. · Terms · Privacy · DPA · AI transparency