---
url: 'https://dxpr.com/de/hc/dokumentation/dxpr-builder-lernen/referenz/api-endpunkte'
title: 'API-Endpunkte | DXPR'
author:
  name: Jurriaan
  url: 'https://dxpr.com/users/jurriaan'
date: '2026-10-24T14:14:21+00:00'
updated: '2026-10-24T17:19:22+00:00'
copyright: 'Copyright DXPR. All rights reserved.'
type: article
summary: |-
  Diese Seite listet jede Route, die DXPR Builder in dxpr_builder.routing.yml registriert, mit den HTTP-Methoden, Zugriffsvoraussetzungen, Anfrageparametern und Antwortformen, wie in den Controllern implementiert. Das JavaScript des Editors ist der vorgesehene Client für die AJAX-Endpunkte; nichts auf dieser Seite ist eine stabile öffentliche API, und Parameternamen können sich zwischen Releases ändern.
  Zugriffsvoraussetzungen
  Routen nutzen drei Arten von Voraussetzungen. Eine Route kann sie kombinieren.
tags:
  - 'Configuration and API'
image: 'https://dxpr.com/themes/custom/dxpr_com/images/dxpr-share-card.jpg'
published: true
og:
  site_name: DXPR
  updated_time: '2026-10-24T17:19:22+0000'
  'image:alt': 'DXPR, powered by Drupal: AI-powered Drupal for marketers.'
schema:
  '@context': 'https://schema.org'
  '@graph':
    -
      mainEntity: {  }
    -
      '@type': TechArticle
      headline: API-Endpunkte
      description: |-
        Diese Seite listet jede Route, die DXPR Builder in dxpr_builder.routing.yml registriert, mit den HTTP-Methoden, Zugriffsvoraussetzungen, Anfrageparametern und Antwortformen, wie in den Controllern implementiert. Das JavaScript des Editors ist der vorgesehene Client für die AJAX-Endpunkte; nichts auf dieser Seite ist eine stabile öffentliche API, und Parameternamen können sich zwischen Releases ändern.
        Zugriffsvoraussetzungen
        Routen nutzen drei Arten von Voraussetzungen. Eine Route kann sie kombinieren.
      image:
        '@type': ImageObject
        url: 'https://dxpr.com/themes/custom/dxpr_com/images/dxpr-share-card.jpg'
        width: '1200'
        height: '630'
      datePublished: '2026-10-24T14:14:21+0000'
      dateModified: '2026-10-24T17:19:22+0000'
      author:
        '@type': Organization
        '@id': 'https://dxpr.com/#organization'
        name: DXPR
        url: 'https://dxpr.com/'
        logo:
          '@type': ImageObject
          url: 'https://dxpr.com/themes/custom/dxpr_com/dxpr-logo-dark.svg'
          width: '1348'
          height: '501'
      publisher:
        '@type': Organization
        '@id': 'https://dxpr.com/#organization'
        name: DXPR
        url: 'https://dxpr.com/'
        logo:
          '@type': ImageObject
          url: 'https://dxpr.com/themes/custom/dxpr_com/dxpr-logo-dark.svg'
          width: '1348'
          height: '501'
      mainEntityOfPage: 'https://dxpr.com/de/hc/dokumentation/dxpr-builder-lernen/referenz/api-endpunkte'
      articleSection: 'Konfiguration und API'
    -
      '@type': WebPage
      '@id': 'https://dxpr.com/de/hc/dokumentation/dxpr-builder-lernen/referenz/api-endpunkte'
      description: |-
        Diese Seite listet jede Route, die DXPR Builder in dxpr_builder.routing.yml registriert, mit den HTTP-Methoden, Zugriffsvoraussetzungen, Anfrageparametern und Antwortformen, wie in den Controllern implementiert. Das JavaScript des Editors ist der vorgesehene Client für die AJAX-Endpunkte; nichts auf dieser Seite ist eine stabile öffentliche API, und Parameternamen können sich zwischen Releases ändern.
        Zugriffsvoraussetzungen
        Routen nutzen drei Arten von Voraussetzungen. Eine Route kann sie kombinieren.
      breadcrumb:
        '@type': BreadcrumbList
        itemListElement:
          -
            '@type': ListItem
            position: 1
            name: Startseite
            item: 'https://dxpr.com/de'
      publisher:
        '@type': Organization
        '@id': 'https://dxpr.com/#organization'
        name: DXPR
      inLanguage: de
---
[Hilfe-Center](/de/hc)/[Dokumentation](/de/hc/dokumentation) /[DXPR Builder lernen](/de/hc/documentation/learn-dxpr-builder) /[Referenz](/de/hc/documentation/learn-dxpr-builder/reference) /[Konfiguration und API](/de/hc/documentation/learn-dxpr-builder/reference/config-and-api) # API-Endpunkte.

 DXPR Builder lernenReferenzKonfiguration und API

   ## In diesem Leitfaden

 Verwandte Leitfäden

- [Konfigurationsreferenz](/de/hc/dokumentation/dxpr-builder-lernen/referenz/konfigurationsreferenz)
- [API-Referenz](/de/hc/documentation/learn-dxpr-builder/development/api)
- [Hooks-API-Referenz](/de/hc/dokumentation/dxpr-builder-lernen/entwicklung/hooks-api)

Diese Seite listet jede Route, die DXPR Builder in `dxpr_builder.routing.yml` registriert, mit den HTTP-Methoden, Zugriffsvoraussetzungen, Anfrageparametern und Antwortformen, wie in den Controllern implementiert. Das JavaScript des Editors ist der vorgesehene Client für die AJAX-Endpunkte; nichts auf dieser Seite ist eine stabile öffentliche API, und Parameternamen können sich zwischen Releases ändern.

