API und Panel-Ausrichtung
Übersicht
Der Browser-Administrator bei /webadmin und Internal Content API sind zwei Eingangstüren zu denselben CMS-Daten, aber sie wurden nicht zur gleichen Zeit erstellt und decken nicht den gleichen Bereich ab. Das Panel ist die komplette Bedienoberfläche. Die API ist eine bewusst schmalere Oberfläche für vertrauenswürdige KI- und Bedienertools.
Dieses Dokument ist die maßgebliche Übersicht darüber, wo sich die beiden einig sind, wo die API weniger abdeckt und wo die Lücke eher eine bewusste Grenze als unvollendete Arbeit darstellt. Es existiert so:
- an KI oder Bedienertool kann herausfinden, was es nicht kann, bevor es es versucht;
- Ein Prüfer kann eine absichtliche Grenze von einem fehlenden Endpunkt unterscheiden;
- Roadmap-Arbeit hat eine einzige Liste, gegen die geschlossen werden kann.
Es handelt sich um einen Statusdatensatz, nicht um eine Spezifikation. Wenn ein Endpunkt ausgeliefert wird, aktualisieren Sie die Zeile hier im selben Commit.
So lesen Sie dies
Jede Zeile trägt einen Status:
| Status | Bedeutung |
|---|---|
| Ausgerichtet | Die API kann das leisten, was das Panel leistet. Form kann abweichen. |
| Teilweise | Ein Endpunkt ist vorhanden, deckt jedoch weniger Felder oder Vorgänge ab als das Panel. |
| Fehlt | Es ist kein API-Pfad vorhanden. Panel-nur durch Unterlassung, nicht durch Absicht. |
| Nur-Panel-Design | Bewusst ausgeschlossen. Der Grund wird in der Zeile vermerkt. |
„Panel-only by design“ ist kein Synonym für „hart“. Dies bedeutet, dass der Ausschluss die im Abschnitt „Grenzen“ von Internal Content API beschriebene Sicherheitslage darstellt: keine automatische Veröffentlichung, kein Crawling oder Remote-Abruf, kein willkürlicher Import/Export-Ersatz und keine Rechteausweitung durch ein Token.
API-Oberflächen
Die API ist kein einzelnes Präfix. Ein in das CMS integriertes Tool kommuniziert mit zwei:
| Präfix | Authentifizierung | Umfang |
|---|---|---|
| /webadmin/api | internal-api.token plus eine Funktion pro Route | Alles |
| /admin-api | internal-api.token plus eine Funktion pro Route | Site- und Domain-Datensätze, Legacy-Alias |
Die Aufteilung ist eher historischer als prinzipieller Natur. /admin-api existierte vor dem Fähigkeitsmodell und seine Routen überprüften nichts über die Token-Gültigkeit hinaus, bis domains.write und domains.delete eingeführt wurden – jedes gültige Token konnte eine Domäne hinzufügen oder entfernen. Die Domänenrouten leben jetzt auch unter /webadmin/api, wohin neue Integrationen führen sollten; Das Legacy-Präfix funktioniert weiterhin für vorhandene Bereitstellungstools.
Fähigkeiten sind in CmsApiTokenCapabilities definiert. Eine Lücke in diesem Dokument ist manchmal eine fehlende Fähigkeit oder eine fehlende Route.
Pages
| -Fähigkeit | Panel | API | Status |
|---|---|---|---|
| Seiten auflisten und lesen | Ja | GET /pages, GET /pages/{page} | Ausgerichtet |
| Erstellen Sie eine Entwurfsseite | Ja | POST /content/apply (create_draft_page) | Ausgerichtet |
| Slot-Inhalt auf einer Entwurfsseite ersetzen | Ja | POST /content/apply (replace_existing_draft_page) | Ausgerichtet |
| Gestaffelte Updates für veröffentlichte Seiten | Ja | POST /content/apply (staged-update modes) | Ausgerichtet |
| Eine Seite veröffentlichen | Ja | POST /pages/{page}/publish | Ausgerichtet |
| Ändern Sie das öffentliche Shell-Layout | Ja | PATCH /pages/{page}/layout | Ausgerichtet |
| Layout-Slots synchronisieren | Ja | POST /pages/{page}/sync-layout-slots | Ausgerichtet |
| Eine Seite löschen | Ja | DELETE /pages/{page} | Ausgerichtet |
| Seite CSS und JS-Assets | Ja | /pages/{page}/assets/* | Ausgerichtet |
| Benennen Sie eine Seite um oder ändern Sie ihren Slug oder Pfad | Ja | PATCH /pages/{page}/translations/{translation} | Ausgerichtet |
| Seitenübersetzungen: Gebietsschema hinzufügen, Namen, Slug, Pfad, SEO, Open Graph | bearbeiten Ja | /pages/{page}/translations/* | Ausgerichtet |
| Vorschau einer Seite | Ja | GET /pages/{page}/render, and /webadmin/pages/{page}/preview already took a Bearer token | Ausgerichtet |
| Seitenversionen und Wiederherstellungskandidaten | Ja | /pages/{page}/versions/* and /pages/{page}/version-candidates/* | Ausgerichtet – Bereiten Sie einen Vorschaukandidaten vor, bevor Sie sich vorsichtig bewerben |
| Einen Seitenbereich hinzufügen, entfernen oder neu anordnen | Ja | Nur sync-layout-slots und Slot-Quelle | Teilweise |
| Löschen Sie jeden Block in einem Seitenslot | Ja | Shared Slots haben clear; Seiten nicht | Teilweise |
| Eine Seite duplizieren | Ja | Keine | Fehlt |
| Eine Seite auf eine andere Site verschieben | Ja | Keine | Fehlt |
| Importieren Sie eine Seite aus JSON | Ja | Keine | Fehlt |
| HTML-zu-Block-Seitenkonverter | Ja | Keine | Fehlt |
| Massenlöschung von Seiten | Ja | Nur einzelnes Löschen | Teilweise |
| Andere Workflow-Übergänge als „Publish | “. Ja | Keine | Fehlt |
Die beiden, die diese Liste früher dominierten, sind geschlossen.
Seitenidentität und Seitenübersetzungen. create_draft_pageschreibtname,slug, Undpathauf eine Seitenübersetzungszeile für ein Gebietsschema, und bis zur Landung der Seitenübersetzungs-API konnte danach nichts mehr diese Zeile berühren: Die Ersetzungs- und Stufenaktualisierungsmodi normalisieren sichpageZunullund verarbeiten nur Slot-Inhalte. Eine Seite, die im falschen Pfad erstellt wurde, konnte nur durch Löschen und Neuerstellen behoben werden, keine Seite konnte ein zweites Gebietsschema erhalten und SEO auf Seitenebene –seo_title,seo_description,seo_keywords,og_title,og_description,og_image_media_id, die sich alle in dieser Zeile befinden, war nicht beschreibbar und fehlte auch in den Lesenutzdaten.
/pages/{page}/translations/*deckt jetzt alles ab, und weilPageTitel und Slug werden bis zur Standardübersetzung durchgelesen. Durch das Umbenennen dieser Übersetzung wird die Seite umbenannt. SehenLokalisierungwarum diese Felder in die Übersetzungszeile gehören undInternal Content APIfür den Schreibvertrag.
SEO-Standardwerte auf Website-Ebene sind aus einem anderen Grund immer noch nicht erreichbar; siehe Websites unten.
Blocks
| -Fähigkeit | Panel | API | Status |
|---|---|---|---|
| Blöcke auflisten und lesen | Ja | GET /blocks, GET /blocks/{block} | Ausgerichtet |
| Erstellen Sie einen Block in einem Seitenbereich | Ja | POST /pages/{page}/slots/{slot}/blocks | Ausgerichtet |
| Blockinhalt und -einstellungen aktualisieren | Ja | PATCH /blocks/{block} | Ausgerichtet |
| Blöcke neu anordnen | Ja | PATCH /pages/{page}/slots/{slot}/blocks/reorder | Ausgerichtet |
| Einen Block löschen | Ja | DELETE /pages/{page}/slots/{slot}/blocks/{block} | Ausgerichtet |
| Autor html Blöcke | Ja | Abgelehnt mit block_type_not_api_writable | Vom Design her nur für das Panel – das Roh-Markup wird weiterhin von Menschen überprüft |
Ab 1.91.0 machen acht native Medienblöcke auch mobile_media_id in Plänen und PATCH verfügbar, mit der gleichen Auswahl und dem gleichen Fallback wie im Panel. Siehe Medienbildvarianten.
Blocks sind der am besten ausgerichtete Bereich des CMS. Das Schreiben von Einstellungen wird zusätzlich durch BlockSettingsPatchPolicy eingeschränkt, was eher ein Schutz als eine Lücke ist.
Geteilte Slots
| -Fähigkeit | Panel | API | Status |
|---|---|---|---|
| Auflisten, lesen, erstellen | Ja | GET/POST /shared-slots | Ausgerichtet |
| Block erstellen, neu anordnen, löschen, löschen | Ja | /shared-slots/{sharedSlot}/blocks/* | Ausgerichtet |
| Veröffentlichen Sie Shared Slot-Blöcke | Ja | POST /shared-slots/{sharedSlot}/publish-blocks | Ausgerichtet |
| Weisen Sie einem Seitenslot einen Shared Slot zu | Ja | POST /pages/{page}/slots/{slot}/shared-slot | Ausgerichtet |
| Aktualisieren Sie einen Shared Slot (Beschriftung, Handle, Steckplatztyp, Layout, aktiver Status) | Ja | PATCH /shared-slots/{sharedSlot} | Ausgerichtet |
| Löschen Sie einen Shared Slot | Ja | DELETE /shared-slots/{sharedSlot} | Ausgerichtet |
| Verschieben Sie einen Shared Slot auf eine andere Site | Ja | Abgelehnt mit unsupported_shared_slot_fields | Absichtlich nur Panel – eine standortübergreifende Verschiebung, keine Umbenennung |
| Shared Slot-Revisionen: Auflisten, Anzeigen, Wiederherstellen | Ja | Keine | Fehlt |
Deletion erfordert die destruktive Funktion shared-slots.delete und weigert sich, einen Shared Slot von allen Seitenslots zu entfernen, auf die noch verwiesen wird, und listet die referenzierenden Slots auf, damit ein Tool sie zuerst trennen kann.
Media
| -Fähigkeit | Panel | API | Status |
|---|---|---|---|
| Auflisten, lesen, hochladen, Remote abrufen | Ja | /media, /media/fetch | Ausgerichtet |
| Beschreibende Metadaten aktualisieren | Ja | PATCH /media/{media} | Ausgerichtet |
| Ersetzen, verschieben, löschen | Ja | /media/{media}/replace, /move, DELETE | Ausgerichtet |
| Erstellen Sie einen Medienordner | Ja | POST /media/folders | Ausgerichtet |
| Bildtransformationen neu generieren | Ja | Keine | Fehlt |
| Massenlöschung | Ja | Nur einzelnes Löschen | Teilweise |
| Ändern Sie Speicherfelder, Binärdatei oder Ordner über PATCH | Ja | Abgelehnt mit unsupported_media_update_fields | Vom Design her nur für das Panel vorgesehen – Metadaten-Schreibvorgänge dürfen keine Bytes verschieben |
POST /media/folders lehnt einen Namen ab, der bereits unter demselben übergeordneten Ordner vorhanden ist, und gibt den vorhandenen Ordner zurück, sodass ein Wiederholungstool ihn wiederverwendet, anstatt Duplikate anzuhäufen.
Navigation
| Fähigkeit | Panel | API | Status |
|---|---|---|---|
| Menüs auflisten und lesen | Ja | /navigation-menus | Ausgerichtet |
| Erstellen Sie ein Menü | Ja | POST /navigation-menus | Ausgerichtet |
| Artikel erstellen, aktualisieren, neu anordnen, löschen | Ja | /navigation-menus/{menu}/items/* | Ausgerichtet |
| Ein ganzes Menü löschen | Ja | Keine | Fehlt |
| Löschen Sie ein Element, das untergeordnete Elemente hat | Ja | Abgelehnt, bis die Kinder behandelt werden | Nur Panel-Design – keine stille Kaskade |
Engagement und Nachrichten
| -Fähigkeit | Panel | API | Status |
|---|---|---|---|
| Lesen Sie Kommentare und Bewertungen | Ja | /engagement/comments, /engagement/ratings | Ausgerichtet |
| Moderater Kommentarstatus | Ja | PATCH /engagement/comments/{comment} | Ausgerichtet |
| Einen Kommentar löschen | Ja | Keine | Fehlt |
| Nachrichten im Kontaktformular: Auflisten, Lesen, Status, Löschen | Ja | Keine | Fehlen |
Kontaktnachrichten haben überhaupt keine API-Darstellung. Ein Tool kann über die API ein Kontaktformular erstellen, aber weder seine Einsendungen lesen noch erfahren, wohin sie übermittelt werden – siehe Sites.
Standorte und Konfiguration
Das Panel-Site-Formular schreibt mehr als zwanzig Felder. Die API deckt sie durch schmale Einzweck-Endpunkte ab: branding, head, timezone, public-theme, seo, contact-recipient und locales.
| Feld oder Fähigkeit | Panel | API | Status |
|---|---|---|---|
| Anzeigename, Slogan, Favicon, soziales Image, Markenpalette, Schriftarten | Ja | PATCH /sites/{site}/branding | Ausgerichtet |
| Benutzerdefinierter Kopf HTML | Ja | PATCH /sites/{site}/head | Ausgerichtet |
| Zeitzone | Ja | PATCH /sites/{site}/timezone | Ausgerichtet |
| Öffentliche Theme-Voreinstellung | Ja | POST /sites/{site}/public-theme | Ausgerichtet |
| Site CSS und JS überschreiben Dateien | Ja | /sites/{site}/assets/{type} | Ausgerichtet |
| Site-SEO-Standardwerte (seo_title, seo_description, seo_keywords) | Ja | PATCH /sites/{site}/seo | Ausgerichtet |
| E-Mail-Adresse des Empfängers kontaktieren | Ja | PATCH /sites/{site}/contact-recipient | Ausgerichtet |
| Gebietsschemazuweisung (locale_ids) | Ja | PUT /sites/{site}/locales | Ausgerichtet – strenger: weigert sich, ein Gebietsschema von Seitenübersetzungen zu trennen |
| Site-Name und Handle | Ja | Keine | Fehlt |
| Primärstandort-Flag | Ja | Keine | Fehlt |
| Site-Variablen | Ja | Keine | Fehlt |
| Eine Site erstellen oder löschen | Ja | Keine | Nur für Panel vorgesehen – site_create ist ein verbotener Planschlüssel |
| Eine Site klonen | Ja | Keine | Vom Design her nur auf das Panel beschränkt – die Vervielfältigung des gesamten Standorts liegt im Besitz des Betreibers |
| Eine Website bewerben | Ja | Keine | Nur Panel-Design – siehe Betrieb |
| Site-Export und -Import | Ja | Keine | Beabsichtigt, nur das Panel zu verwenden – willkürlicher Importersatz liegt außerhalb des Anwendungsbereichs |
| Domänen: auflisten, hinzufügen, aktualisieren, primär festlegen, entfernen, Status | Ja | /webadmin/api/sites/{site}/domains/* | Ausgerichtet |
Was hier noch fehlt, ist die Site-Identität – Name, Handle, primäres Flag – und Site-Variablen. Diese sind näher an der Bereitstellung als an Inhalten, und noch kein Tool hat sie benötigt.
Schema und Definitionen
Alles in dieser Gruppe ist lesbar und nichts davon ist beschreibbar.
| -Fähigkeit | Panel | API | Status |
|---|---|---|---|
| Seitenlayouts: Erstellen, Aktualisieren, Slot-Verwaltung | Ja | GET /page-layouts only | Teilweise – schreibgeschützt |
| Blocktypen: erstellen, aktualisieren, löschen | Ja | GET /block-types only | Teilweise – schreibgeschützt |
| Slot-Typen | Schreibgeschützte Liste | Keine | Fehlt – nicht einmal lesbar |
| Gebietsschemas: erstellen, aktualisieren, aktivieren, deaktivieren | Ja | POST /locales, PATCH /locales/{locale} | Ausgerichtet |
| Gebietsschemata: löschen | Ja | Keine | Fehlt |
| Symbolkatalog: lesen | Ja | GET /icon-catalog | Ausgerichtet |
| Symbolkatalog: Synchronisierung und Aktivierung | Ja | Keine | Fehlen |
Schreibgeschützter Schemazugriff ist vertretbar: Blocktypen und Layouts sind strukturelle Verträge, und wenn man sie von einem Token erfinden lässt, erweitert sich der Explosionsradius jedes späteren Schreibens von Inhalten. Es wird als „Teilweise“ und nicht als „Beabsichtigt“ erfasst, da eine solche Entscheidung nirgends niedergeschrieben ist.
Benutzer, System und Vorgänge
| -Fähigkeit | Panel | API | Status |
|---|---|---|---|
| Benutzerverwaltung | Ja | Keine | Nur Panel-Design – keine Rechteausweitung durch ein Token |
| API-Token-Verwaltung | Ja | Keine | Vom Design her nur Panel – ein Token darf keine Token prägen |
| Systemeinstellungen und Mailtest | Ja | Keine | Vom Design her nur auf das Panel beschränkt – die Installationsweite Konfiguration liegt im Besitz des Betreibers |
| Erstellung eines Backup-Wiederherstellungspunkts | Ja | backups.create Arme create_restore_point auf POST /content/apply | Ausgerichtet für diesen schmalen Vorgang |
| Backup wiederherstellen und herunterladen | Ja | Keine | Nur Panel-Design |
| Vorschau der Backup-Bereinigung und Ausführung | Ja | GET /system/backup-cleanup, POST /system/backup-cleanup/run | Abgestimmt auf separat gewährte backups.read und backups.delete |
| Überprüfen Sie das Systemupdate und führen Sie es aus | Ja | /system/updates/check, POST /system/updates, /system/updates/operations/{operation} | Abgestimmt auf 1.90.0 – installationsweites System-Token und explizite Versions-/Prüfsummengenehmigung; siehe Updates |
| Erstellen Sie den Suchindex neu | Ja | Keine | Fehlt |
| Besucherberichte | Ja | Keine | Fehlt |
| Plugins: Katalog durchsuchen und installieren, aktivieren, deaktivieren, einrichten, deinstallieren, ZIP-Upload | Ja | /plugins/* | Ausgerichtet |
| Plugins: Aktualisieren Sie ein installiertes Plugin aus dem Katalog | Ja | POST /plugins/catalog/{plugin}/update | Ausgerichtet |
| Plugins: Details zu einem Plugin lesen | Ja | Nur index | Teilweise |
Übergreifend: Unbekannte Planschlüssel
Bis dies behoben wurde, war jede Lücke in diesem Dokument seitens des Anrufers still.
POST /content/validate und POST /content/apply lehnten eine feste Liste verbotener Schlüssel ab – Veröffentlichungs- und Planungsschlüssel, Site-Erstellung, Remote-Abruf und destruktive Verben – aber nichts, was lediglich unerkannt blieb. Die Plannormalisierung las die ihm bekannten Schlüssel und ignorierte den Rest, sodass ein Plan mit page.seo_title ok: true zurückgab und ein 201 nichts davon schrieb. Ein Tool hat einen Erfolg gemeldet; nichts war passiert. Auch das Zurücklesen der Seite brachte es nicht zutage, da die Felder, die die API nicht schreiben kann, auch in ihren Lese-Payloads fehlen.
Unerkannte Schlüssel werden jetzt mit 422 und dem stabilen Code unsupported_plan_fields abgelehnt, und der Fehlerpfad benennt jedes abgelehnte Feld. Der akzeptierte Schlüsselsatz ist auf den Plan mode beschränkt: replace_slots ist beim Ersetzen einer Seite sinnvoll und beim Erstellen einer Seite abgelehnt.
Dadurch wird keine Lücke geschlossen. Dadurch werden sie erkennbar, was die Voraussetzung dafür ist, dass ein Tool auf das Panel zurückgreifen kann, anstatt einen Schreibvorgang zu melden, der nie stattgefunden hat.
Fahrplan
Sortiert danach, wie viel jeder entsperrt, nicht nach Aufwand.
Stufe 1 – abgeschlossen
Nicht erkannte Planschlüssel ablehnen mitSiehe Unbekannte Planschlüssel oben.422.Schreibendpunkt für Seitenübersetzung./pages/{page}/translations/*schreibt Name, Slug, Pfad, SEO und Open Graph und liest sie zurück.Aktualisierung der Seitenidentität.Wird mit 2 geliefert: Titel, Slug und Pfad sind Übersetzungsfelder, und die Standard-Gebietsschema-Übersetzung ist die eigene Identität der Seite.Shared Slot aktualisieren und löschen.PATCHUndDELETE /shared-slots/{sharedSlot}, Letzteres hinter dem Neuenshared-slots.deleteFähigkeit.
Stufe 2 – abgeschlossen
Erweitern Sie die Site-Einstellungen: SEO-Standards,contact_recipient_email,locale_ids./sites/{site}/seo,/contact-recipient, Und/locales.Seitenvorschau oder Render-Snapshot.GET /pages/{page}/render, mitformat=htmlund länderspezifisches Rendering. Als die Liste geschrieben wurde, wurde der Gültigkeitsbereich falsch festgelegt:/webadmin/pages/{page}/previewhat bereits ein Bearer-Token akzeptiert, daher bestand die Lücke in der Auffindbarkeit und der Auswahl des Gebietsschemas und nicht in der Fähigkeit zum Rendern.Erstellung von Medienordnern.GET/POST /media/folders.Capability-Gate für die Domänenrouten und Verschieben nach untenFertig, und/webadmin/api.updateUndset primarykam mit.
Was übrig bleibt
Alles, was oben noch als „Fehlend“ markiert ist, ist zweitrangig: Seitenduplizierung und Site-Verschiebungen, Massenvorgänge, der HTML-zu-Block-Konverter, Kommentarlöschung, Kontaktnachrichten, Schemaerstellung, Neuindizierung der Suche und Besucherberichte. Keines davon hindert ein Tool daran, eine Seite zu erstellen, zu prüfen, zu korrigieren und zu veröffentlichen, worum es bei den Stufen 1 und 2 ging. Wählen Sie nach Bedarf aus, anstatt die Liste durchzuarbeiten.
Stufe 3 – bewusste Grenzen
Benutzer, Token-Ausgabe, Systemeinstellungen, Backup-Wiederherstellung/-Download, Site-Erstellung und -Löschung, Klonen, Heraufstufen und Übertragen bleiben nur im Bedienfeld verfügbar. Systemaktualisierungen sind über separat gewährte, installationsweite API-Funktionen ab 1.90.0 verfügbar. Sie werden hier aufgelistet, sodass „nicht in der API“ eine aufgezeichnete Entscheidung und nicht eine ungeprüfte Abwesenheit ist.
Plugin-Lebenszyklus und Wiederherstellung bis 1.94.2
Ab 1.92.0 übernehmen Panel- und API-Installation/-Aktualisierung/-Aktivierung erforderliche Plugin-Datenbankänderungen automatisch und behalten nach einem Fehler einen deaktivierten Status bei. Aktivieren/Setup verwendet dasselbe Kompatibilitätsgate; Inkompatible Anfragen geben HTTP 409 und plugin_incompatible zurück. Ab 1.94.0 wird die Startup-Validierung in einem neuen Prozess vor der Aktivierung ausgeführt, erfolgreiche Updates behalten das vorherige Paket bei und Laufzeitquellen-/Routenfehler stellen das Plugin unter Quarantäne.
Recovery bei /webadmin/plugin-recovery ist eine separate authentifizierte Paneloberfläche. CMS 1.94.2 erfordert einen aktiven Super admin mit normalem Administratorzugriff. Es kann ein fehlerhaftes verwaltetes Plugin deaktivieren oder das beibehaltene Paket nur dann wiederherstellen, wenn keine Datenbankmigration ausgeführt wurde. Der Tokenzugriff auf /plugins/* ersetzt nicht diese Browser-Wiederherstellungsberechtigung. Siehe Plugin System.