---
url: 'https://dxpr.com/nl/hc/documentatie/dxpr-builder-leren/referentie/api-eindpunten'
title: 'API-eindpunten | DXPR'
author:
  name: Jurriaan
  url: 'https://dxpr.com/users/jurriaan'
date: '2026-10-24T04:03:12+00:00'
updated: '2026-10-24T17:19:22+00:00'
copyright: 'Copyright DXPR. All rights reserved.'
type: article
summary: |-
  Deze pagina toont elke route die DXPR Builder registreert in
  dxpr_builder.routing.yml, met de HTTP-methoden, toegangsvereisten, requestparameters en responsevormen zoals
  geïmplementeerd in de controllers. De JavaScript van de editor is de
  bedoelde client voor de AJAX-eindpunten; niets op deze pagina is een
  stabiele publieke API, en parameternamen kunnen veranderen tussen
  releases.
  Toegangsvereisten
  Routes gebruiken drie soorten vereisten. Een route kan ze combineren.
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-eindpunten
      description: |-
        Deze pagina toont elke route die DXPR Builder registreert in
        dxpr_builder.routing.yml, met de HTTP-methoden, toegangsvereisten, requestparameters en responsevormen zoals
        geïmplementeerd in de controllers. De JavaScript van de editor is de
        bedoelde client voor de AJAX-eindpunten; niets op deze pagina is een
        stabiele publieke API, en parameternamen kunnen veranderen tussen
        releases.
        Toegangsvereisten
        Routes gebruiken drie soorten vereisten. Een route kan ze combineren.
      image:
        '@type': ImageObject
        url: 'https://dxpr.com/themes/custom/dxpr_com/images/dxpr-share-card.jpg'
        width: '1200'
        height: '630'
      datePublished: '2026-10-24T04:03:12+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/nl/hc/documentatie/dxpr-builder-leren/referentie/api-eindpunten'
      articleSection: 'Configuratie en API'
    -
      '@type': WebPage
      '@id': 'https://dxpr.com/nl/hc/documentatie/dxpr-builder-leren/referentie/api-eindpunten'
      description: |-
        Deze pagina toont elke route die DXPR Builder registreert in
        dxpr_builder.routing.yml, met de HTTP-methoden, toegangsvereisten, requestparameters en responsevormen zoals
        geïmplementeerd in de controllers. De JavaScript van de editor is de
        bedoelde client voor de AJAX-eindpunten; niets op deze pagina is een
        stabiele publieke API, en parameternamen kunnen veranderen tussen
        releases.
        Toegangsvereisten
        Routes gebruiken drie soorten vereisten. Een route kan ze combineren.
      breadcrumb:
        '@type': BreadcrumbList
        itemListElement:
          -
            '@type': ListItem
            position: 1
            name: Home
            item: 'https://dxpr.com/nl'
      publisher:
        '@type': Organization
        '@id': 'https://dxpr.com/#organization'
        name: DXPR
      inLanguage: nl
---
[Helpcentrum](/nl/hc)/[Documentatie](/nl/hc/documentatie) /[DXPR Builder leren](/nl/hc/documentation/learn-dxpr-builder) /[Referentie](/nl/hc/documentation/learn-dxpr-builder/reference) /[Configuratie en API](/nl/hc/documentation/learn-dxpr-builder/reference/config-and-api) # API-eindpunten.

 DXPR Builder lerenReferentieConfiguratie en API

   ## In deze gids

 Gerelateerde gidsen

- [Configuratiereferentie](/nl/hc/documentatie/dxpr-builder-leren/referentie/configuratiereferentie)
- [Architectuur](/nl/hc/documentatie/dxpr-builder-leren/ontwikkeling/api)
- [Hooks API](/nl/hc/documentatie/dxpr-builder-leren/ontwikkeling/hooks-api)

Deze pagina toont elke route die DXPR Builder registreert in `dxpr_builder.routing.yml`, met de HTTP-methoden, toegangsvereisten, requestparameters en responsevormen zoals geïmplementeerd in de controllers. De JavaScript van de editor is de bedoelde client voor de AJAX-eindpunten; niets op deze pagina is een stabiele publieke API, en parameternamen kunnen veranderen tussen releases.

## Toegangsvereisten

Routes gebruiken drie soorten vereisten. Een route kan ze combineren.

| Vereiste | Betekenis |
|---|---|
| `_permission` | De gebruiker heeft de genoemde Drupal-permissie nodig. DXPR Builder definieert `administer dxpr builder configuration`, `edit with dxpr builder` en `administer dxpr_builder_profile` in `dxpr_builder.permissions.yml`; `view media` en `administer site configuration` komen uit core. |
| `_csrf_token` | Het verzoek moet een geldig CSRF-token dragen in de `token`-queryparameter. Voor de hoofd-AJAX-handler haalt de editor een URL met het token op van `/dxpr_builder/csrf` (of van de `dxpr_builder_csrf`-bewerking). Voor de andere routes zet de veldnotatie URL’s met een token in `drupalSettings.dxprBuilder`, bijvoorbeeld `fileUploadUrl`, `entityLinkSuggestionsUrl`, `userSettingsUrl` en `aiAgent.endpointUrl`. |
| `_dxpr_builder_billable_user` | De gebruiker moet een factureerbare gebruiker zijn, zoals hieronder gedefinieerd. |

