---
url: 'https://dxpr.com/it/hc/documentation/learn-dxpr-builder/reference/api-endpoints'
title: 'Endpoint API | DXPR'
author:
  name: Jurriaan
  url: 'https://dxpr.com/users/jurriaan'
date: '2026-10-23T23:58:52+00:00'
updated: '2026-10-24T09:09:48+00:00'
copyright: 'Copyright DXPR. All rights reserved.'
type: article
summary: |-
  Questa pagina elenca ogni route registrata da DXPR Builder in
  dxpr_builder.routing.yml, con i metodi HTTP, i requisiti
  di accesso, i parametri di richiesta e le forme di risposta come
  implementati nei controller. Il JavaScript dell’editor è il
  client previsto per gli endpoint AJAX; niente in questa pagina è una
  API pubblica stabile e i nomi dei parametri possono cambiare tra le
  versioni.
  Requisiti di accesso
  Le route usano tre tipi di requisito. Una route può combinarli.
tags:
  - 'Configuratie en API'
image: 'https://dxpr.com/themes/custom/dxpr_com/images/dxpr-share-card.jpg'
published: true
og:
  site_name: DXPR
  updated_time: '2026-10-24T09:09:48+0000'
  'image:alt': 'DXPR, powered by Drupal: AI-powered Drupal for marketers.'
schema:
  '@context': 'https://schema.org'
  '@graph':
    -
      mainEntity: {  }
    -
      '@type': TechArticle
      headline: 'Endpoint API'
      description: |-
        Questa pagina elenca ogni route registrata da DXPR Builder in
        dxpr_builder.routing.yml, con i metodi HTTP, i requisiti
        di accesso, i parametri di richiesta e le forme di risposta come
        implementati nei controller. Il JavaScript dell’editor è il
        client previsto per gli endpoint AJAX; niente in questa pagina è una
        API pubblica stabile e i nomi dei parametri possono cambiare tra le
        versioni.
        Requisiti di accesso
        Le route usano tre tipi di requisito. Una route può combinarli.
      image:
        '@type': ImageObject
        url: 'https://dxpr.com/themes/custom/dxpr_com/images/dxpr-share-card.jpg'
        width: '1200'
        height: '630'
      datePublished: '2026-10-23T23:58:52+0000'
      dateModified: '2026-10-24T09:09:48+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/it/hc/documentation/learn-dxpr-builder/reference/api-endpoints'
      articleSection: 'Configuratie en API'
    -
      '@type': WebPage
      '@id': 'https://dxpr.com/it/hc/documentation/learn-dxpr-builder/reference/api-endpoints'
      description: |-
        Questa pagina elenca ogni route registrata da DXPR Builder in
        dxpr_builder.routing.yml, con i metodi HTTP, i requisiti
        di accesso, i parametri di richiesta e le forme di risposta come
        implementati nei controller. Il JavaScript dell’editor è il
        client previsto per gli endpoint AJAX; niente in questa pagina è una
        API pubblica stabile e i nomi dei parametri possono cambiare tra le
        versioni.
        Requisiti di accesso
        Le route usano tre tipi di requisito. Una route può combinarli.
      breadcrumb:
        '@type': BreadcrumbList
        itemListElement:
          -
            '@type': ListItem
            position: 1
            name: Home
            item: 'https://dxpr.com/it'
      publisher:
        '@type': Organization
        '@id': 'https://dxpr.com/#organization'
        name: DXPR
      inLanguage: it
---
[Help Center](/it/hc)/[Documentation](/it/hc/documentation) /[Learn DXPR Builder](/hc/documentation/learn-dxpr-builder) /[Reference](/hc/documentation/learn-dxpr-builder/reference) /[Configuratie en API](/hc/documentation/learn-dxpr-builder/reference/config-and-api) # Endpoint API.

 Learn DXPR BuilderReferenceConfiguratie en API

   ## In this guide

 Related guides

- [Riferimento alla configurazione](/it/hc/documentation/learn-dxpr-builder/reference/config-reference)
- [Riferimento API](/it/hc/documentation/learn-dxpr-builder/development/api)
- [Riferimento API hook](/it/hc/documentation/learn-dxpr-builder/development/hooks-api)

Questa pagina elenca ogni route registrata da DXPR Builder in `dxpr_builder.routing.yml`, con i metodi HTTP, i requisiti di accesso, i parametri di richiesta e le forme di risposta come implementati nei controller. Il JavaScript dell’editor è il client previsto per gli endpoint AJAX; niente in questa pagina è una API pubblica stabile e i nomi dei parametri possono cambiare tra le versioni.

## Requisiti di accesso

Le route usano tre tipi di requisito. Una route può combinarli.