## Zugriffsvoraussetzungen

Routen nutzen drei Arten von Voraussetzungen. Eine Route kann sie kombinieren.

| Anforderung | Bedeutung |
|---|---|
| `_permission` | Der User braucht die genannte Drupal-Berechtigung. DXPR Builder definiert `administer dxpr builder configuration`, `edit with dxpr builder` und `administer dxpr_builder_profile` in `dxpr_builder.permissions.yml`; `view media` und `administer site configuration` kommen aus dem Core. |
| `_csrf_token` | Die Anfrage muss ein gültiges CSRF-Token im `token`-Query-Parameter tragen. Für den Haupt-AJAX-Handler holt der Editor eine URL mit dem Token von `/dxpr_builder/csrf` (oder aus der `dxpr_builder_csrf`-Operation). Für die anderen Routen legt der Feld-Formatter URLs mit einem Token in `drupalSettings.dxprBuilder`, zum Beispiel `fileUploadUrl`, `entityLinkSuggestionsUrl`, `userSettingsUrl` und `aiAgent.endpointUrl`. |
| `_dxpr_builder_billable_user` | Der User muss ein Billable User sein, wie unten definiert. |

### Was „billable user“ bedeutet

`DxprBuilderBillableUserAccessCheck` erlaubt Zugriff, wenn `DxprBuilderLicenseService::isBillableUser()` für das aktuelle Konto true zurückgibt. Diese Methode gibt false zurück für blockierte Konten und für Konten, deren `dxpr_user_is_disavowed`-Feld gesetzt ist (ein Administrator schließt einen User vom Bearbeiten auf der User-Licenses-Seite aus). Sonst gibt sie true zurück für User 1 und für jedes Konto, das die `edit with dxpr builder`-Berechtigung hält. Kurz: Ein Billable User ist ein aktives, nicht ausgeschlossenes Konto, das mit DXPR Builder bearbeiten darf, und der Lizenz-Service zählt diese Konten auf Ihren Produktschlüssel an.

### HTTP-Methoden

Wo eine Route `methods` deklariert, werden nur diese Methoden geroutet. Wo nicht, akzeptiert die Route jede Methode (Drupals `MethodFilter` filtert nur Routen, die Methoden deklarieren). Die Tabellen unten nennen die Methode, die das JavaScript des Editors tatsächlich nutzt, wenn das im Quellcode sichtbar ist.

## Editor-AJAX-Endpunkte

### CSRF-Token-URL

|  |  |
|---|---|
| Pfad | `/dxpr_builder/csrf` |
| Route | `dxpr_builder.csrf_refresh` |
| Methoden | Nicht deklariert (jede Methode). Der Editor sendet GET (`backend-connect.js`, `fetchCsrfTokenUrl()`). |
| Anforderungen | Billable user |
| Controller | `AjaxController::ajaxRefresh()` |

Die Anfrage muss den Header `X-Requested-With: XMLHttpRequest` tragen; ohne ihn gibt der Controller HTTP 403 mit dem JSON-Body `{"error": "Invalid request"}` zurück.

| Parameter | Quelle | Erforderlich | Hinweise |
|---|---|---|---|
| `enterprise` | Query-String | Optional | Wenn auf `true` gesetzt und das `dxpr_builder_e`-Modul installiert ist, wird das Token stattdessen für die `dxpr_builder_e.ajax_callback`-Route erzeugt. Ist es ohne dieses Modul auf `true` gesetzt, wirft der Controller eine Exception. |

Antwort: ein JSON-String mit der URL des Haupt-AJAX-Handlers und einem `token`-Query-Parameter. Die URL ist ein Pfad vom Site-Root (Basispfad enthalten, kein Host). Das JavaScript postet jede Builder-Operation an diese URL.

### Haupt-AJAX-Handler

|  |  |
|---|---|
| Pfad | `/dxpr_builder/ajax` |
| Route | `dxpr_builder.ajax_callback` |
| Methoden | Nicht deklariert (jede Methode). Der Controller liest jeden Parameter aus dem POST-Body, und der Editor sendet POST. |
| Anforderungen | Billable user, CSRF token |
| Controller | `AjaxController::ajaxCallback()` |