### Wat “factureerbare gebruiker” betekent

`DxprBuilderBillableUserAccessCheck` geeft toegang wanneer `DxprBuilderLicenseService::isBillableUser()` true teruggeeft voor het actuele account. Die methode geeft false terug voor geblokkeerde accounts en voor accounts waarvan het veld `dxpr_user_is_disavowed` is ingesteld (een beheerder sluit een gebruiker uit van bewerken op de pagina Gebruikerslicenties). Anders geeft hij true terug voor gebruiker 1 en voor elk account met de permissie `edit with dxpr builder`. Kortom: een factureerbare gebruiker is een actief, niet-uitgesloten account dat mag bewerken met DXPR Builder, en de licentieservice telt deze accounts tegen je productsleutel.

### HTTP-methoden

Waar een route `methods` declareert, worden alleen die methoden gerouteerd. Waar hij dat niet doet, accepteert de route elke methode (Drupal’s `MethodFilter` filtert alleen routes die methoden declareren). De tabellen hieronder vermelden de methode die de JavaScript van de editor daadwerkelijk gebruikt wanneer dat zichtbaar is in de bron.

## Editor-AJAX-eindpunten

### CSRF-token-URL

|  |  |
|---|---|
| Pad | `/dxpr_builder/csrf` |
| Route | `dxpr_builder.csrf_refresh` |
| Methoden | Niet gedeclareerd (elke methode). De editor stuurt GET (`backend-connect.js`, `fetchCsrfTokenUrl()`). |
| Vereisten | Factureerbare gebruiker |
| Controller | `AjaxController::ajaxRefresh()` |

Het verzoek moet de header `X-Requested-With: XMLHttpRequest` dragen; zonder hem geeft de controller HTTP 403 terug met de JSON-body `{"error": "Invalid request"}`.

| Parameter | Bron | Vereist | Opmerkingen |
|---|---|---|---|
| `enterprise` | Querystring | Optioneel | Wanneer ingesteld op `true` en de module `dxpr_builder_e` is geïnstalleerd, wordt het token gegenereerd voor de route `dxpr_builder_e.ajax_callback`. Wanneer ingesteld op `true` zonder die module gooit de controller een exceptie. |

Antwoord: een JSON-string met de URL van de hoofd-AJAX-handler en een `token`-queryparameter. De URL is een pad vanaf de siteroot (basispad inbegrepen, geen host). De JavaScript post elke builder-bewerking naar deze URL.

### Hoofd-AJAX-handler

|  |  |
|---|---|
| Pad | `/dxpr_builder/ajax` |
| Route | `dxpr_builder.ajax_callback` |
| Methoden | Niet gedeclareerd (elke methode). De controller leest elke parameter uit de POST-body, en de editor stuurt POST. |
| Vereisten | Factureerbare gebruiker, CSRF-token |
| Controller | `AjaxController::ajaxCallback()` |