| Requisito | Significato |
|---|---|
| `_permission` | L’utente deve avere il permesso Drupal indicato. DXPR Builder definisce `administer dxpr builder configuration`, `edit with dxpr builder` e `administer dxpr_builder_profile` in `dxpr_builder.permissions.yml`; `view media` e `administer site configuration` vengono dal core. |
| `_csrf_token` | La richiesta deve portare un token CSRF valido nel parametro di query `token`. Per il gestore AJAX principale, l’editor recupera un URL con il token da `/dxpr_builder/csrf` (o dall’operazione `dxpr_builder_csrf`). Per le altre route, il formatter di campo inserisce URL con token in `drupalSettings.dxprBuilder`, per esempio `fileUploadUrl`, `entityLinkSuggestionsUrl`, `userSettingsUrl` e `aiAgent.endpointUrl`. |
| `_dxpr_builder_billable_user` | L’utente deve essere un utente fatturabile, come definito sotto. |

### Cosa significa "utente fatturabile"

`DxprBuilderBillableUserAccessCheck` consente l’accesso quando `DxprBuilderLicenseService::isBillableUser()` restituisce true per l’account corrente. Quel metodo restituisce false per gli account bloccati e per gli account il cui campo `dxpr_user_is_disavowed` è impostato (un amministratore esclude un utente dalla modifica nella pagina User Licenses). Altrimenti restituisce true per l’utente 1 e per ogni account che ha il permesso `edit with dxpr builder`. In breve: un utente fatturabile è un account attivo e non escluso autorizzato a modificare con DXPR Builder, e il servizio licenze conta questi account sulla tua chiave prodotto.

### Metodi HTTP

Dove una route dichiara `methods`, vengono instradati solo quei metodi. Dove non li dichiara, la route accetta qualsiasi metodo (il `MethodFilter` di Drupal filtra solo le route che dichiarano metodi). Le tabelle sotto indicano il metodo usato davvero dal JavaScript dell’editor quando è visibile nel sorgente.

## Endpoint AJAX dell’editor

### URL del token CSRF

|  |  |
|---|---|
| Percorso | `/dxpr_builder/csrf` |
| Rotta | `dxpr_builder.csrf_refresh` |
| Metodi | Non dichiarati (qualsiasi metodo). L’editor invia GET (`backend-connect.js`, `fetchCsrfTokenUrl()`). |
| Requisiti | Utente fatturabile |
| Controller | `AjaxController::ajaxRefresh()` |

La richiesta deve portare l’header `X-Requested-With: XMLHttpRequest`; senza di esso il controller restituisce HTTP 403 con il corpo JSON `{"error": "Invalid request"}`.

| Parametro | Origine | Obbligatorio | Note |
|---|---|---|---|
| `enterprise` | Query string | Facoltativo | Quando impostato su `true` e il modulo `dxpr_builder_e` è installato, il token è generato per la rotta `dxpr_builder_e.ajax_callback`. Quando impostato su `true` senza quel modulo, il controller solleva un’eccezione. |

Risposta: una stringa JSON con l’URL del gestore AJAX principale e un parametro di query `token`. L’URL è un percorso dalla radice del sito (base path incluso, senza host). Il JavaScript invia ogni operazione del builder a questo URL.

### Gestore AJAX principale

|  |  |
|---|---|
| Percorso | `/dxpr_builder/ajax` |
| Rotta | `dxpr_builder.ajax_callback` |
| Metodi | Non dichiarati (qualsiasi metodo). Il controller legge ogni parametro dal corpo POST e l’editor invia POST. |
| Requisiti | Utente fatturabile, token CSRF |
| Controller | `AjaxController::ajaxCallback()` |