Das POST-Body-Feld `action` wählt die Operation. Jede Operation und ihre Parameter stehen unter [Main AJAX handler operations](#main-ajax-handler-operations). Wenn `action` fehlt oder unbekannt ist, gibt der Controller eine leere Drupal-`AjaxResponse` ohne Befehle zurück. Die meisten Operationen, die den Billable-User-Status erneut prüfen, geben dieselbe leere Antwort zurück, wenn diese Prüfung scheitert; die Tabellen nennen die zwei Ausnahmen.

### KI-Chat

|  |  |
|---|---|
| Pfad | `/dxpr_builder/ajax/ai/chat` |
| Route | `dxpr_builder.ai_chat` |
| Methoden | POST |
| Anforderungen | `edit with dxpr builder`, billable user, CSRF token |
| Controller | `AiChatController::chat()` |

Der Anfrage-Body ist JSON. Der Controller reicht die Anfrage an den `dxpr`-Provider des Drupal-`ai`-Moduls weiter, sodass kein API-Schlüssel den Browser erreicht. Vor dem Aufruf mischt er die Domains aus der `ai_output_allowed_domains`-Einstellung in den `ai`-Hostname-Filter des Moduls, wenn es diesen Service gibt. Ein Wert von `*` setzt den Filter stattdessen auf volles Vertrauen. Der Filter wird danach wiederhergestellt.

| Parameter | Quelle | Erforderlich | Hinweise |
|---|---|---|---|
| `messages` | JSON-Body | Erforderlich | Array von Objekten mit `role` und `content`. |
| `stream` | JSON-Body | Optional | Boolean, Standard `true`. |
| `model` | JSON-Body | Optional | Standard `kavya-m1`. |
| `prediction` | JSON-Body | Optional | Wird als Array an die Provider-Konfiguration übergeben. |
| `providers` | JSON-Body | Optional | Wird an die Provider-Konfiguration durchgereicht. |
| `allowed_html_tags` | JSON-Body | Optional | Wird an die Provider-Konfiguration durchgereicht. |
| `allowed_html_classes` | JSON-Body | Optional | Wird an die Provider-Konfiguration durchgereicht. |
| `web_search` | JSON-Body | Optional | Nur der Wert `false` wird weitergeleitet; jeder andere Wert wird ignoriert. |
| `response_format` | JSON-Body | Optional | Wird als Array an die Provider-Konfiguration übergeben. |

Antworten:

| Fall | Status | Body |
|---|---|---|
| Gestreamt (`stream` true und der Provider streamt) | 200, `Content-Type: text/event-stream` | Server-sent Events. Jedes Event ist `data: <JSON>`, wobei das JSON `choices[0].delta.content` hat und, wenn der Provider sie liefert, `id`, `object`, `created`, `model`, `original_model` und `usage`. Der Stream endet mit `data: [DONE]`. |
| Nicht gestreamt | 200, `application/json` | `{"choices": [{"message": {"role": "assistant", "content": "<text>"}}]}` |
| Body ist kein JSON, oder `messages` fehlt oder ist leer | 400, reiner Text | `Invalid request: messages required` |
| `model` steht nicht in der `allowed_models`-Liste von `ai_provider_dxpr.settings` (wird nur geprüft, wenn das `ai_provider_dxpr`-Modul installiert und die Liste gesetzt ist) | 403, `application/json` | `{"error": {"code": "model_not_allowed", "message": "The selected model is not allowed. Please refresh the page to update your model options."}}` |
| Provider-Exception | 500, `application/json` | `{"error": {"message": "The request could not be completed."}}` |

### KI-Bilderzeugung

|  |  |
|---|---|
| Pfad | `/dxpr_builder/ajax/ai/image` |
| Route | `dxpr_builder.ai_image` |
| Methoden | POST |
| Anforderungen | `edit with dxpr builder`, billable user, CSRF token |
| Controller | `AiImageController::generate()` |

| Parameter | Quelle | Erforderlich | Hinweise |
|---|---|---|---|
| `prompt` | JSON-Body | Erforderlich | Text-Prompt. |
| `model` | JSON-Body | Optional | Standard `kavya-image`. |
| `size` | JSON-Body | Optional | Wird an die Provider-Konfiguration weitergereicht, wenn nicht leer. |
| `quality` | JSON-Body | Optional | Wird an die Provider-Konfiguration weitergereicht, wenn nicht leer. |
| `background` | JSON-Body | Optional | Wird an die Provider-Konfiguration weitergereicht, wenn nicht leer. |

Antworten:

| Fall | Status | Body |
|---|---|---|
| Erfolg | 200 | `{"data": [{"b64_json": "<base64 image>"}]}`(nur das erste erzeugte Bild wird zurückgegeben) |
| Body ist kein JSON, oder `prompt` fehlt | 400 | `{"error": {"message": "Invalid request: prompt required"}}` |
| Provider gab kein Bild zurück | 500 | `{"error": {"message": "No image was generated"}}` |
| Provider-Exception | 500 | `{"error": {"message": "Image generation failed. Please try again."}}` |

### KI-Bildbearbeitung

|  |  |
|---|---|
| Pfad | `/dxpr_builder/ajax/ai/image/edit` |
| Route | `dxpr_builder.ai_image_edit` |
| Methoden | POST |
| Anforderungen | `edit with dxpr builder`, billable user, CSRF token |
| Controller | `AiImageController::edit()` |

| Parameter | Quelle | Erforderlich | Hinweise |
|---|---|---|---|
| `prompt` | JSON-Body | Erforderlich | Bearbeitungsanweisung. |
| `image` | JSON-Body | Erforderlich | Base64-kodiertes Quellbild (striktes Decoding). |
| `mimeType` | JSON-Body | Optional | Standard `image/png`; der Subtyp wird die Dateiendung, die an den Provider übergeben wird. |
| `model` | JSON-Body | Optional | Standard `kavya-image`. |
| `size`, `quality`, `background` | JSON-Body | Optional | Wird an die Provider-Konfiguration weitergereicht, wenn nicht leer. |

Antworten:

| Fall | Status | Body |
|---|---|---|
| Erfolg | 200 | `{"data": [{"b64_json": "<base64 image>"}]}` |
| Body ist kein JSON, oder `prompt` oder `image` fehlt | 400 | `{"error": {"message": "Invalid request: prompt and image required"}}` |
| `image` ist kein gültiges Base64 | 400 | `{"error": {"message": "Invalid image data: base64 decode failed"}}` |
| Provider gab kein Bild zurück | 500 | `{"error": {"message": "No image was generated"}}` |
| Provider-Exception | 500 | `{"error": {"message": "Image editing failed. Please try again."}}` |

### Datei-Upload

|  |  |
|---|---|
| Pfad | `/dxpr_builder/ajax/file_upload` |
| Route | `dxpr_builder.ajax_file_upload_callback` |
| Methoden | POST, DELETE (im Routing deklariert; der Controller hat einen einzigen Upload-Handler und keinen eigenen Delete-Zweig) |
| Anforderungen | Billable user, CSRF token |
| Controller | `UploadFileController::fileUpload()` |

| Parameter | Quelle | Erforderlich | Hinweise |
|---|---|---|---|
| `upload` | Multipart-Formulardateien, gesendet als `upload[]` | Erforderlich | Eine oder mehrere hochgeladene Dateien. |

Der Controller sortiert jede Datei nach dem ersten Teil ihres Client-MIME-Typs in `<default scheme>://dxpr_builder_images`, `dxpr_builder_videos` oder `dxpr_builder_files`. Ein Bild braucht eine Endung der MIME-Typen `image/gif`, `jpg`, `jpeg`, `png`, `webp`, `avif` oder `svg`. Ein Video braucht einen von `video/webm`, `ogv`, `ogg`, `mp4` oder `quicktime` (zum Beispiel `.mov`). Das Größenlimit ist das Upload-Maximum von PHP. Eine Datei mit gleichem Namen und identischem SHA-256-Inhalt wie eine vorhandene verwaltete Datei, die der User sehen kann, wird wiederverwendet statt erneut gespeichert. Wenn das `media`-Modul installiert ist und ein Medientyp namens `image`, `media_image`, `video` oder `media_video` existiert, wird eine veröffentlichte Medien-Entity für die Datei erstellt (oder wiederverwendet). Die Dateinutzung wird unter dem `dxpr_builder`-Modul verzeichnet.

Antworten:

| Fall | Status | Body |
|---|---|---|
| Erfolg | 201 | JSON-Array, ein Objekt pro Datei: `url` (absolute Datei-URL), `uuid` und `id` (der Medien-Entity, wenn es eine gibt, sonst der Datei), `fid` (Datei-ID), `entity_type` (`media` oder `file`). |
| Keine `upload`-Dateien | 400 | `{"message": "No files were uploaded."}` |
| Ungültiger Upload, unbeschreibbares Ziel oder Speicherfehler | 500 | `{"message": "<reason>"}` |
| Validierungsfehler (Endung oder Größe) | 422 | `{"message": "<violation messages>"}` |
| Dateiname bereits von einer anderen Anfrage gesperrt | 503 | `{"message": "File \"<name>\" is already locked for writing."}` |

### Medienbibliothek-Dialog

|  |  |
|---|---|
| Pfad | `/dxpr_builder/media-library` |
| Route | `dxpr_builder.media_library` |
| Methoden | Nicht deklariert (jede Methode). Parameter werden aus dem Query-String gelesen. |
| Anforderungen | `view media`; Admin-Route |
| Controller | `AjaxController::openImageMediaLibrary()` |

| Parameter | Quelle | Erforderlich | Hinweise |
|---|---|---|---|
| `media_type` | Query-String | Optional | `image` (Standard) oder `video`. |
| `remaining_slots` | Query-String | Optional | Anzahl der Elemente, die der Opener akzeptiert; Standard ist 1. |
| `uuid` | Query-String | Optional | Wird als `opener_parameters.uuid` an den Opener übergeben. |

Der angebotene Medientyp hängt von der `media_browser`-Einstellung ab: `media_library` nutzt den `image`- oder `video`-Medientyp direkt; `media_library_acquia_dam` nutzt `acquia_dam_image_asset` oder `acquia_dam_video_asset`, wenn es diesen Medientyp gibt.

Antworten:

| Fall | Ergebnis |
|---|---|
| Erfolg | Ein Render-Array, gebaut von `MediaLibraryUiBuilder::buildUi()` mit dem Opener `media_library.opener.dxpr_builder`. Drupal rendert es als HTML-Seite für einen iframe. |
| `media_library`-Modul nicht installiert | 403, reiner Text `Media Library is not enabled. Please enable it to access this feature.` |
| Nicht unterstützter `media_type` | 400, reiner Text `Unsupported media type "<value>".` |
| `media_browser`-Einstellung hat keinen nutzbaren Medientyp | 400, reiner Text `The "<setting>" settings is not supported.` |

### Hilfe-Link-Validator

|  |  |
|---|---|
| Pfad | `/dxpr_builder/ajax/help_link_validator` |
| Route | `dxpr_builder.ajax_help_link_validator` |
| Methoden | Nicht deklariert (jede Methode). Das Dev-Skript `dxpr_builder_dev.js` sendet POST mit einem formularkodierten Body. |
| Anforderungen | Billable user |
| Controller | `AjaxController::validateHelpLink()` |

| Parameter | Quelle | Erforderlich | Hinweise |
|---|---|---|---|
| `help_link` | POST-Body | Erforderlich für eine sinnvolle Antwort | Nur `http`- oder `https`-URLs auf Host `dxpr.com` mit einem Pfad ab `/documentation/` werden geprüft. |

Antwort: ein JSON-Array. `[true]`, wenn ein HEAD-Request an den Link (ohne Redirects zu folgen) 200 zurückgibt; `[false]`, wenn der HTTP-Client eine Exception wirft; `[]` in jedem anderen Fall, auch bei fehlendem Parameter, nicht passender URL oder non-200-Status.

### Entity-Link-Vorschläge

|  |  |
|---|---|
| Pfad | `/dxpr_builder/entity-link-suggestions` |
| Route | `dxpr_builder.entity_link_suggestions` |
| Methoden | GET |
| Anforderungen | `edit with dxpr builder`, CSRF-Token; `no_cache`-Routenoption |
| Controller | `EntityLinkSuggestionsController::suggestions()` |

| Parameter | Quelle | Erforderlich | Hinweise |
|---|---|---|---|
| `q` | Query-String | Erforderlich für Ergebnisse | Suchtext, kleingeschrieben. Ein Wert wie `/node/123` lädt diese Entity direkt. |
| `langcode` | Query-String | Optional | Sprache der Host-Entity; Standard ist die aktuelle Sprache. Nur Entities in dieser Sprache werden zurückgegeben. |

Bundles sind die mit `ckeditor5_link_suggestions` in deren Bundle-Info; wenn keine konfiguriert sind, werden alle Node-Bundles durchsucht. Bis zu 100 Entities pro Entity-Typ werden mit einer `CONTAINS`-Suche über die Entity-Referenz-Auswahlplugins des Cores gefunden.

Antwort: `{"suggestions": [...]}` mit privater Cacheability und einer Max-Age von 300 Sekunden. Jeder Vorschlag hat `description`, `entity_type_id`, `entity_uuid`, `group`, `label` und `path`. Wenn `q` nichts trifft, hält das Array einen einzigen manuellen Link-Vorschlag mit `description`, `label` (die kleingeschriebene Eingabe) und `path` (die Eingabe, wenn sie eine gültige URL ist, sonst ein leerer String). Wenn `q` leer ist, `suggestions` ist ein leeres Array.

### User-Editor-Einstellungen

|  |  |
|---|---|
| Pfad | `/dxpr_builder/user-settings` |
| Route | `dxpr_builder.user_settings` |
| Methoden | POST |
| Anforderungen | `edit with dxpr builder`, CSRF-Token; `no_cache`-Routenoption |
| Controller | `UserSettingsController::save()` |

Der Editor sendet diese Anfrage, wenn ein User seine eigenen Editor-Einstellungen ändert, zum Beispiel unter **Editor settings**. Die Werte werden beim Benutzerkonto gespeichert in `user.data`, Modul `dxpr_builder`.

| Parameter | Quelle | Erforderlich | Hinweise |
|---|---|---|---|
| `controls_layout` | JSON-Body | Erforderlich (die einzige Einstellung) | `element`, `breadcrumb` oder `default`. `default` entfernt die Wahl des Users, sodass die Profil- oder Site-Einstellung gilt. |

Antworten:

| Fall | Status | Body |
|---|---|---|
| Gespeichert | 200 | `{"settings": {"controls_layout": "<value>"}}`: jede Einstellung nach dem Speichern, `default`, wo der User keine Wahl gespeichert hat. |
| Body ist kein nicht-leeres JSON-Objekt, oder ein Name oder Wert ist ungültig | 400 | `{"error": "Invalid setting or value."}`. Nichts wird gespeichert. |

## Operationen des Haupt-AJAX-Handlers

Alle Operationen gehen an `/dxpr_builder/ajax` mit dem Token-Query-Parameter von `/dxpr_builder/csrf`. Der Operationsname wird im POST-Body-Feld `action` gesendet; alle anderen Parameter sind POST-Body-Felder, sofern nicht anders angegeben. Die Spalte „Erneuter Billable-Check“ markiert Operationen, die `isBillableUser()` erneut innerhalb des Switch aufrufen. Wenn diese Prüfung scheitert, geben sie die leere `AjaxResponse` von oben zurück, sofern die Zeile nichts anderes sagt.

### Sitzung und Zugriff

| Operation | Parameter | Erneuter Billable-Check | Rückgabe |
|---|---|---|---|
| `dxpr_login` | Keine | Nein | JSON-Boolean: ob der aktuelle User billable ist. |
| `dxpr_builder_csrf` | Keine | Ja | JSON-String: die Handler-URL mit einem `token`-Query-Parameter (wie `/dxpr_builder/csrf` ohne die `enterprise`-Option). |

### Container (Felder, die mit dem DXPR-Builder-Formatter gerendert werden)

| Operation | Parameter | Erneuter Billable-Check | Rückgabe |
|---|---|---|---|
| `dxpr_get_container_types` | Keine | Ja | JSON-Objekt mit Schlüssel `entity_type\|bundle` und Wert `entity_type - bundle`, ein Eintrag pro Bundle, dessen Standard-Anzeigemodus den `dxpr_builder_text`-Formatter auf mindestens einem Feld nutzt. |
| `dxpr_get_container_names` | `container_type` (erforderlich, `entity_type\|bundle`) | Ja (gibt einen leeren JSON-String statt der leeren Antwort zurück) | JSON-Objekt mit Schlüssel `entity_id\|field_name` (oder `entity_id\|field_name\|langcode` für übersetzbare Entities) mit Wert `entity label\|field label`. Wenn `container_type` fehlt oder die Billable-Prüfung scheitert, ist die Antwort ein leerer JSON-String. |
| `dxpr_save_container` | `type` (erforderlich, `entity_type\|bundle`); `name` (erforderlich, `entity_id\|field_name` oder `entity_id\|revision_id\|field_name`); `htmlContent` (erforderlich, kodiertes Markup); `lang` (optional, Standard ist die Site-Standardsprache) | Ja | JSON-Leerstring bei Erfolg. HTTP 400 mit einer JSON-Nachricht, wenn `htmlContent` kein String ist oder die Sprache auf eine nicht übersetzbare Entity nicht zutrifft; 404, wenn die angefragte Übersetzung nicht existiert; 500, wenn die Entity nicht geladen werden kann. |

`dxpr_save_container` tut Folgendes:

1. Dekodiert `htmlContent`: XOR jedes Byte mit 7, dann URL-dekodieren.
2. Schreibt das Ergebnis ins erste Delta des genannten Felds.
3. Erstellt eine neue Standard-Revision mit der Log-Nachricht `Saved with DXPR builder`, wenn der Entity-Typ revisionierbar ist.
4. Entfernt jede Inhaltssperre für die Entity.
5. Aktualisiert `block_revision_id` in Layout-Builder-Sektionen, die den gespeicherten Inline-Block referenzieren.
6. Erhöht den `dxpr_builder.saves_count`-State-Wert.

Das Speichern geschieht nur, wenn der User `update`-Zugriff auf die Entity hat. Ohne ihn gibt die Operation dennoch die Leerstring-Erfolgsantwort zurück.

### CMS-Elemente (Blöcke und Ansichten)

| Operation | Parameter | Erneuter Billable-Check | Rückgabe |
|---|---|---|---|
| `dxpr_builder_get_cms_element_names` | Keine | Ja | JSON-Objekt aus `DxprBuilderService::getCmsElementNames()` mit den Schlüsseln `list`, `disallowed` und `blockCategories`. |
| `dxpr_get_cms_element_settings` | `name` (erforderlich): `view-<view_id>-<display_id>` oder `block-<plugin_id>`; `ajax_page_state[libraries]` (optional, kommagetrennte, bereits geladene Libraries) | Ja | JSON-Objekt mit `css`, `js`, `settings` und `data`. Für eine Ansicht ist `data` die gerenderten Exposed-Filter-Widgets; für einen Block ist `data` das Konfigurationsformular des Blocks, verpackt in `<form>`-Tags, ohne die Elemente `provider`, `admin_label`, `label`, `label_display` und `context_mapping`, und mit allen geöffneten Details-Elementen. |
| `dxpr_builder_load_cms_element` | `name` (erforderlich, geparst von `parseStringForCmsElementInfo()`); `settings` (erforderlich); `data` (erforderlich, Array); `ajax_page_state[libraries]` (optional) | Nein | JSON-Objekt mit `css`, `js`, `settings` und `data`, wobei `data` der gerenderte Block oder die gerenderte Ansichts-Anzeige ist. |

In beiden `settings`-zurückgebenden Operationen sind `css` und `js` gerenderte Asset-Tags, die noch nicht auf der Seite sind, und `settings` ist das dekodierte `drupalSettings`-Objekt, oder ein leerer String, wenn es keine gibt.

### Seitenvorlagen

| Operation | Parameter | Erneuter Billable-Check | Rückgabe |
|---|---|---|---|
| `dxpr_get_page_templates` | Keine | Ja | JSON-Array aktivierter Seitenvorlagen, jede mit `title`, `uuid`, `module` (immer `null`: die Entity speichert es nicht), `category`, `date`, `weight` (Ganzzahl) und `image` (eine `data:`-URL, oder die `not-found.png`-URL des Moduls). |
| `dxpr_load_page_template` | `uuid` (erforderlich) | Ja | HTML-Antwort mit dem Vorlagen-Markup und ersetzten Basis-Tokens; leer, wenn keine aktivierte Vorlage passt. |

### Benutzervorlagen

| Operation | Parameter | Erneuter Billable-Check | Rückgabe |
|---|---|---|---|
| `dxpr_get_templates` | Keine | Ja | JSON-Array von Vorlagen des aktuellen Users oder als global markiert; Vorlagen, deren Autorkonto nicht mehr existiert, fehlen. Jeder Eintrag hat `id`, `uuid`, `name`, `global`, `current_user_is_author`, `author_id`, `author_name`, `type` und, wenn gespeichert, `image` (eine `data:`-URL). |
| `dxpr_load_template` | `uuid` (erforderlich) | Ja | HTML-Antwort mit dem Vorlagen-Markup und ersetzten Basis-Tokens; leer, wenn keine aktivierte Vorlage passt. |
| `dxpr_save_template` | `name` (erforderlich); `template` (erforderlich, Markup); `type` (optional, Standard `custom`); `global` (optional, zu Boolean gecastet); `image` (optional: ein Base64-String oder eine `data:image`-URL im POST-Body, oder ein Multipart-Dateifeld namens `image`) | Ja | JSON-Objekt mit `message` und `code`. `code` 200 bei Erfolg; `code` 409 (HTTP-Status 200), wenn eine Vorlage mit gleichem Systemnamen existiert; `code` 400 mit HTTP 400, wenn das Bild keine gültigen Bilddaten enthält. |
| `dxpr_delete_template` | `name` (erforderlich) | Ja | JSON-Leerstring. |

Der Systemname leitet sich ab aus `name`, indem er kleingeschrieben wird und jede Folge von Zeichen außerhalb von `a-z0-9_` durch einen Unterstrich ersetzt wird. `type` fällt zurück auf das `data-azb`-Attribut im Markup, wenn eine gespeicherte Vorlage keinen Typ hat.

### Bilder

| Operation | Parameter | Erneuter Billable-Check | Rückgabe |
|---|---|---|---|
| `dxpr_builder_get_image_urls` | `entityIDs` (erforderlich, Array); `imageStyle` (erforderlich; `original` für die ungestylte Datei); `entityType` (erforderlich; `media` löst Medien-Items auf, jeder andere Wert wird als Entity-Typ der IDs genutzt) | Ja | Text-Body: kommagetrennte Bild-URLs. Dateien geben eine Root-relative URL mit einem `fid`-Query-Parameter. Medien-Items vom Typ `image` oder `video` lösen zu ihrer Quelldatei auf. `acquia_dam_image_asset`-Items geben die DAM-URL mit hinzugefügten `mid`, `acquiaDamAsset` und `imageStyle`. Andere Medien-Items werden übersprungen. HTTP 204 ohne Body, wenn `entityIDs` leer ist oder wenn kein Medien-Item aufgelöst werden kann. |
| `dxpr_builder_get_image_style_url` | `imageStyle` (erforderlich); `entityId` (erforderlich); `entityTypeId` (erforderlich, `file` oder `media`) | Ja | Text-Body. Für eine Datei: ihre Root-relative URL durch den Bildstil (SVG-Dateien und `original` überspringen den Bildstil), mit einem `fid`-Query-Parameter. Für ein `acquia_dam_image_asset`-Medien-Item: die DAM-URL. HTTP 204 ohne Body für jede andere Entity, oder wenn die Entity nicht gefunden wird. |
| `dxpr_builder_get_image_metadata` | `entityId` (erforderlich); `entityType` (erforderlich, `file` oder `media`) | Ja (gibt 403-JSON statt der leeren Antwort zurück) | `{"data": {"alt": "...", "title": "..."}}` aus dem Bildquellenfeld des Medien-Items (ein Acquia-DAM-Asset gibt seinen DAM-Alt-Text und einen leeren Titel). Für eine Datei kommen die Werte aus dem ersten Medien-Item, dessen `field_media_image` darauf verweist. `data` ist ein leeres Array, wenn die Entity weder Datei noch Medien-Item ist, oder wenn kein Medien-Item die Datei referenziert. Fehler: 400 `{"error": "Missing required parameters"}`, 404 `{"error": "Entity not found"}`, 500 `{"error": "Failed to load entity"}`, 403 `{"error": "Access denied"}`. |

### Inhaltssperren

| Operation | Parameter | Erneuter Billable-Check | Rückgabe |
|---|---|---|---|
| `dxpr_content_lock_status` | `entity_id`, `revision_id`, `entity_type`, `langcode` (alle erforderlich) | Nein | JSON-Objekt mit `status` (Boolean) und `label` (Entity-Label); wenn gesperrt, auch `entity_lock_author_id` und `entity_lock_author_name`. |
| `dxpr_toggle_content_lock` | `entity_id`, `revision_id`, `entity_type`, `langcode`, `toggle_action` (alle erforderlich; `lock` erstellt die Sperre, jeder andere Wert entfernt sie) | Nein | JSON-Objekt mit `label` und `status` (`true` nach dem Sperren, `false` nach dem Entsperren). Ein leeres JSON-Array (`[]`), wenn die Entity nicht geladen werden kann oder dem User `update`-Zugriff fehlt. |

## Admin-Seiten

Alle diese Routen akzeptieren jede Methode (kein `methods`-Schlüssel). Pfade mit `{...}` nehmen die Config-Entity-ID, oder die Migrations-ID für `{migration_id}`.

| Pfad | Route | Berechtigung | Zweck |
|---|---|---|---|
| `/admin/dxpr_studio` | `dxpr_builder.admin.studio` | `administer dxpr builder configuration` | DXPR-Studio-Übersicht; Blockseite des Core-Admin-Menüs mit Unterseiten. |
| `/admin/dxpr_studio/dxpr_builder` | `dxpr_builder.admin.studio.builder` | `administer dxpr builder configuration` | DXPR-Builder-Übersicht; Blockseite des Core-Admin-Menüs. |
| `/admin/dxpr_studio/dxpr_builder/settings` | `dxpr_builder.settings` | `administer dxpr builder configuration` | `DxprBuilderSettingsForm`: das Modul-Einstellungsformular. |
| `/admin/dxpr_studio/dxpr_builder/ai_settings` | `dxpr_builder.ai_settings` | `administer dxpr builder configuration` | `DxprBuilderAiSettingsForm`: das KI-Einstellungsformular. |
| `/admin/dxpr_studio/dxpr_builder/user_templates` | `entity.dxpr_builder_user_template.collection` | `administer site configuration` | Liste von `dxpr_builder_user_template`-Config-Entities. |
| `/admin/dxpr_studio/dxpr_builder/user_templates/add` | `entity.dxpr_builder_user_template.add_form` | `administer site configuration` | Eine Benutzervorlage hinzufügen. |
| `/admin/dxpr_studio/dxpr_builder/user_templates/{dxpr_builder_user_template}` | `entity.dxpr_builder_user_template.edit_form` | `administer site configuration` | Eine Benutzervorlage bearbeiten. |
| `/admin/dxpr_studio/dxpr_builder/user_templates/{dxpr_builder_user_template}/delete` | `entity.dxpr_builder_user_template.delete_form` | `administer site configuration` | Eine Benutzervorlage löschen (Bestätigungsformular). |
| `/admin/dxpr_studio/dxpr_builder/page_template` | `entity.dxpr_builder_page_template.collection` | `administer site configuration` | Liste von `dxpr_builder_page_template`-Config-Entities. |
| `/admin/dxpr_studio/dxpr_builder/page_template/add` | `entity.dxpr_builder_page_template.add_form` | `administer site configuration` | Eine Seitenvorlage hinzufügen. |
| `/admin/dxpr_studio/dxpr_builder/page_template/create` | `dxpr_builder.create_page_template` | `administer dxpr builder configuration` | `PageController::createPageTemplate()`: kopiert die aktivierte Benutzervorlage, die der `uuid`-Query-Parameter nennt, in eine neue Seitenvorlage mit gleicher ID und Kategorie `DXPR`. Setzt eine Status- oder Fehlermeldung und leitet zur Benutzervorlagenliste weiter. |
| `/admin/dxpr_studio/dxpr_builder/page_template/{dxpr_builder_page_template}` | `entity.dxpr_builder_page_template.edit_form` | `administer site configuration` | Eine Seitenvorlage bearbeiten. |
| `/admin/dxpr_studio/dxpr_builder/page_template/{dxpr_builder_page_template}/delete` | `entity.dxpr_builder_page_template.delete_form` | `administer site configuration` | Eine Seitenvorlage löschen (Bestätigungsformular). |
| `/admin/dxpr_studio/dxpr_builder/profile` | `entity.dxpr_builder_profile.collection` | `administer dxpr_builder_profile` | Liste von `dxpr_builder_profile`-Config-Entities. |
| `/admin/dxpr_studio/dxpr_builder/profile/add` | `entity.dxpr_builder_profile.add_form` | `administer dxpr_builder_profile` | Ein Profil hinzufügen. |
| `/admin/dxpr_studio/dxpr_builder/profile/{dxpr_builder_profile}` | `entity.dxpr_builder_profile.edit_form` | `administer dxpr_builder_profile` | Ein Profil bearbeiten. |
| `/admin/dxpr_studio/dxpr_builder/profile/{dxpr_builder_profile}/delete` | `entity.dxpr_builder_profile.delete_form` | `administer dxpr_builder_profile` | Ein Profil löschen (Bestätigungsformular). |
| `/admin/dxpr_studio/dxpr_builder/user_licenses` | `dxpr_builder.user_licenses` | `administer dxpr builder configuration` | `PageController::userLicensesPage()`: nicht-gecachte Tabelle lizenzierter User (Spalten User, Roles, Sites, Assigned und Operations). Darüber rendert die Seite ihre eigene Lizenz-Übersichtskarte (`dxpr-license-info`), wenn Lizenzinformationen verfügbar sind, und, während eine freigegebene Lizenz ihre 30 Tage abwartet, einen „Next license available on“-Hinweis. Auf dieser Route rendert der **License info**-Block nichts, sodass die Übersicht nie doppelt erscheint. |
| `/admin/dxpr_studio/dxpr_builder/user_licenses/sites` | `dxpr_builder.user_licenses.sites` | `administer dxpr builder configuration` | `PageController::userLicensesSitesPage()`: Liste der Domains, die für den User im `mail`-Request-Parameter verzeichnet sind; aus der Lizenztabelle in einem Modal geöffnet. |
| `/admin/dxpr_studio/dxpr_builder/content` | `dxpr_builder.licensed_content` | `administer dxpr builder configuration` | `PageController::licensedContentPage()`: seitenweise Tabelle (20 pro Seite) von mit DXPR Builder bearbeiteten Inhalten, mit der Inhalte-Lizenzübersicht. Der Query-Parameter `needs_migration=1` zeigt nur Elemente, die eine Inhaltsmigration brauchen. Leer, wenn keine Lizenzinformationen verfügbar sind. |
| `/admin/dxpr_studio/dxpr_builder/migration-status` | `dxpr_builder.migration_status` | `administer dxpr builder configuration` | `MigrationStatusController::statusPage()`: nicht-gecachte Tabelle registrierter Inhaltsmigrationen mit ihren ausstehenden Elementen. Jede ausstehende Migration hat einen **Run now**-Link, und ein **Run all pending migrations**-Button erscheint, wenn welche ausstehen. |
| `/admin/dxpr_studio/dxpr_builder/migration-run/{migration_id}` | `dxpr_builder.migration_run_confirm` | `administer dxpr builder configuration` | `MigrationRunConfirmForm`: bestätigt, führt dann eine Migration als Batch aus und kehrt zur Statusseite zurück. |
| `/admin/dxpr_studio/dxpr_builder/migration-run-all` | `dxpr_builder.migration_run_all_confirm` | `administer dxpr builder configuration` | `MigrationRunAllConfirmForm`: bestätigt, führt dann jede registrierte Migration als einen Batch aus und kehrt zur Statusseite zurück. |
| `/dxpr-builder/disavow-user` | `dxpr_builder.disavow_user_confirm` | `administer dxpr builder configuration` | `DisavowUserConfirmForm`: bestätigt, den User im `uid`-Query-Parameter vom DXPR-Builder-Bearbeiten auszuschließen. |
| `/dxpr-builder/delete-stale-user` | `dxpr_builder.delete_stale_user_confirm` | `administer dxpr builder configuration` | `DeleteStaleUserConfirmForm`: bestätigt das Entfernen von Lizenzdaten für die E-Mail-Adresse im `email`-Query-Parameter. |

## Wie geht es weiter?

- [Konfigurationsreferenz](/de/hc/dokumentation/dxpr-builder-lernen/referenz/konfigurationsreferenz): die Einstellungen, die den Medienbrowser und das KI-Verhalten dieser Endpunkte steuern
- [PHP API](/de/hc/documentation/learn-dxpr-builder/development/api): die Services, die die Controller aufrufen
- [Hooks-API](/de/hc/documentation/learn-dxpr-builder/development/hooks-api): die Hooks, mit denen andere Module Builder-Verhalten ändern können