API-Anleitung
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.phpKompakte Referenz als Textdatei – direkt als System-Prompt oder Kontext für KI-Systeme nutzbar.
Endpunkte
Seiten
Alle Seiten auflistenGET ?a=pages
Seite per ID ladenGET ?a=page&id=ID
Seite per Slug ladenGET ?a=page&slug=SLUG
Neue Seite anlegenPOST ?a=page_create
Seite aktualisierenPOST ?a=page_update&id=ID
Seite löschenPOST ?a=page_delete&id=ID
Nur Seiten exportierenGET ?a=pages_export
Seiten importierenPOST ?a=pages_import
Blog
Alle Beiträge listenGET ?a=blog_posts
Beitrag per ID ladenGET ?a=blog_post&id=ID
Beitrag per Slug ladenGET ?a=blog_post&slug=SLUG
Neuer BeitragPOST ?a=blog_create
Beitrag aktualisierenPOST ?a=blog_update&id=ID
Beitrag löschenPOST ?a=blog_delete&id=ID
Konfiguration
Alles auf einmal lesenGET ?a=site_bundle
Site-Konfiguration lesenGET ?a=site
Site-Konfiguration ändernPOST ?a=site_update
Design-Tokens lesenGET ?a=styles
Design-Tokens ändernPOST ?a=styles_update
Custom CSS lesenGET ?a=custom_css
Custom CSS ändernPOST ?a=custom_css_update
Header lesenGET ?a=partial&part=header
Footer lesenGET ?a=partial&part=footer
Header aktualisierenPOST ?a=partial_update&part=header
Footer aktualisierenPOST ?a=partial_update&part=footer
Medien & System
Alle Dateien auflistenGET ?a=media
Datei hochladenPOST ?a=media_upload
Einbindung prüfenGET ?a=media_usage
Datei löschenPOST ?a=media_delete
Komplette Webseite exportierenGET ?a=site_export
Komplette Webseite importierenPOST ?a=site_import
Suchindex (öffentlich)GET ?a=search_index
Versionsprüfung (öffentlich)GET ?a=version_check
Sitemap generierenGET ?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
heading – level (1–6), text. Ein h1 pro Seite.
text – html (string). Erlaubt: p, br, strong, em, u, a, ul, ol, li, code, pre, span, small, sup, sub.
image – src, alt (Pflicht), caption, loading (optional).
list – ordered (bool), items (string-Array).
blog_overview – category (leer = alle). Rendert Blog-Grid.
Strukturblöcke
buttons – items: Array mit label, href (Pflicht), style (optional: "primary").
columns – columns (2–5), items (exakt so viele Arrays). IDs auch in Spalten global eindeutig.
html – code (string). Kein Sanitizing. Nur wenn kein anderer Blocktyp passt.
Regeln
Arbeitsreihenfolge
- site_bundle lesen
- pages / blog_posts lesen
- Zielseite vollständig laden
- Ggf. Medien hochladen
- Inhalte ändern
- 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