Het POST-bodyveld `action` selecteert de bewerking. Elke bewerking en zijn parameters staan onder [Bewerkingen van hoofd-AJAX-handler](#main-ajax-handler-operations). Wanneer `action` ontbreekt of onbekend is, geeft de controller een lege Drupal-`AjaxResponse` terug zonder commando’s. De meeste bewerkingen die de status factureerbare gebruiker opnieuw controleren geven hetzelfde lege antwoord wanneer die controle faalt; de tabellen vermelden de twee uitzonderingen.

### AI-chat

|  |  |
|---|---|
| Pad | `/dxpr_builder/ajax/ai/chat` |
| Route | `dxpr_builder.ai_chat` |
| Methoden | POST |
| Vereisten | `edit with dxpr builder`, factureerbare gebruiker, CSRF-token |
| Controller | `AiChatController::chat()` |

De requestbody is JSON. De controller proxyt het verzoek naar de `dxpr`-provider van de Drupal-module `ai`, zodat geen API-sleutel de browser bereikt. Vóór de call voegt hij de domeinen uit de instelling `ai_output_allowed_domains` samen in het hostnaamfilter van de module `ai`, wanneer die service bestaat. Een waarde `*` zet het filter in plaats daarvan op volledig vertrouwen. Het filter wordt daarna hersteld.

| Parameter | Bron | Vereist | Opmerkingen |
|---|---|---|---|
| `messages` | JSON-body | Vereist | Array van objecten met `role` en `content`. |
| `stream` | JSON-body | Optioneel | Boolean, standaard `true`. |
| `model` | JSON-body | Optioneel | Standaard `kavya-m1`. |
| `prediction` | JSON-body | Optioneel | Doorgegeven aan de providerconfiguratie als array. |
| `providers` | JSON-body | Optioneel | Doorgegeven aan de providerconfiguratie. |
| `allowed_html_tags` | JSON-body | Optioneel | Doorgegeven aan de providerconfiguratie. |
| `allowed_html_classes` | JSON-body | Optioneel | Doorgegeven aan de providerconfiguratie. |
| `web_search` | JSON-body | Optioneel | Alleen de waarde `false` wordt doorgestuurd; elke andere waarde wordt genegeerd. |
| `response_format` | JSON-body | Optioneel | Doorgegeven aan de providerconfiguratie als array. |

Antwoorden:

| Geval | Status | Body |
|---|---|---|
| Gestreamd (`stream` true en de provider streamt) | 200, `Content-Type: text/event-stream` | Server-sent events. Elk event is `data: <JSON>` waarbij de JSON `choices[0].delta.content` heeft en, wanneer de provider ze levert, `id`, `object`, `created`, `model`, `original_model` en `usage`. De stream eindigt met `data: [DONE]`. |
| Niet-gestreamd | 200, `application/json` | `{"choices": [{"message": {"role": "assistant", "content": "<text>"}}]}` |
| Body is geen JSON, of `messages` ontbreekt of is leeg | 400, platte tekst | `Invalid request: messages required` |
| `model` niet in de `allowed_models`-lijst van `ai_provider_dxpr.settings` (alleen gecontroleerd wanneer de module `ai_provider_dxpr` is geïnstalleerd en de lijst is ingesteld) | 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-exceptie | 500, `application/json` | `{"error": {"message": "The request could not be completed."}}` |

### AI-afbeeldingsgeneratie

|  |  |
|---|---|
| Pad | `/dxpr_builder/ajax/ai/image` |
| Route | `dxpr_builder.ai_image` |
| Methoden | POST |
| Vereisten | `edit with dxpr builder`, factureerbare gebruiker, CSRF-token |
| Controller | `AiImageController::generate()` |

| Parameter | Bron | Vereist | Opmerkingen |
|---|---|---|---|
| `prompt` | JSON-body | Vereist | Tekstprompt. |
| `model` | JSON-body | Optioneel | Standaard `kavya-image`. |
| `size` | JSON-body | Optioneel | Doorgestuurd naar de providerconfiguratie wanneer niet-leeg. |
| `quality` | JSON-body | Optioneel | Doorgestuurd naar de providerconfiguratie wanneer niet-leeg. |
| `background` | JSON-body | Optioneel | Doorgestuurd naar de providerconfiguratie wanneer niet-leeg. |

Antwoorden:

| Geval | Status | Body |
|---|---|---|
| Succes | 200 | `{"data": [{"b64_json": "<base64 image>"}]}` (alleen de eerste gegenereerde afbeelding wordt teruggegeven) |
| Body is geen JSON, of `prompt` ontbreekt | 400 | `{"error": {"message": "Invalid request: prompt required"}}` |
| Provider gaf geen afbeelding terug | 500 | `{"error": {"message": "No image was generated"}}` |
| Provider-exceptie | 500 | `{"error": {"message": "Image generation failed. Please try again."}}` |

### AI-afbeeldingsbewerking

|  |  |
|---|---|
| Pad | `/dxpr_builder/ajax/ai/image/edit` |
| Route | `dxpr_builder.ai_image_edit` |
| Methoden | POST |
| Vereisten | `edit with dxpr builder`, factureerbare gebruiker, CSRF-token |
| Controller | `AiImageController::edit()` |

| Parameter | Bron | Vereist | Opmerkingen |
|---|---|---|---|
| `prompt` | JSON-body | Vereist | Bewerkingsinstructie. |
| `image` | JSON-body | Vereist | Base64-gecodeerde bronafbeelding (strikte decodering). |
| `mimeType` | JSON-body | Optioneel | Standaard `image/png`; het subtype wordt de bestandsextensie doorgegeven aan de provider. |
| `model` | JSON-body | Optioneel | Standaard `kavya-image`. |
| `size`, `quality`, `background` | JSON-body | Optioneel | Doorgestuurd naar de providerconfiguratie wanneer niet-leeg. |

Antwoorden:

| Geval | Status | Body |
|---|---|---|
| Succes | 200 | `{"data": [{"b64_json": "<base64 image>"}]}` |
| Body is geen JSON, of `prompt` of `image` ontbreekt | 400 | `{"error": {"message": "Invalid request: prompt and image required"}}` |
| `image` is geen geldige base64 | 400 | `{"error": {"message": "Invalid image data: base64 decode failed"}}` |
| Provider gaf geen afbeelding terug | 500 | `{"error": {"message": "No image was generated"}}` |
| Provider-exceptie | 500 | `{"error": {"message": "Image editing failed. Please try again."}}` |

### Bestandsupload

|  |  |
|---|---|
| Pad | `/dxpr_builder/ajax/file_upload` |
| Route | `dxpr_builder.ajax_file_upload_callback` |
| Methoden | POST, DELETE (gedeclareerd in routing; de controller heeft één uploadhandler en geen aparte delete-tak) |
| Vereisten | Factureerbare gebruiker, CSRF-token |
| Controller | `UploadFileController::fileUpload()` |

| Parameter | Bron | Vereist | Opmerkingen |
|---|---|---|---|
| `upload` | Multipart-formulierbestanden, verstuurd als `upload[]` | Vereist | Eén of meer geüploade bestanden. |

De controller sorteert elk bestand op het eerste deel van zijn client-MIME-type naar `<default scheme>://dxpr_builder_images`, `dxpr_builder_videos` of `dxpr_builder_files`. Een afbeelding heeft een extensie van de MIME-typen `image/gif`, `jpg`, `jpeg`, `png`, `webp`, `avif` of `svg` nodig. Een video heeft een van `video/webm`, `ogv`, `ogg`, `mp4` of `quicktime` nodig (bijvoorbeeld `.mov`). De groottelimiet is het uploadmaximum van PHP. Een bestand met dezelfde naam en identieke SHA-256-inhoud als een bestaand beheerd bestand dat de gebruiker kan bekijken wordt hergebruikt in plaats van opnieuw bewaard. Wanneer de module `media` is geïnstalleerd en een mediatype met de naam `image`, `media_image`, `video` of `media_video` bestaat, wordt een gepubliceerde media-entiteit aangemaakt (of hergebruikt) voor het bestand. Bestandsgebruik wordt geregistreerd onder de module `dxpr_builder`.

Antwoorden:

| Geval | Status | Body |
|---|---|---|
| Succes | 201 | JSON-array, één object per bestand: `url` (absolute bestands-URL), `uuid` en `id` (van de media-entiteit wanneer die bestaat, anders van het bestand), `fid` (bestands-ID), `entity_type` (`media` of `file`). |
| Geen `upload`-bestanden | 400 | `{"message": "No files were uploaded."}` |
| Ongeldige upload, niet-schrijfbare bestemming of bewaarfout | 500 | `{"message": "<reason>"}` |
| Validatiefout (extensie of grootte) | 422 | `{"message": "<violation messages>"}` |
| Bestandsnaam al vergrendeld door een ander verzoek | 503 | `{"message": "File \"<name>\" is already locked for writing."}` |

### Mediabibliotheekdialoog

|  |  |
|---|---|
| Pad | `/dxpr_builder/media-library` |
| Route | `dxpr_builder.media_library` |
| Methoden | Niet gedeclareerd (elke methode). Parameters worden gelezen uit de querystring. |
| Vereisten | `view media`; adminroute |
| Controller | `AjaxController::openImageMediaLibrary()` |

| Parameter | Bron | Vereist | Opmerkingen |
|---|---|---|---|
| `media_type` | Querystring | Optioneel | `image` (standaard) of `video`. |
| `remaining_slots` | Querystring | Optioneel | Aantal items dat de opener accepteert; standaard 1. |
| `uuid` | Querystring | Optioneel | Doorgegeven aan de opener als `opener_parameters.uuid`. |

Het aangeboden mediatype hangt af van de instelling `media_browser`: `media_library` gebruikt het mediatype `image` of `video` direct; `media_library_acquia_dam` gebruikt `acquia_dam_image_asset` of `acquia_dam_video_asset` wanneer dat mediatype bestaat.

Antwoorden:

| Geval | Resultaat |
|---|---|
| Succes | Een renderarray gebouwd door `MediaLibraryUiBuilder::buildUi()` met de opener `media_library.opener.dxpr_builder`. Drupal rendert hem als HTML-pagina bedoeld voor een iframe. |
| `media_library`-module niet geïnstalleerd | 403, plain text `Media Library is not enabled. Please enable it to access this feature.` |
| Niet-ondersteunde `media_type` | 400, plain text `Unsupported media type "<value>".` |
| `media_browser`-instelling heeft geen bruikbaar mediatype | 400, plain text `The "<setting>" settings is not supported.` |

### Helplinkvalidator

|  |  |
|---|---|
| Pad | `/dxpr_builder/ajax/help_link_validator` |
| Route | `dxpr_builder.ajax_help_link_validator` |
| Methoden | Niet gedeclareerd (elke methode). Het dev-script `dxpr_builder_dev.js` stuurt POST met een form-gecodeerde body. |
| Vereisten | Factureerbare gebruiker |
| Controller | `AjaxController::validateHelpLink()` |

| Parameter | Bron | Vereist | Opmerkingen |
|---|---|---|---|
| `help_link` | POST-body | Vereist voor een zinvol antwoord | Alleen `http`- of `https`-URL’s op host `dxpr.com` met een pad beginnend met `/documentation/` worden gecontroleerd. |

Antwoord: een JSON-array. `[true]` wanneer een HEAD-verzoek aan de link (zonder redirects te volgen) 200 teruggeeft; `[false]` wanneer de HTTP-client gooit; `[]` in elk ander geval, inclusief een ontbrekende parameter, een niet-matchende URL of een niet-200-status.

### Entiteitslinksuggesties

|  |  |
|---|---|
| Pad | `/dxpr_builder/entity-link-suggestions` |
| Route | `dxpr_builder.entity_link_suggestions` |
| Methoden | GET |
| Vereisten | `edit with dxpr builder`, CSRF-token; `no_cache`-routeoptie |
| Controller | `EntityLinkSuggestionsController::suggestions()` |

| Parameter | Bron | Vereist | Opmerkingen |
|---|---|---|---|
| `q` | Querystring | Vereist voor resultaten | Zoektekst, in kleine letters. Een waarde zoals `/node/123` laadt die entiteit direct. |
| `langcode` | Querystring | Optioneel | Taal van de hostentiteit; standaard de actuele taal. Alleen entiteiten beschikbaar in deze taal worden teruggegeven. |

Bundels zijn die met `ckeditor5_link_suggestions` ingeschakeld in hun bundelinfo; wanneer geen zijn geconfigureerd, worden alle nodebundels doorzocht. Tot 100 entiteiten per entiteittype worden gematcht met een `CONTAINS`-zoekopdracht via de entity-reference-selectieplug-ins van core.

Antwoord: `{"suggestions": [...]}` met private-cacheerbaarheid en een max-age van 300 seconden. Elke suggestie heeft `description`, `entity_type_id`, `entity_uuid`, `group`, `label` en `path`. Wanneer `q` niets matcht, bevat de array één suggestie voor een handmatige link met `description`, `label` (de ingevoerde tekst in kleine letters) en `path` (de invoer wanneer het een geldige URL is, anders een lege string). Wanneer `q` leeg is, is `suggestions` een lege array.

### Editorinstellingen van gebruiker

|  |  |
|---|---|
| Pad | `/dxpr_builder/user-settings` |
| Route | `dxpr_builder.user_settings` |
| Methoden | POST |
| Vereisten | `edit with dxpr builder`, CSRF-token; `no_cache`-routeoptie |
| Controller | `UserSettingsController::save()` |

De editor stuurt dit verzoek wanneer een gebruiker zijn eigen editor-instellingen wijzigt, bijvoorbeeld onder **Editorinstellingen**. De waarden worden bewaard bij het gebruikersaccount in `user.data`, module `dxpr_builder`.

| Parameter | Bron | Vereist | Opmerkingen |
|---|---|---|---|
| `controls_layout` | JSON-body | Vereist (de enige instelling) | `element`, `breadcrumb` of `default`. `default` verwijdert de keuze van de gebruiker, zodat de profiel- of site-instelling geldt. |

Antwoorden:

| Geval | Status | Body |
|---|---|---|
| Bewaard | 200 | `{"settings": {"controls_layout": "<value>"}}`: elke instelling na bewaren, `default` waar de gebruiker geen keuze bewaard heeft. |
| Body is geen niet-leeg JSON-object, of een naam of waarde is ongeldig | 400 | `{"error": "Invalid setting or value."}`. Niets wordt bewaard. |

## Bewerkingen van hoofd-AJAX-handler

Alle bewerkingen gaan naar `/dxpr_builder/ajax` met de token-query-parameter verkregen van `/dxpr_builder/csrf`. De bewerkingsnaam wordt verstuurd in het POST-bodyveld `action`; alle andere parameters zijn POST-bodyvelden tenzij anders vermeld. De kolom “Controleert opnieuw factureerbaar” markeert bewerkingen die `isBillableUser()` opnieuw aanroepen in de switch. Wanneer die controle faalt geven ze de lege `AjaxResponse` terug zoals hierboven beschreven, tenzij de rij anders zegt.

### Sessie en toegang

| Bewerking | Parameters | Controleert opnieuw factureerbaar | Retourneert |
|---|---|---|---|
| `dxpr_login` | Geen | Nee | JSON-boolean: of de actuele gebruiker factureerbaar is. |
| `dxpr_builder_csrf` | Geen | Ja | JSON-string: de handler-URL met een `token`-queryparameter (zelfde als `/dxpr_builder/csrf` zonder de `enterprise`-optie). |

### Containers (velden gerenderd met de DXPR Builder-notatie)

| Bewerking | Parameters | Controleert opnieuw factureerbaar | Retourneert |
|---|---|---|---|
| `dxpr_get_container_types` | Geen | Ja | JSON-object gesleuteld `entity_type\|bundle` met waarde `entity_type - bundle`, één invoer per bundel waarvan de standaardweergave de notatie `dxpr_builder_text` op minstens één veld gebruikt. |
| `dxpr_get_container_names` | `container_type` (vereist, `entity_type\|bundle`) | Ja (geeft een lege JSON-string terug in plaats van het lege antwoord) | JSON-object gesleuteld `entity_id\|field_name` (of `entity_id\|field_name\|langcode` voor vertaalbare entiteiten) met waarde `entity label\|field label`. Wanneer `container_type` ontbreekt, of de factureerbaar-controle faalt, is het antwoord een lege JSON-string. |
| `dxpr_save_container` | `type` (vereist, `entity_type\|bundle`); `name` (vereist, `entity_id\|field_name` of `entity_id\|revision_id\|field_name`); `htmlContent` (vereist, gecodeerde markup); `lang` (optioneel, standaard de standaardtaal van de site) | Ja | JSON lege string bij succes. HTTP 400 met een JSON-bericht wanneer `htmlContent` geen string is of de taal niet geldt voor een niet-vertaalbare entiteit; 404 wanneer de gevraagde vertaling niet bestaat; 500 wanneer de entiteit niet geladen kan worden. |

`dxpr_save_container` doet het volgende:

1. Decodeert `htmlContent`: XOR elke byte met 7, dan URL-decoderen.
2. Schrijft het resultaat naar de eerste delta van het genoemde veld.
3. Maakt een nieuwe standaardrevisie met het logbericht `Saved with DXPR builder` wanneer het entiteittype reviseerbaar is.
4. Verwijdert elke inhoudsvergrendeling voor de entiteit.
5. Werkt `block_revision_id` bij in Layout Builder-secties die het bewaarde inlineblok refereren.
6. Verhoogt de statewaarde `dxpr_builder.saves_count`.

Het bewaren gebeurt alleen wanneer de gebruiker `update`-toegang heeft tot de entiteit. Zonder hem geeft de bewerking toch het lege-string-succesantwoord.

### CMS-elementen (blokken en views)

| Bewerking | Parameters | Controleert opnieuw factureerbaar | Retourneert |
|---|---|---|---|
| `dxpr_builder_get_cms_element_names` | Geen | Ja | JSON-object van `DxprBuilderService::getCmsElementNames()` met sleutels `list`, `disallowed` en `blockCategories`. |
| `dxpr_get_cms_element_settings` | `name` (vereist): `view-<view_id>-<display_id>` of `block-<plugin_id>`; `ajax_page_state[libraries]` (optioneel, door komma’s gescheiden reeds geladen bibliotheken) | Ja | JSON-object met `css`, `js`, `settings` en `data`. Voor een view is `data` de gerenderde exposed-filterwidgets; voor een blok is `data` het configuratieformulier van het blok gewikkeld in `<form>`-tags, met de elementen `provider`, `admin_label`, `label`, `label_display` en `context_mapping` verwijderd en alle details-elementen geopend. |
| `dxpr_builder_load_cms_element` | `name` (vereist, geparst door `parseStringForCmsElementInfo()`); `settings` (vereist); `data` (vereist, array); `ajax_page_state[libraries]` (optioneel) | Nee | JSON-object met `css`, `js`, `settings` en `data`, waarbij `data` de gerenderde blok- of viewweergave is. |

In beide `settings`-teruggevende bewerkingen zijn `css` en `js`gerenderde assettags die nog niet op de pagina staan, en `settings` is het gedecodeerde `drupalSettings`-object, of een lege string wanneer die er niet zijn.

### Paginasjablonen

| Bewerking | Parameters | Controleert opnieuw factureerbaar | Retourneert |
|---|---|---|---|
| `dxpr_get_page_templates` | Geen | Ja | JSON-array van ingeschakelde paginasjablonen, elk met `title`, `uuid`, `module` (altijd `null`: de entiteit bewaart hem niet), `category`, `date`, `weight` (integer) en `image` (een `data:`-URL, of de `not-found.png`-URL van de module). |
| `dxpr_load_page_template` | `uuid` (vereist) | Ja | HTML-antwoord met de sjabloonmarkup met vervangen basistokens; leeg wanneer geen ingeschakeld sjabloon matcht. |

### Gebruikerssjablonen

| Bewerking | Parameters | Controleert opnieuw factureerbaar | Retourneert |
|---|---|---|---|
| `dxpr_get_templates` | Geen | Ja | JSON-array van sjablonen van de actuele gebruiker of gemarkeerd globaal; sjablonen waarvan het auteursaccount niet meer bestaat worden weggelaten. Elke invoer heeft `id`, `uuid`, `name`, `global`, `current_user_is_author`, `author_id`, `author_name`, `type` en, wanneer bewaard, `image` (een `data:`-URL). |
| `dxpr_load_template` | `uuid` (vereist) | Ja | HTML-antwoord met de sjabloonmarkup met vervangen basistokens; leeg wanneer geen ingeschakeld sjabloon matcht. |
| `dxpr_save_template` | `name` (vereist); `template` (vereist, markup); `type` (optioneel, standaard `custom`); `global` (optioneel, gecast naar boolean); `image` (optioneel: een base64-string of `data:image`-URL in de POST-body, of een multipart-bestandsveld met de naam `image`) | Ja | JSON-object met `message` en `code`. `code` 200 bij succes; `code` 409 (HTTP-status 200) wanneer een sjabloon met dezelfde machinenaam bestaat; `code` 400 met HTTP 400 wanneer de afbeelding geen geldige afbeeldingsdata is. |
| `dxpr_delete_template` | `name` (vereist) | Ja | JSON lege string. |

De machinenaam is afgeleid van `name` door hem in kleine letters te zetten en elke reeks tekens buiten `a-z0-9_` te vervangen door een underscore. `type` valt terug op het `data-azb`-attribuut in de markup wanneer een bewaard sjabloon geen type heeft.

### Afbeeldingen

| Bewerking | Parameters | Controleert opnieuw factureerbaar | Retourneert |
|---|---|---|---|
| `dxpr_builder_get_image_urls` | `entityIDs` (vereist, array); `imageStyle` (vereist; `original` voor het ongestileerde bestand); `entityType` (vereist; `media` lost media-items op, elke andere waarde wordt gebruikt als het entiteittype van de ID’s) | Ja | Tekstbody: door komma’s gescheiden afbeeldings-URL’s. Bestanden geven een root-relatieve URL met een `fid`-queryparameter. Media-items van het type `image` of `video` lossen op naar hun bronbestand. `acquia_dam_image_asset`-items geven de DAM-URL met `mid`, `acquiaDamAsset` en `imageStyle` toegevoegd. Andere media-items worden overgeslagen. HTTP 204 zonder body wanneer `entityIDs` leeg is, of wanneer geen media-item opgelost kan worden. |
| `dxpr_builder_get_image_style_url` | `imageStyle` (vereist); `entityId` (vereist); `entityTypeId` (vereist, `file` of `media`) | Ja | Tekstbody. Voor een bestand: zijn root-relatieve URL via de afbeeldingsstijl (SVG-bestanden en `original` slaan de stijl over), met een `fid`-queryparameter. Voor een `acquia_dam_image_asset`-media-item: de DAM-URL. HTTP 204 zonder body voor elke andere entiteit, of wanneer de entiteit niet gevonden is. |
| `dxpr_builder_get_image_metadata` | `entityId` (vereist); `entityType` (vereist, `file` of `media`) | Ja (geeft 403-JSON terug in plaats van het lege antwoord) | `{"data": {"alt": "...", "title": "..."}}` uit het afbeeldingsbronveld van het media-item (een Acquia DAM-asset geeft zijn DAM-alt-tekst en een lege titel). Voor een bestand komen de waarden uit het eerste media-item waarvan `field_media_image` ernaar verwijst. `data` is een lege array wanneer de entiteit geen bestand noch media-item is, of wanneer geen media naar het bestand verwijst. Fouten: 400 `{"error": "Missing required parameters"}`, 404 `{"error": "Entity not found"}`, 500 `{"error": "Failed to load entity"}`, 403 `{"error": "Access denied"}`. |

### Inhoudsvergrendelingen

| Bewerking | Parameters | Controleert opnieuw factureerbaar | Retourneert |
|---|---|---|---|
| `dxpr_content_lock_status` | `entity_id`, `revision_id`, `entity_type`, `langcode` (alle vereist) | Nee | JSON-object met `status` (boolean) en `label` (entiteitslabel); wanneer vergrendeld, ook `entity_lock_author_id` en `entity_lock_author_name`. |
| `dxpr_toggle_content_lock` | `entity_id`, `revision_id`, `entity_type`, `langcode`, `toggle_action` (alle vereist; `lock` maakt de vergrendeling, elke andere waarde verwijdert hem) | Nee | JSON-object met `label` en `status` (`true` na vergrendelen, `false` na ontgrendelen). Een lege JSON-array (`[]`) wanneer de entiteit niet geladen kan worden of de gebruiker geen `update`-toegang heeft. |

## Adminpagina’s

Al deze routes accepteren elke methode (geen `methods`-sleutel). Paden met `{...}` nemen de configuratie-entiteits-ID, of de migratie-ID voor `{migration_id}`.

| Pad | Route | Permissie | Doel |
|---|---|---|---|
| `/admin/dxpr_studio` | `dxpr_builder.admin.studio` | `administer dxpr builder configuration` | DXPR Studio-overzicht; adminmenublokpagina van core met kindpagina’s. |
| `/admin/dxpr_studio/dxpr_builder` | `dxpr_builder.admin.studio.builder` | `administer dxpr builder configuration` | DXPR Builder-overzicht; adminmenublokpagina van core. |
| `/admin/dxpr_studio/dxpr_builder/settings` | `dxpr_builder.settings` | `administer dxpr builder configuration` | `DxprBuilderSettingsForm`: het module-instellingenformulier. |
| `/admin/dxpr_studio/dxpr_builder/ai_settings` | `dxpr_builder.ai_settings` | `administer dxpr builder configuration` | `DxprBuilderAiSettingsForm`: het AI-instellingenformulier. |
| `/admin/dxpr_studio/dxpr_builder/user_templates` | `entity.dxpr_builder_user_template.collection` | `administer site configuration` | Lijst van `dxpr_builder_user_template`-configuratie-entiteiten. |
| `/admin/dxpr_studio/dxpr_builder/user_templates/add` | `entity.dxpr_builder_user_template.add_form` | `administer site configuration` | Een gebruikerssjabloon toevoegen. |
| `/admin/dxpr_studio/dxpr_builder/user_templates/{dxpr_builder_user_template}` | `entity.dxpr_builder_user_template.edit_form` | `administer site configuration` | Een gebruikerssjabloon bewerken. |
| `/admin/dxpr_studio/dxpr_builder/user_templates/{dxpr_builder_user_template}/delete` | `entity.dxpr_builder_user_template.delete_form` | `administer site configuration` | Een gebruikerssjabloon verwijderen (bevestigingsformulier). |
| `/admin/dxpr_studio/dxpr_builder/page_template` | `entity.dxpr_builder_page_template.collection` | `administer site configuration` | Lijst van `dxpr_builder_page_template`-configuratie-entiteiten. |
| `/admin/dxpr_studio/dxpr_builder/page_template/add` | `entity.dxpr_builder_page_template.add_form` | `administer site configuration` | Een paginasjabloon toevoegen. |
| `/admin/dxpr_studio/dxpr_builder/page_template/create` | `dxpr_builder.create_page_template` | `administer dxpr builder configuration` | `PageController::createPageTemplate()`: kopieert het ingeschakelde gebruikerssjabloon geïdentificeerd door de `uuid`-queryparameter naar een nieuw paginasjabloon met dezelfde ID en categorie `DXPR`. Hij zet een status- of foutbericht en leidt om naar de gebruikerssjabloonlijst. |
| `/admin/dxpr_studio/dxpr_builder/page_template/{dxpr_builder_page_template}` | `entity.dxpr_builder_page_template.edit_form` | `administer site configuration` | Een paginasjabloon bewerken. |
| `/admin/dxpr_studio/dxpr_builder/page_template/{dxpr_builder_page_template}/delete` | `entity.dxpr_builder_page_template.delete_form` | `administer site configuration` | Een paginasjabloon verwijderen (bevestigingsformulier). |
| `/admin/dxpr_studio/dxpr_builder/profile` | `entity.dxpr_builder_profile.collection` | `administer dxpr_builder_profile` | Lijst van `dxpr_builder_profile`-configuratie-entiteiten. |
| `/admin/dxpr_studio/dxpr_builder/profile/add` | `entity.dxpr_builder_profile.add_form` | `administer dxpr_builder_profile` | Een profiel toevoegen. |
| `/admin/dxpr_studio/dxpr_builder/profile/{dxpr_builder_profile}` | `entity.dxpr_builder_profile.edit_form` | `administer dxpr_builder_profile` | Een profiel bewerken. |
| `/admin/dxpr_studio/dxpr_builder/profile/{dxpr_builder_profile}/delete` | `entity.dxpr_builder_profile.delete_form` | `administer dxpr_builder_profile` | Een profiel verwijderen (bevestigingsformulier). |
| `/admin/dxpr_studio/dxpr_builder/user_licenses` | `dxpr_builder.user_licenses` | `administer dxpr builder configuration` | `PageController::userLicensesPage()`: niet-gecachete tabel van gelicentieerde gebruikers (kolommen User, Roles, Sites, Assigned en Operations). Daarboven rendert de pagina zijn eigen licentieoverzichtskaart (`dxpr-license-info`) wanneer licentie-informatie beschikbaar is, en, terwijl een vrijgemaakte licentie zijn 30 dagen uitzit, een melding “Next license available on”. Op deze route rendert het blok **Licentie-info** niets, zodat het overzicht nooit twee keer toont. |
| `/admin/dxpr_studio/dxpr_builder/user_licenses/sites` | `dxpr_builder.user_licenses.sites` | `administer dxpr builder configuration` | `PageController::userLicensesSitesPage()`: itemlijst van de domeinen geregistreerd voor de gebruiker gegeven in de `mail`-requestparameter; geopend in een modaal vanuit de licentietabel. |
| `/admin/dxpr_studio/dxpr_builder/content` | `dxpr_builder.licensed_content` | `administer dxpr builder configuration` | `PageController::licensedContentPage()`: gepagineerde tabel (20 per pagina) van contentitems bewerkt met DXPR Builder, met het contentitems-licentieoverzicht. De queryparameter `needs_migration=1` toont alleen items die een inhoudsmigratie nodig hebben. Leeg wanneer geen licentie-informatie beschikbaar is. |
| `/admin/dxpr_studio/dxpr_builder/migration-status` | `dxpr_builder.migration_status` | `administer dxpr builder configuration` | `MigrationStatusController::statusPage()`: niet-gecachete tabel van geregistreerde inhoudsmigraties met hun openstaande items. Elke openstaande migratie heeft een link **Nu uitvoeren**, en een knop **Alle openstaande migraties uitvoeren** verschijnt wanneer er openstaan. |
| `/admin/dxpr_studio/dxpr_builder/migration-run/{migration_id}` | `dxpr_builder.migration_run_confirm` | `administer dxpr builder configuration` | `MigrationRunConfirmForm`: bevestigt, voert dan één migratie uit als batch en keert terug naar de statuspagina. |
| `/admin/dxpr_studio/dxpr_builder/migration-run-all` | `dxpr_builder.migration_run_all_confirm` | `administer dxpr builder configuration` | `MigrationRunAllConfirmForm`: bevestigt, voert dan elke geregistreerde migratie uit als één batch en keert terug naar de statuspagina. |
| `/dxpr-builder/disavow-user` | `dxpr_builder.disavow_user_confirm` | `administer dxpr builder configuration` | `DisavowUserConfirmForm`: bevestigt het uitsluiten van de gebruiker gegeven in de `uid`-queryparameter van bewerken met DXPR Builder. |
| `/dxpr-builder/delete-stale-user` | `dxpr_builder.delete_stale_user_confirm` | `administer dxpr builder configuration` | `DeleteStaleUserConfirmForm`: bevestigt het verwijderen van licentiegegevens voor het e-mailadres gegeven in de `email`-queryparameter. |

## Wat nu?

- [Configuratiereferentie](/nl/hc/documentatie/dxpr-builder-leren/referentie/configuratiereferentie) voor de instellingen die de mediabrowser en het AI-gedrag van deze eindpunten regelen.
- [PHP API](/nl/hc/documentatie/dxpr-builder-leren/ontwikkeling/api) voor de services die de controllers aanroepen.
- [Hooks API](/nl/hc/documentatie/dxpr-builder-leren/ontwikkeling/hooks-api) voor de hooks waarmee andere modules buildergedrag wijzigen.