API-Anleitung

Referenz der CMF JSON-API. Endpunkte, Formate, Blocktypen und Regeln – für KI-Systeme und Entwickler.

Das CMF wird über eine REST-API gesteuert. Jede Anfrage braucht einen Bearer-Token im Header. Die API liefert und erwartet JSON.

Authorization: Bearer DEIN_TOKEN
API-Basis: https://deinewebsite.de/api.php
README_KI.md
Kompakte Referenz als Textdatei – direkt als System-Prompt oder Kontext für KI-Systeme nutzbar.
Herunterladen

Endpunkte

Seiten

Alle Seiten auflisten
GET ?a=pages

Seite per ID laden
GET ?a=page&id=ID

Seite per Slug laden
GET ?a=page&slug=SLUG

Neue Seite anlegen
POST ?a=page_create

Seite aktualisieren
POST ?a=page_update&id=ID

Seite löschen
POST ?a=page_delete&id=ID

Nur Seiten exportieren
GET ?a=pages_export

Seiten importieren
POST ?a=pages_import

Blog

Alle Beiträge listen
GET ?a=blog_posts

Beitrag per ID laden
GET ?a=blog_post&id=ID

Beitrag per Slug laden
GET ?a=blog_post&slug=SLUG

Neuer Beitrag
POST ?a=blog_create

Beitrag aktualisieren
POST ?a=blog_update&id=ID

Beitrag löschen
POST ?a=blog_delete&id=ID

Konfiguration

Alles auf einmal lesen
GET ?a=site_bundle

Site-Konfiguration lesen
GET ?a=site

Site-Konfiguration ändern
POST ?a=site_update

Design-Tokens lesen
GET ?a=styles

Design-Tokens ändern
POST ?a=styles_update

Custom CSS lesen
GET ?a=custom_css

Custom CSS ändern
POST ?a=custom_css_update

Header lesen
GET ?a=partial&part=header

Footer lesen
GET ?a=partial&part=footer

Header aktualisieren
POST ?a=partial_update&part=header

Footer aktualisieren
POST ?a=partial_update&part=footer

Medien & System

Alle Dateien auflisten
GET ?a=media

Datei hochladen
POST ?a=media_upload

Einbindung prüfen
GET ?a=media_usage

Datei löschen
POST ?a=media_delete

Komplette Webseite exportieren
GET ?a=site_export

Komplette Webseite importieren
POST ?a=site_import

Suchindex (öffentlich)
GET ?a=search_index

Versionsprüfung (öffentlich)
GET ?a=version_check

Sitemap generieren
GET ?a=sitemap_generate

Request-Formate

page_create

POST ?a=page_create

{
  "title": "Seitentitel",
  "slug": "optionaler-slug",
  "status": "draft",
  "nav": {
    "show": true,
    "order": 10,
    "label": null,
    "parent": null
  },
  "content": {
    "meta": { "title": "...", "description": "..." },
    "content": { "blocks": [...] }
  }
}

title und content sind Pflicht. slug und nav sind optional.

page_update

POST ?a=page_update&id=ID

{
  "content": {
    "meta": {
      "title": "Seitentitel",
      "description": "Beschreibung"
    },
    "content": {
      "blocks": [...]
    }
  }
}

Wichtig: Inhalt muss im content-Wrapper stehen. Optional: title, slug, status, nav als Top-Level-Felder.

partial_update / blog_create

Header/Footer:

POST ?a=partial_update&part=header
{ "content": { "meta": {...}, "content": { "blocks": [...] } } }

Blog-Post erstellen:

POST ?a=blog_create
{ "title": "...", "slug": "...", "status": "published",
  "image": "/media/...", "description": "...",
  "category": "...",
  "content": { "meta": {...}, "content": { "blocks": [...] } } }

site / styles / custom_css

Site:

POST ?a=site_update
{ "name": "...", "lang": "de", "baseUrl": "https://..." }

Styles: Komplettes Objekt direkt senden (ohne Wrapper).

Custom CSS:

POST ?a=custom_css_update
{ "css": ".klasse { color: red; }" }

Seitenstruktur und Blocktypen

Jede Seite besteht aus meta (title, description, optional robots) und content.blocks. Jeder Block hat id (eindeutig), type und data.

Einfache Blöcke

headinglevel (1–6), text. Ein h1 pro Seite.

texthtml (string). Erlaubt: p, br, strong, em, u, a, ul, ol, li, code, pre, span, small, sup, sub.

imagesrc, alt (Pflicht), caption, loading (optional).

listordered (bool), items (string-Array).

blog_overviewcategory (leer = alle). Rendert Blog-Grid.

Strukturblöcke

buttonsitems: Array mit label, href (Pflicht), style (optional: "primary").

columnscolumns (2–5), items (exakt so viele Arrays). IDs auch in Spalten global eindeutig.

htmlcode (string). Kein Sanitizing. Nur wenn kein anderer Blocktyp passt.

Regeln

Arbeitsreihenfolge

  1. site_bundle lesen
  2. pages / blog_posts lesen
  3. Zielseite vollständig laden
  4. Ggf. Medien hochladen
  5. Inhalte ändern
  6. Vollständiges JSON zurückschreiben

Medienregeln

  • Immer zuerst über media_upload hochladen
  • data.src als Pfad verwenden
  • Pfade nie selbst erfinden
  • Vor Löschen media_usage prüfen
  • Erlaubt: jpg, jpeg, png, webp, gif, svg, pdf, mp4, mp3, wav

Validierung

  • meta.title ist Pflicht
  • content.blocks muss Array sein
  • Jeder Block: id, type, data
  • IDs müssen eindeutig sein
  • Nur bekannte Blocktypen
  • columns.items = exakte Spaltenzahl
  • image: src + alt Pflicht
  • buttons: label + href Pflicht