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.
| Output | How it is produced | Where it goes |
|---|---|---|
| JSON-LD blocks | Templates 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 drafts | AI model, grounded in your own content; never published without your review and approval | Fix ZIP (drafts/) and your dashboard |
| Approved content | An AI draft that a person reviewed, possibly edited, and approved | Fix ZIP (approved-content/); served as a page on connected sites |
| robots.txt, llms.txt, sitemap.xml, Markdown versions | Deterministic templates from your real pages — no AI model writes a word of them | Fix ZIP; served on connected sites |
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>
| Field | Type | Meaning |
|---|---|---|
haaplo:markId | string | Short identifier of the marked block; the SAME value appears in the data-haaplo-ai attribute of the HTML element that carries the block |
haaplo:generator | string | Who generated the content |
haaplo:model | string | The AI model(s) that contributed to the block, comma-separated — or "none — deterministic template" when no AI model wrote a word of it |
haaplo:rulebookVersion | string | The version of the haAplo rulebook in force at generation |
haaplo:generatedAt | string (ISO 8601) | When the block was generated |
haaplo:humanApproved | boolean | true only when a person reviewed and approved this content before publication |
haaplo:schema | string (URL) | This page — the documentation of the scheme |
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.
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.
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.
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.
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.
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.