{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://hejstack.com/export-specs/manifest.schema.json",
  "title": "hejstack Exportpaket: manifest.json",
  "description": "Inhaltsverzeichnis eines hejstack-Exportpakets (Datenexport oder Anbieterwechsel nach Art. 26 und 30 Data Act). Liegt im Wurzelverzeichnis jedes Teilarchivs. Exportformat 1.0, Stand 15.09.2026. Unbekannte Felder sind von Konsumenten zu ignorieren.",
  "type": "object",
  "required": ["format_version", "exported_at", "organisation", "categories", "files"],
  "properties": {
    "format_version": {
      "type": "string",
      "pattern": "^[0-9]+\\.[0-9]+$",
      "description": "Version des Exportformats, auf das sich alle Dateien des Pakets beziehen (z. B. \"1.0\")."
    },
    "exported_at": {
      "type": "string",
      "format": "date-time",
      "description": "Stichtag des Abzugs (ISO 8601 mit Zeitzone). Änderungen nach diesem Zeitpunkt sind nicht enthalten."
    },
    "organisation": {
      "type": "object",
      "required": ["id", "name", "slug"],
      "properties": {
        "id": { "$ref": "#/$defs/uuid" },
        "name": { "type": "string", "description": "Name der Organisation (Mandant)." },
        "slug": { "type": "string", "description": "Technisches Kürzel der Organisation." }
      }
    },
    "request": {
      "type": "object",
      "description": "Die Datenanfrage, aus der das Paket stammt (Portal › Einstellungen › Unternehmen › Datenanfragen).",
      "properties": {
        "id": { "$ref": "#/$defs/uuid" },
        "kind": { "type": "string", "enum": ["export", "switch", "deletion"], "description": "export = Datenexport, switch = Anbieterwechsel, deletion = Datenlöschung." },
        "requested_at": { "type": "string", "format": "date-time" },
        "requested_by_email": { "type": "string", "format": "email" }
      }
    },
    "categories": {
      "type": "array",
      "uniqueItems": true,
      "items": { "$ref": "#/$defs/category" },
      "description": "Im Paket enthaltene Datenkategorien."
    },
    "archive": {
      "type": "object",
      "description": "Nur bei Aufteilung in mehrere Teilarchive: laufende Nummer und Gesamtzahl. Jedes Teilarchiv trägt ein eigenes manifest.json mit den in ihm enthaltenen Dateien.",
      "properties": {
        "part": { "type": "integer", "minimum": 1 },
        "parts": { "type": "integer", "minimum": 1 }
      }
    },
    "files": {
      "type": "array",
      "items": { "$ref": "#/$defs/file" },
      "description": "Alle Dateien des Archivs außer manifest.json selbst, jeweils mit SHA-256-Prüfsumme."
    },
    "schemas": {
      "type": "object",
      "description": "Kategorie oder Dateiname → URL des zugehörigen JSON-Schemas (Stand zum Exportzeitpunkt).",
      "additionalProperties": { "type": "string", "format": "uri" }
    },
    "generator": {
      "type": "object",
      "properties": {
        "name": { "type": "string", "const": "hejstack" },
        "version": { "type": "string", "description": "Softwareversion der Plattform, die das Paket erzeugt hat." }
      }
    }
  },
  "$defs": {
    "uuid": { "type": "string", "format": "uuid" },
    "category": {
      "type": "string",
      "enum": ["dokumente", "wikis", "chats", "aufgaben", "postfach_wissen", "nutzer", "freigaben", "konfiguration", "audit_protokoll"]
    },
    "file": {
      "type": "object",
      "required": ["path", "sha256", "size_bytes"],
      "properties": {
        "path": { "type": "string", "description": "Pfad relativ zum Wurzelverzeichnis des Archivs, Trenner \"/\"." },
        "sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$", "description": "SHA-256-Prüfsumme des Dateiinhalts, hexadezimal." },
        "size_bytes": { "type": "integer", "minimum": 0 },
        "category": { "$ref": "#/$defs/category" }
      }
    }
  }
}