Il campo `action` del corpo POST seleziona l’operazione. Ogni operazione e i suoi parametri sono elencati in [Operazioni del gestore AJAX principale](#main-ajax-handler-operations). Quando `action` manca o è sconosciuto, il controller restituisce un `AjaxResponse` Drupal vuoto senza comandi. La maggior parte delle operazioni che ricontrollano lo stato di utente fatturabile restituisce la stessa risposta vuota quando quel controllo fallisce; le tabelle notano le due eccezioni.

### Chat AI

|  |  |
|---|---|
| Percorso | `/dxpr_builder/ajax/ai/chat` |
| Rotta | `dxpr_builder.ai_chat` |
| Metodi | POST |
| Requisiti | `edit with dxpr builder`, utente fatturabile, token CSRF |
| Controller | `AiChatController::chat()` |

Il corpo della richiesta è JSON. Il controller inoltra la richiesta al provider `dxpr` del modulo Drupal `ai`, così nessuna chiave API raggiunge il browser. Prima della chiamata unisce i domini dell’impostazione `ai_output_allowed_domains` al filtro hostname del modulo `ai`, quando quel servizio esiste. Un valore di `*` imposta il filtro su piena fiducia. Il filtro viene ripristinato dopo.

| Parametro | Origine | Obbligatorio | Note |
|---|---|---|---|
| `messages` | Corpo JSON | Obbligatorio | Array di oggetti con `role` e `content`. |
| `stream` | Corpo JSON | Facoltativo | Booleano, predefinito `true`. |
| `model` | Corpo JSON | Facoltativo | Predefinito `kavya-m1`. |
| `prediction` | Corpo JSON | Facoltativo | Passato alla configurazione del provider come array. |
| `providers` | Corpo JSON | Facoltativo | Inoltrato alla configurazione del provider. |
| `allowed_html_tags` | Corpo JSON | Facoltativo | Inoltrato alla configurazione del provider. |
| `allowed_html_classes` | Corpo JSON | Facoltativo | Inoltrato alla configurazione del provider. |
| `web_search` | Corpo JSON | Facoltativo | Solo il valore `false` viene inoltrato; qualsiasi altro valore è ignorato. |
| `response_format` | Corpo JSON | Facoltativo | Passato alla configurazione del provider come array. |

Risposte:

| Caso | Stato | Corpo |
|---|---|---|
| In streaming (`stream` true e il provider trasmette) | 200, `Content-Type: text/event-stream` | Eventi server-sent. Ogni evento è `data: <JSON>` dove il JSON ha `choices[0].delta.content` e, quando il provider li fornisce, `id`, `object`, `created`, `model`, `original_model` e `usage`. Lo stream finisce con `data: [DONE]`. |
| Non in streaming | 200, `application/json` | `{"choices": [{"message": {"role": "assistant", "content": "<text>"}}]}` |
| Il corpo non è JSON, oppure `messages` manca o è vuoto | 400, testo semplice | `Invalid request: messages required` |
| `model` non nell’elenco `allowed_models` di `ai_provider_dxpr.settings` (controllato solo quando il modulo `ai_provider_dxpr` è installato e l’elenco è impostato) | 403, `application/json` | `{"error": {"code": "model_not_allowed", "message": "The selected model is not allowed. Please refresh the page to update your model options."}}` |
| Eccezione del provider | 500, `application/json` | `{"error": {"message": "The request could not be completed."}}` |

### Generazione di immagini AI

|  |  |
|---|---|
| Percorso | `/dxpr_builder/ajax/ai/image` |
| Rotta | `dxpr_builder.ai_image` |
| Metodi | POST |
| Requisiti | `edit with dxpr builder`, utente fatturabile, token CSRF |
| Controller | `AiImageController::generate()` |

| Parametro | Origine | Obbligatorio | Note |
|---|---|---|---|
| `prompt` | Corpo JSON | Obbligatorio | Prompt di testo. |
| `model` | Corpo JSON | Facoltativo | Predefinito `kavya-image`. |
| `size` | Corpo JSON | Facoltativo | Inoltrato alla configurazione del provider quando non vuoto. |
| `quality` | Corpo JSON | Facoltativo | Inoltrato alla configurazione del provider quando non vuoto. |
| `background` | Corpo JSON | Facoltativo | Inoltrato alla configurazione del provider quando non vuoto. |

Risposte:

| Caso | Stato | Corpo |
|---|---|---|
| Operazione riuscita | 200 | `{"data": [{"b64_json": "<base64 image>"}]}` (viene restituita solo la prima immagine generata) |
| Il corpo non è JSON, oppure `prompt` manca | 400 | `{"error": {"message": "Invalid request: prompt required"}}` |
| Il provider non ha restituito immagini | 500 | `{"error": {"message": "No image was generated"}}` |
| Eccezione del provider | 500 | `{"error": {"message": "Image generation failed. Please try again."}}` |

### Modifica di immagini AI

|  |  |
|---|---|
| Percorso | `/dxpr_builder/ajax/ai/image/edit` |
| Rotta | `dxpr_builder.ai_image_edit` |
| Metodi | POST |
| Requisiti | `edit with dxpr builder`, utente fatturabile, token CSRF |
| Controller | `AiImageController::edit()` |

| Parametro | Origine | Obbligatorio | Note |
|---|---|---|---|
| `prompt` | Corpo JSON | Obbligatorio | Istruzione di modifica. |
| `image` | Corpo JSON | Obbligatorio | Immagine sorgente codificata in base64 (decodifica rigida). |
| `mimeType` | Corpo JSON | Facoltativo | Predefinito `image/png`; il sottotipo diventa l’estensione di file passata al provider. |
| `model` | Corpo JSON | Facoltativo | Predefinito `kavya-image`. |
| `size`, `quality`, `background` | Corpo JSON | Facoltativo | Inoltrati alla configurazione del provider quando non vuoti. |

Risposte:

| Caso | Stato | Corpo |
|---|---|---|
| Operazione riuscita | 200 | `{"data": [{"b64_json": "<base64 image>"}]}` |
| Il corpo non è JSON, oppure `prompt` o `image` manca | 400 | `{"error": {"message": "Invalid request: prompt and image required"}}` |
| `image` non è base64 valido | 400 | `{"error": {"message": "Invalid image data: base64 decode failed"}}` |
| Il provider non ha restituito immagini | 500 | `{"error": {"message": "No image was generated"}}` |
| Eccezione del provider | 500 | `{"error": {"message": "Image editing failed. Please try again."}}` |

### Caricamento file

|  |  |
|---|---|
| Percorso | `/dxpr_builder/ajax/file_upload` |
| Rotta | `dxpr_builder.ajax_file_upload_callback` |
| Metodi | POST, DELETE (dichiarati nel routing; il controller ha un unico gestore di caricamento e nessun ramo separato di cancellazione) |
| Requisiti | Utente fatturabile, token CSRF |
| Controller | `UploadFileController::fileUpload()` |

| Parametro | Origine | Obbligatorio | Note |
|---|---|---|---|
| `upload` | File del form multipart, inviati come `upload[]` | Obbligatorio | Uno o più file caricati. |

Il controller smista ogni file in base alla prima parte del suo MIME client in `<schema predefinito>://dxpr_builder_images`, `dxpr_builder_videos` o `dxpr_builder_files`. Un’immagine richiede un’estensione dei tipi MIME `image/gif`, `jpg`, `jpeg`, `png`, `webp`, `avif` o `svg`. Un video ne richiede una tra `video/webm`, `ogv`, `ogg`, `mp4` o `quicktime` (per esempio `.mov`). Il limite di dimensione è il massimo di caricamento di PHP. Un file con lo stesso nome e contenuto SHA-256 identico a un file gestito esistente che l’utente può vedere viene riusato invece di essere salvato di nuovo. Quando il modulo `media` è installato ed esiste un tipo di media chiamato `image`, `media_image`, `video` o `media_video`, viene creata (o riusata) per il file un’entità media pubblicata. L’uso del file è registrato sotto il modulo `dxpr_builder`.

Risposte:

| Caso | Stato | Corpo |
|---|---|---|
| Operazione riuscita | 201 | Array JSON, un oggetto per file: `url` (URL assoluto del file), `uuid` e `id` (dell’entità media quando esiste, altrimenti del file), `fid` (ID del file), `entity_type` (`media` o `file`). |
| Nessun file `upload` caricato | 400 | `{"message": "No files were uploaded."}` |
| Caricamento non valido, destinazione non scrivibile o salvataggio non riuscito | 500 | `{"message": "<reason>"}` |
| Validazione non riuscita (estensione o dimensione) | 422 | `{"message": "<violation messages>"}` |
| Nome file già bloccato da un’altra richiesta | 503 | `{"message": "File \"<name>\" is already locked for writing."}` |

### Finestra della libreria multimediale

|  |  |
|---|---|
| Percorso | `/dxpr_builder/media-library` |
| Rotta | `dxpr_builder.media_library` |
| Metodi | Non dichiarati (qualsiasi metodo). I parametri sono letti dalla query string. |
| Requisiti | `view media`; rotta admin |
| Controller | `AjaxController::openImageMediaLibrary()` |

| Parametro | Origine | Obbligatorio | Note |
|---|---|---|---|
| `media_type` | Query string | Facoltativo | `image` (predefinito) o `video`. |
| `remaining_slots` | Query string | Facoltativo | Numero di elementi accettati dall’apertura; predefinito 1. |
| `uuid` | Query string | Facoltativo | Passato all’apertura come `opener_parameters.uuid`. |

Il tipo di media offerto dipende dall’impostazione `media_browser`: `media_library` usa direttamente il tipo di media `image` o `video`; `media_library_acquia_dam` usa `acquia_dam_image_asset` o `acquia_dam_video_asset` quando quel tipo di media esiste.

Risposte:

| Caso | Risultato |
|---|---|
| Operazione riuscita | Un render array costruito da `MediaLibraryUiBuilder::buildUi()` con l’apertura `media_library.opener.dxpr_builder`. Drupal lo rende come pagina HTML pensata per un iframe. |
| `media_library`: modulo non installato | 403, testo semplice `Media Library is not enabled. Please enable it to access this feature.` |
| Tipo di media non supportato: `media_type` | 400, testo semplice `Unsupported media type "<value>".` |
| `media_browser`: l’impostazione non ha un tipo di media usabile | 400, testo semplice `The "<setting>" settings is not supported.` |

### Validatore dei link di aiuto

|  |  |
|---|---|
| Percorso | `/dxpr_builder/ajax/help_link_validator` |
| Rotta | `dxpr_builder.ajax_help_link_validator` |
| Metodi | Non dichiarati (qualsiasi metodo). Lo script dev `dxpr_builder_dev.js` invia POST con corpo form-encoded. |
| Requisiti | Utente fatturabile |
| Controller | `AjaxController::validateHelpLink()` |

| Parametro | Origine | Obbligatorio | Note |
|---|---|---|---|
| `help_link` | Corpo POST | Obbligatorio per una risposta sensata | Vengono controllati solo URL `http` o `https` sull’host `dxpr.com` con percorso che inizia per `/documentation/`. |

Risposta: un array JSON. `[true]` quando una richiesta HEAD al link (senza seguire redirect) restituisce 200; `[false]` quando il client HTTP solleva un’eccezione; `[]` in ogni altro caso, inclusi parametro mancante, URL non corrispondente o stato diverso da 200.

### Suggerimenti di link a entità

|  |  |
|---|---|
| Percorso | `/dxpr_builder/entity-link-suggestions` |
| Rotta | `dxpr_builder.entity_link_suggestions` |
| Metodi | GET |
| Requisiti | `edit with dxpr builder`, token CSRF; `no_cache` come opzione di rotta |
| Controller | `EntityLinkSuggestionsController::suggestions()` |

| Parametro | Origine | Obbligatorio | Note |
|---|---|---|---|
| `q` | Query string | Obbligatorio per avere risultati | Testo di ricerca, in minuscolo. Un valore come `/node/123` carica direttamente quell’entità. |
| `langcode` | Query string | Facoltativo | Lingua dell’entità ospite; predefinita la lingua corrente. Vengono restituite solo entità disponibili in questa lingua. |

I bundle sono quelli con `ckeditor5_link_suggestions` attivo nelle loro info bundle; quando nessuno è configurato, si cercano tutti i bundle nodo. Fino a 100 entità per tipo di entità vengono abbinate con una ricerca `CONTAINS` tramite i plugin di selezione reference di entità del core.

Risposta: `{"suggestions": [...]}` con cacheabilità privata e un’età massima di 300 secondi. Ogni suggerimento ha `description`, `entity_type_id`, `entity_uuid`, `group`, `label` e `path`. Quando `q` non trova nulla, l’array contiene un unico suggerimento di link manuale con `description`, `label` (l’input in minuscolo) e `path` (l’input quando è un URL valido, altrimenti una stringa vuota). Quando `q` è vuoto, `suggestions` è un array vuoto.

### Impostazioni editor dell’utente

|  |  |
|---|---|
| Percorso | `/dxpr_builder/user-settings` |
| Rotta | `dxpr_builder.user_settings` |
| Metodi | POST |
| Requisiti | `edit with dxpr builder`, token CSRF; `no_cache` come opzione di rotta |
| Controller | `UserSettingsController::save()` |

L’editor invia questa richiesta quando un utente cambia le proprie impostazioni editor, per esempio in **Editor settings**. I valori sono salvati con l’account utente in `user.data`, modulo `dxpr_builder`.

| Parametro | Origine | Obbligatorio | Note |
|---|---|---|---|
| `controls_layout` | Corpo JSON | Obbligatorio (l’unica impostazione) | `element`, `breadcrumb` o `default`. `default` rimuove la scelta dell’utente, così si applica l’impostazione del profilo o del sito. |

Risposte:

| Caso | Stato | Corpo |
|---|---|---|
| Salvato | 200 | `{"settings": {"controls_layout": "<value>"}}`: ogni impostazione dopo il salvataggio, `default` dove l’utente non ha scelte salvate. |
| Il corpo non è un oggetto JSON non vuoto, oppure un nome o valore non è valido | 400 | `{"error": "Invalid setting or value."}`. Nulla viene salvato. |

## Operazioni del gestore AJAX principale

Tutte le operazioni vanno a `/dxpr_builder/ajax` con il parametro di query token ottenuto da `/dxpr_builder/csrf`. Il nome dell’operazione è inviato nel campo `action` del corpo POST; tutti gli altri parametri sono campi del corpo POST salvo indicazione diversa. La colonna "Ricontrolla utente fatturabile" segna le operazioni che richiamano `isBillableUser()` di nuovo dentro lo switch. Quando quel controllo fallisce restituiscono la `AjaxResponse` vuota descritta sopra, salvo indicazione diversa nella riga.

### Sessione e accesso

| Operazione | Parametri | Ricontrolla utente fatturabile | Restituisce |
|---|---|---|---|
| `dxpr_login` | Nessuno | No | Booleano JSON: se l’utente corrente è fatturabile. |
| `dxpr_builder_csrf` | Nessuno | Sì | Stringa JSON: l’URL del gestore con un parametro di query `token` (come `/dxpr_builder/csrf` senza l’opzione `enterprise`). |

### Contenitori (campi resi con il formatter DXPR Builder)

| Operazione | Parametri | Ricontrolla utente fatturabile | Restituisce |
|---|---|---|---|
| `dxpr_get_container_types` | Nessuno | Sì | Oggetto JSON con chiavi `entity_type\|bundle` e valori `entity_type - bundle`, una voce per bundle la cui visualizzazione predefinita usa il formatter `dxpr_builder_text` su almeno un campo. |
| `dxpr_get_container_names` | `container_type` (obbligatorio, `entity_type\|bundle`) | Sì (restituisce una stringa JSON vuota invece della risposta vuota) | Oggetto JSON con chiavi `entity_id\|field_name` (o `entity_id\|field_name\|langcode` per entità traducibili) e valori `entity label\|field label`. Quando `container_type` manca, o il controllo di fatturazione fallisce, la risposta è una stringa JSON vuota. |
| `dxpr_save_container` | `type` (obbligatorio, `entity_type\|bundle`); `name` (obbligatorio, `entity_id\|field_name` o `entity_id\|revision_id\|field_name`); `htmlContent` (obbligatorio, markup codificato); `lang` (facoltativo, predefinita la lingua predefinita del sito) | Sì | Stringa JSON vuota in caso di successo. HTTP 400 con messaggio JSON quando `htmlContent` non è una stringa o la lingua non si applica a un’entità non traducibile; 404 quando la traduzione richiesta non esiste; 500 quando l’entità non può essere caricata. |

`dxpr_save_container` fa quanto segue:

1. Decodifica `htmlContent`: XOR di ogni byte con 7, poi URL-decode.
2. Scrive il risultato nel primo delta del campo indicato.
3. Crea una nuova revisione predefinita con il messaggio di log `Saved with DXPR builder` quando il tipo di entità ammette revisioni.
4. Rimuove ogni blocco di contenuto per l’entità.
5. Aggiorna `block_revision_id` nelle sezioni Layout Builder che referenziano il blocco inline salvato.
6. Incrementa il valore di stato `dxpr_builder.saves_count`.

Il salvataggio avviene solo quando l’utente ha accesso `update` all’entità. Senza di esso, l’operazione restituisce comunque la risposta di successo a stringa vuota.

### Elementi CMS (blocchi e viste)

| Operazione | Parametri | Ricontrolla utente fatturabile | Restituisce |
|---|---|---|---|
| `dxpr_builder_get_cms_element_names` | Nessuno | Sì | Oggetto JSON da `DxprBuilderService::getCmsElementNames()` con chiavi `list`, `disallowed` e `blockCategories`. |
| `dxpr_get_cms_element_settings` | `name` (obbligatorio): `view-<view_id>-<display_id>` o `block-<plugin_id>`; `ajax_page_state[libraries]` (facoltativo, librerie già caricate separate da virgola) | Sì | Oggetto JSON con `css`, `js`, `settings` e `data`. Per una vista, `data` sono i widget dei filtri esposti resi; per un blocco, `data` è il form di configurazione del blocco racchiuso in tag `<form>`, con gli elementi `provider`, `admin_label`, `label`, `label_display` e `context_mapping` rimossi e tutti gli elementi details aperti. |
| `dxpr_builder_load_cms_element` | `name` (obbligatorio, analizzato da `parseStringForCmsElementInfo()`); `settings` (obbligatorio); `data` (obbligatorio, array); `ajax_page_state[libraries]` (facoltativo) | No | Oggetto JSON con `css`, `js`, `settings` e `data`, dove `data` è la vista o il blocco reso. |

In entrambe le operazioni che restituiscono `settings`, `css` e `js` sono tag di asset resi non già presenti nella pagina, e `settings` è l’oggetto `drupalSettings` decodificato, o una stringa vuota quando non ce ne sono.

### Modelli di pagina

| Operazione | Parametri | Ricontrolla utente fatturabile | Restituisce |
|---|---|---|---|
| `dxpr_get_page_templates` | Nessuno | Sì | Array JSON dei modelli di pagina attivi, ciascuno con `title`, `uuid`, `module` (sempre `null`: l’entità non lo salva), `category`, `date`, `weight` (intero) e `image` (un URL `data:`, o l’URL di `not-found.png` del modulo). |
| `dxpr_load_page_template` | `uuid` (obbligatorio) | Sì | Risposta HTML contenente il markup del modello con i token base sostituiti; vuota quando nessun modello attivo corrisponde. |

### Modelli utente

| Operazione | Parametri | Ricontrolla utente fatturabile | Restituisce |
|---|---|---|---|
| `dxpr_get_templates` | Nessuno | Sì | Array JSON dei modelli dell’utente corrente o marcati globali; i modelli il cui account autore non esiste più sono esclusi. Ogni voce ha `id`, `uuid`, `name`, `global`, `current_user_is_author`, `author_id`, `author_name`, `type` e, quando salvata, `image` (un URL `data:`). |
| `dxpr_load_template` | `uuid` (obbligatorio) | Sì | Risposta HTML contenente il markup del modello con i token base sostituiti; vuota quando nessun modello attivo corrisponde. |
| `dxpr_save_template` | `name` (obbligatorio); `template` (obbligatorio, markup); `type` (facoltativo, predefinito `custom`); `global` (facoltativo, convertito in booleano); `image` (facoltativo: una stringa base64 o URL `data:image` nel corpo POST, o un campo file multipart chiamato `image`) | Sì | Oggetto JSON con `message` e `code`. `code` 200 in caso di successo; `code` 409 (stato HTTP 200) quando esiste un modello con lo stesso machine name; `code` 400 con HTTP 400 quando l’immagine non è dati immagine validi. |
| `dxpr_delete_template` | `name` (obbligatorio) | Sì | Stringa JSON vuota. |

Il machine name deriva da `name` minuscolizzandolo e sostituendo ogni sequenza di caratteri fuori da `a-z0-9_` con un underscore. `type` ripiega sull’attributo `data-azb` nel markup quando un modello salvato non ha tipo.

### Immagini

| Operazione | Parametri | Ricontrolla utente fatturabile | Restituisce |
|---|---|---|---|
| `dxpr_builder_get_image_urls` | `entityIDs` (obbligatorio, array); `imageStyle` (obbligatorio; `original` per il file non stilizzato); `entityType` (obbligatorio; `media` risolve media, qualsiasi altro valore è usato come tipo di entità degli ID) | Sì | Corpo di testo: URL di immagini separati da virgola. I file danno un URL relativo alla radice con parametro di query `fid`. I media di tipo `image` o `video` si risolvono nel loro file sorgente. Gli elementi `acquia_dam_image_asset` danno l’URL DAM con `mid`, `acquiaDamAsset` e `imageStyle` aggiunti. Gli altri media sono saltati. HTTP 204 senza corpo quando `entityIDs` è vuoto, o quando nessun media può essere risolto. |
| `dxpr_builder_get_image_style_url` | `imageStyle` (obbligatorio); `entityId` (obbligatorio); `entityTypeId` (obbligatorio, `file` o `media`) | Sì | Corpo di testo. Per un file: il suo URL relativo alla radice tramite lo stile immagine (i file SVG e `original` saltano lo stile), con parametro di query `fid`. Per un media `acquia_dam_image_asset`: l’URL DAM. HTTP 204 senza corpo per qualsiasi altra entità, o quando l’entità non è trovata. |
| `dxpr_builder_get_image_metadata` | `entityId` (obbligatorio); `entityType` (obbligatorio, `file` o `media`) | Sì (restituisce invece JSON 403 invece della risposta vuota) | `{"data": {"alt": "...", "title": "..."}}` dal campo sorgente immagine del media (un asset Acquia DAM dà il suo testo alt DAM e un titolo vuoto). Per un file, i valori vengono dal primo media il cui `field_media_image` lo referenzia. `data` è un array vuoto quando l’entità non è né file né media, o quando nessun media referenzia il file. Errori: 400 `{"error": "Missing required parameters"}`, 404 `{"error": "Entity not found"}`, 500 `{"error": "Failed to load entity"}`, 403 `{"error": "Access denied"}`. |

### Blocchi di contenuto

| Operazione | Parametri | Ricontrolla utente fatturabile | Restituisce |
|---|---|---|---|
| `dxpr_content_lock_status` | `entity_id`, `revision_id`, `entity_type`, `langcode` (tutti obbligatori) | No | Oggetto JSON con `status` (booleano) e `label` (etichetta dell’entità); quando bloccato, anche `entity_lock_author_id` e `entity_lock_author_name`. |
| `dxpr_toggle_content_lock` | `entity_id`, `revision_id`, `entity_type`, `langcode`, `toggle_action` (tutti obbligatori; `lock` crea il blocco, qualsiasi altro valore lo rimuove) | No | Oggetto JSON con `label` e `status` (`true` dopo il blocco, `false` dopo lo sblocco). Un array JSON vuoto (`[]`) quando l’entità non può essere caricata o l’utente non ha accesso `update`. |

## Pagine admin

Tutte queste route accettano qualsiasi metodo (nessuna chiave `methods`). I percorsi con `{...}` prendono l’ID dell’entità di configurazione, o l’ID di migrazione per `{migration_id}`.

| Percorso | Rotta | Permesso | Scopo |
|---|---|---|---|
| `/admin/dxpr_studio` | `dxpr_builder.admin.studio` | `administer dxpr builder configuration` | Panoramica DXPR Studio; pagina blocco menu admin del core che elenca le pagine figlie. |
| `/admin/dxpr_studio/dxpr_builder` | `dxpr_builder.admin.studio.builder` | `administer dxpr builder configuration` | Panoramica DXPR Builder; pagina blocco menu admin del core. |
| `/admin/dxpr_studio/dxpr_builder/settings` | `dxpr_builder.settings` | `administer dxpr builder configuration` | `DxprBuilderSettingsForm`: il form delle impostazioni del modulo. |
| `/admin/dxpr_studio/dxpr_builder/ai_settings` | `dxpr_builder.ai_settings` | `administer dxpr builder configuration` | `DxprBuilderAiSettingsForm`: il form delle impostazioni AI. |
| `/admin/dxpr_studio/dxpr_builder/user_templates` | `entity.dxpr_builder_user_template.collection` | `administer site configuration` | Elenco delle entità di configurazione `dxpr_builder_user_template`. |
| `/admin/dxpr_studio/dxpr_builder/user_templates/add` | `entity.dxpr_builder_user_template.add_form` | `administer site configuration` | Aggiungi un modello utente. |
| `/admin/dxpr_studio/dxpr_builder/user_templates/{dxpr_builder_user_template}` | `entity.dxpr_builder_user_template.edit_form` | `administer site configuration` | Modifica un modello utente. |
| `/admin/dxpr_studio/dxpr_builder/user_templates/{dxpr_builder_user_template}/delete` | `entity.dxpr_builder_user_template.delete_form` | `administer site configuration` | Cancella un modello utente (form di conferma). |
| `/admin/dxpr_studio/dxpr_builder/page_template` | `entity.dxpr_builder_page_template.collection` | `administer site configuration` | Elenco delle entità di configurazione `dxpr_builder_page_template`. |
| `/admin/dxpr_studio/dxpr_builder/page_template/add` | `entity.dxpr_builder_page_template.add_form` | `administer site configuration` | Aggiungi un modello di pagina. |
| `/admin/dxpr_studio/dxpr_builder/page_template/create` | `dxpr_builder.create_page_template` | `administer dxpr builder configuration` | `PageController::createPageTemplate()`: copia il modello utente attivo identificato dal parametro di query `uuid` in un nuovo modello di pagina con stesso ID e categoria `DXPR`. Imposta un messaggio di stato o di errore e reindirizza all’elenco dei modelli utente. |
| `/admin/dxpr_studio/dxpr_builder/page_template/{dxpr_builder_page_template}` | `entity.dxpr_builder_page_template.edit_form` | `administer site configuration` | Modifica un modello di pagina. |
| `/admin/dxpr_studio/dxpr_builder/page_template/{dxpr_builder_page_template}/delete` | `entity.dxpr_builder_page_template.delete_form` | `administer site configuration` | Cancella un modello di pagina (form di conferma). |
| `/admin/dxpr_studio/dxpr_builder/profile` | `entity.dxpr_builder_profile.collection` | `administer dxpr_builder_profile` | Elenco delle entità di configurazione `dxpr_builder_profile`. |
| `/admin/dxpr_studio/dxpr_builder/profile/add` | `entity.dxpr_builder_profile.add_form` | `administer dxpr_builder_profile` | Aggiungi un profilo. |
| `/admin/dxpr_studio/dxpr_builder/profile/{dxpr_builder_profile}` | `entity.dxpr_builder_profile.edit_form` | `administer dxpr_builder_profile` | Modifica un profilo. |
| `/admin/dxpr_studio/dxpr_builder/profile/{dxpr_builder_profile}/delete` | `entity.dxpr_builder_profile.delete_form` | `administer dxpr_builder_profile` | Cancella un profilo (form di conferma). |
| `/admin/dxpr_studio/dxpr_builder/user_licenses` | `dxpr_builder.user_licenses` | `administer dxpr builder configuration` | `PageController::userLicensesPage()`: tabella non cachata degli utenti con licenza (colonne User, Roles, Sites, Assigned e Operations). Sopra, la pagina rende la sua card di riepilogo licenza (`dxpr-license-info`) quando le informazioni di licenza sono disponibili e, mentre una licenza liberata sconta i suoi 30 giorni, un avviso "Next license available on". Su questa rotta il blocco **License info** non rende nulla, così il riepilogo non compare mai due volte. |
| `/admin/dxpr_studio/dxpr_builder/user_licenses/sites` | `dxpr_builder.user_licenses.sites` | `administer dxpr builder configuration` | `PageController::userLicensesSitesPage()`: elenco degli domini registrati per l’utente dato nel parametro di richiesta `mail`; aperto in una modale dalla tabella licenze. |
| `/admin/dxpr_studio/dxpr_builder/content` | `dxpr_builder.licensed_content` | `administer dxpr builder configuration` | `PageController::licensedContentPage()`: tabella paginata (20 per pagina) dei contenuti modificati con DXPR Builder, con il riepilogo licenza dei contenuti. Il parametro di query `needs_migration=1` mostra solo gli elementi che richiedono una migrazione di contenuto. Vuota quando non sono disponibili informazioni di licenza. |
| `/admin/dxpr_studio/dxpr_builder/migration-status` | `dxpr_builder.migration_status` | `administer dxpr builder configuration` | `MigrationStatusController::statusPage()`: tabella non cachata delle migrazioni di contenuto registrate con i loro elementi in attesa. Ogni migrazione in attesa ha un link **Run now** e un pulsante **Run all pending migrations** compare quando ce ne sono in attesa. |
| `/admin/dxpr_studio/dxpr_builder/migration-run/{migration_id}` | `dxpr_builder.migration_run_confirm` | `administer dxpr builder configuration` | `MigrationRunConfirmForm`: conferma, poi esegue una migrazione come batch e torna alla pagina di stato. |
| `/admin/dxpr_studio/dxpr_builder/migration-run-all` | `dxpr_builder.migration_run_all_confirm` | `administer dxpr builder configuration` | `MigrationRunAllConfirmForm`: conferma, poi esegue ogni migrazione registrata come un unico batch e torna alla pagina di stato. |
| `/dxpr-builder/disavow-user` | `dxpr_builder.disavow_user_confirm` | `administer dxpr builder configuration` | `DisavowUserConfirmForm`: conferma l’esclusione dell’utente dato nel parametro di query `uid` dalla modifica con DXPR Builder. |
| `/dxpr-builder/delete-stale-user` | `dxpr_builder.delete_stale_user_confirm` | `administer dxpr builder configuration` | `DeleteStaleUserConfirmForm`: conferma la rimozione dei dati di licenza per l’indirizzo email dato nel parametro di query `email`. |

## E adesso?

- [Riferimento alla configurazione](/it/hc/documentation/learn-dxpr-builder/reference/config-reference) per le impostazioni che controllano il browser multimediale e il comportamento AI usati da questi endpoint.
- [PHP API](/it/hc/documentation/learn-dxpr-builder/development/api) per i servizi chiamati dai controller.
- [Hooks API](/it/hc/documentation/learn-dxpr-builder/development/hooks-api) per gli hook che permettono ad altri moduli di modificare il comportamento del builder.