---
url: 'https://dxpr.com/pt-pt/hc/documentation/learn-dxpr-builder/reference/api-endpoints'
title: 'Pontos de extremidade da API | DXPR'
author:
  name: Jurriaan
  url: 'https://dxpr.com/users/jurriaan'
date: '2026-10-24T09:02:59+00:00'
updated: '2026-10-24T09:09:48+00:00'
copyright: 'Copyright DXPR. All rights reserved.'
type: article
summary: |-
  Esta página lista todas as rotas que o DXPR Builder regista em
  dxpr_builder.routing.yml, com os métodos HTTP, requisitos de acesso, parâmetros de pedido e formas de resposta conforme implementados nos controladores. O JavaScript do editor é o cliente previsto para os pontos de extremidade AJAX; nada nesta página é uma API pública estável, e os nomes de parâmetros podem mudar entre lançamentos.
  Requisitos de acesso
  As rotas usam três tipos de requisito. Uma rota pode combiná-los.
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: 'Pontos de extremidade da API'
      description: |-
        Esta página lista todas as rotas que o DXPR Builder regista em
        dxpr_builder.routing.yml, com os métodos HTTP, requisitos de acesso, parâmetros de pedido e formas de resposta conforme implementados nos controladores. O JavaScript do editor é o cliente previsto para os pontos de extremidade AJAX; nada nesta página é uma API pública estável, e os nomes de parâmetros podem mudar entre lançamentos.
        Requisitos de acesso
        As rotas usam três tipos de requisito. Uma rota pode combiná-los.
      image:
        '@type': ImageObject
        url: 'https://dxpr.com/themes/custom/dxpr_com/images/dxpr-share-card.jpg'
        width: '1200'
        height: '630'
      datePublished: '2026-10-24T09:02:59+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/pt-pt/hc/documentation/learn-dxpr-builder/reference/api-endpoints'
      articleSection: 'Configuratie en API'
    -
      '@type': WebPage
      '@id': 'https://dxpr.com/pt-pt/hc/documentation/learn-dxpr-builder/reference/api-endpoints'
      description: |-
        Esta página lista todas as rotas que o DXPR Builder regista em
        dxpr_builder.routing.yml, com os métodos HTTP, requisitos de acesso, parâmetros de pedido e formas de resposta conforme implementados nos controladores. O JavaScript do editor é o cliente previsto para os pontos de extremidade AJAX; nada nesta página é uma API pública estável, e os nomes de parâmetros podem mudar entre lançamentos.
        Requisitos de acesso
        As rotas usam três tipos de requisito. Uma rota pode combiná-los.
      breadcrumb:
        '@type': BreadcrumbList
        itemListElement:
          -
            '@type': ListItem
            position: 1
            name: Início
            item: 'https://dxpr.com/pt-pt'
      publisher:
        '@type': Organization
        '@id': 'https://dxpr.com/#organization'
        name: DXPR
      inLanguage: pt-pt
---
[Help Center](/pt-pt/node/75)/[Documentation](/pt-pt/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) # Pontos de extremidade da API.

 Learn DXPR BuilderReferenceConfiguratie en API

   ## In this guide

 Related guides

- [Referência de configuração](/pt-pt/hc/documentation/learn-dxpr-builder/reference/config-reference)
- [Referência de API](/pt-pt/hc/documentation/learn-dxpr-builder/development/api)
- [Referência da API de hooks](/pt-pt/hc/documentation/learn-dxpr-builder/development/hooks-api)

Esta página lista todas as rotas que o DXPR Builder regista em `dxpr_builder.routing.yml`, com os métodos HTTP, requisitos de acesso, parâmetros de pedido e formas de resposta conforme implementados nos controladores. O JavaScript do editor é o cliente previsto para os pontos de extremidade AJAX; nada nesta página é uma API pública estável, e os nomes de parâmetros podem mudar entre lançamentos.

## Requisitos de acesso

As rotas usam três tipos de requisito. Uma rota pode combiná-los.

| Requisito | Significado |
|---|---|
| `_permission` | O utilizador precisa da permissão Drupal indicada. O DXPR Builder define `administer dxpr builder configuration`, `edit with dxpr builder` e `administer dxpr_builder_profile` em `dxpr_builder.permissions.yml`; `view media` e `administer site configuration` vêm do núcleo. |
| `_csrf_token` | O pedido tem de transportar um token CSRF válido no `token` parâmetro de consulta. Para o processador AJAX principal, o editor obtém um URL com o token de `/dxpr_builder/csrf` (ou do `dxpr_builder_csrf` operation). Para as outras rotas, o formatador de campo coloca URLs com um token em `drupalSettings.dxprBuilder`, por exemplo `fileUploadUrl`, `entityLinkSuggestionsUrl`, `userSettingsUrl` e `aiAgent.endpointUrl`. |
| `_dxpr_builder_billable_user` | O utilizador tem de ser um utilizador faturável, como definido abaixo. |

### O que significa "utilizador faturável"

`DxprBuilderBillableUserAccessCheck` permite o acesso quando `DxprBuilderLicenseService::isBillableUser()` devolve verdadeiro para a conta atual. Esse método devolve falso para contas bloqueadas e para contas cujo `dxpr_user_is_disavowed` campo está definido (um administrador exclui um utilizador da edição na página User Licenses). Caso contrário, devolve verdadeiro para o utilizador 1 e para qualquer conta que tenha a `edit with dxpr builder` permissão. Em resumo: um utilizador faturável é uma conta ativa e não excluída com permissão para editar com o DXPR Builder, e o serviço de licenças conta estas contas na sua chave de produto.

### Métodos HTTP

Quando uma rota declara `methods`, só esses métodos são encaminhados. Quando não declara, a rota aceita qualquer método (o `MethodFilter` do Drupal só filtra rotas que declaram métodos). As tabelas abaixo indicam o método que o JavaScript do editor usa de facto quando isso está visível no código.

## Pontos de extremidade AJAX do editor

### URL de token CSRF

|  |  |
|---|---|
| Caminho | `/dxpr_builder/csrf` |
| Rota | `dxpr_builder.csrf_refresh` |
| Métodos | Não declarado (qualquer método). O editor envia GET (`backend-connect.js`, `fetchCsrfTokenUrl()`). |
| Requisitos | Utilizador faturável |
| Controlador | `AjaxController::ajaxRefresh()` |

O pedido tem de transportar o cabeçalho `X-Requested-With: XMLHttpRequest`; sem ele, o controlador devolve HTTP 403 com o corpo JSON `{"error": "Invalid request"}`.

| Parâmetro | Origem | Obrigatório | Notas |
|---|---|---|---|
| `enterprise` | Query string | Optional | Quando definido como `true` e o `dxpr_builder_e` módulo está instalado, o token é gerado para a `dxpr_builder_e.ajax_callback` rota. Quando definido como `true` sem esse módulo, o controlador dispara uma exceção. |

Resposta: uma string JSON com o URL do processador AJAX principal e um `token` parâmetro de consulta. O URL é um caminho desde a raiz do site (caminho base incluído, sem anfitrião). O JavaScript publica todas as operações do construtor neste URL.

### Processador AJAX principal

|  |  |
|---|---|
| Caminho | `/dxpr_builder/ajax` |
| Rota | `dxpr_builder.ajax_callback` |
| Métodos | Não declarado (qualquer método). O controlador lê todos os parâmetros do corpo POST e o editor envia POST. |
| Requisitos | Utilizador faturável, token CSRF |
| Controlador | `AjaxController::ajaxCallback()` |

O campo do corpo POST `action` seleciona a operação. Todas as operações e os seus parâmetros estão listados em [Operações do processador AJAX principal](#main-ajax-handler-operations). Quando `action` falta ou é desconhecido, o controlador devolve um Drupal vazio `AjaxResponse` sem comandos. A maioria das operações que voltam a verificar o estado de utilizador faturável devolve a mesma resposta vazia quando essa verificação falha; as tabelas indicam as duas exceções.

### Chat de IA

|  |  |
|---|---|
| Caminho | `/dxpr_builder/ajax/ai/chat` |
| Rota | `dxpr_builder.ai_chat` |
| Métodos | POST |
| Requisitos | `edit with dxpr builder`, utilizador faturável, token CSRF |
| Controlador | `AiChatController::chat()` |

O corpo do pedido é JSON. O controlador reencaminha o pedido para o `dxpr` fornecedor do Drupal `ai` módulo, para nenhuma chave de API chegar ao navegador. Antes da chamada, funde os domínios de `ai_output_allowed_domains` definição no `ai` filtro de nome de anfitrião do módulo, quando esse serviço existe. Um valor de `*` define antes o filtro como confiança total. O filtro é reposto depois.

| Parâmetro | Origem | Obrigatório | Notas |
|---|---|---|---|
| `messages` | Corpo JSON | Obrigatório | Array de objetos com `role` e `content`. |
| `stream` | Corpo JSON | Optional | Booleano, predefinição `true`. |
| `model` | Corpo JSON | Optional | Default `kavya-m1`. |
| `prediction` | Corpo JSON | Optional | Passado para a configuração do fornecedor como array. |
| `providers` | Corpo JSON | Optional | Passado para a configuração do fornecedor. |
| `allowed_html_tags` | Corpo JSON | Optional | Passado para a configuração do fornecedor. |
| `allowed_html_classes` | Corpo JSON | Optional | Passado para a configuração do fornecedor. |
| `web_search` | Corpo JSON | Optional | Apenas o valor `false` é reencaminhado; qualquer outro valor é ignorado. |
| `response_format` | Corpo JSON | Optional | Passado para a configuração do fornecedor como array. |

Respostas:

| Caso | Estado | Corpo |
|---|---|---|
| Transmitido (`stream` verdadeiro e o fornecedor transmite) | 200, `Content-Type: text/event-stream` | Eventos enviados pelo servidor. Cada evento é `data: <JSON>` onde o JSON tem `choices[0].delta.content` e, quando o fornecedor os fornece, `id`, `object`, `created`, `model`, `original_model` e `usage`. O fluxo termina com `data: [DONE]`. |
| Não transmitido | 200, `application/json` | `{"choices": [{"message": {"role": "assistant", "content": "<text>"}}]}` |
| O corpo não é JSON, ou `messages` falta ou está vazio | 400, texto simples | `Invalid request: messages required` |
| `model` não no `allowed_models` lista de `ai_provider_dxpr.settings` (só verificado quando o `ai_provider_dxpr` módulo está instalado e a lista está definida) | 403, `application/json` | `{"error": {"code": "model_not_allowed", "message": "The selected model is not allowed. Please refresh the page to update your model options."}}` |
| Exceção do fornecedor | 500, `application/json` | `{"error": {"message": "The request could not be completed."}}` |

### Geração de imagens por IA

|  |  |
|---|---|
| Caminho | `/dxpr_builder/ajax/ai/image` |
| Rota | `dxpr_builder.ai_image` |
| Métodos | POST |
| Requisitos | `edit with dxpr builder`, utilizador faturável, token CSRF |
| Controlador | `AiImageController::generate()` |

| Parâmetro | Origem | Obrigatório | Notas |
|---|---|---|---|
| `prompt` | Corpo JSON | Obrigatório | Prompt de texto. |
| `model` | Corpo JSON | Optional | Default `kavya-image`. |
| `size` | Corpo JSON | Optional | Reencaminhado para a configuração do fornecedor quando não vazio. |
| `quality` | Corpo JSON | Optional | Reencaminhado para a configuração do fornecedor quando não vazio. |
| `background` | Corpo JSON | Optional | Reencaminhado para a configuração do fornecedor quando não vazio. |

Respostas:

| Caso | Estado | Corpo |
|---|---|---|
| Sucesso | 200 | `{"data": [{"b64_json": "<base64 image>"}]}` (só é devolvida a primeira imagem gerada) |
| O corpo não é JSON, ou `prompt` falta | 400 | `{"error": {"message": "Invalid request: prompt required"}}` |
| O fornecedor não devolveu nenhuma imagem | 500 | `{"error": {"message": "No image was generated"}}` |
| Exceção do fornecedor | 500 | `{"error": {"message": "Image generation failed. Please try again."}}` |

### Edição de imagens por IA

|  |  |
|---|---|
| Caminho | `/dxpr_builder/ajax/ai/image/edit` |
| Rota | `dxpr_builder.ai_image_edit` |
| Métodos | POST |
| Requisitos | `edit with dxpr builder`, utilizador faturável, token CSRF |
| Controlador | `AiImageController::edit()` |

| Parâmetro | Origem | Obrigatório | Notas |
|---|---|---|---|
| `prompt` | Corpo JSON | Obrigatório | Instrução de edição. |
| `image` | Corpo JSON | Obrigatório | Imagem de origem codificada em Base64 (descodificação estrita). |
| `mimeType` | Corpo JSON | Optional | Default `image/png`; o subtipo torna-se a extensão de ficheiro passada ao fornecedor. |
| `model` | Corpo JSON | Optional | Default `kavya-image`. |
| `size`, `quality`, `background` | Corpo JSON | Optional | Reencaminhado para a configuração do fornecedor quando não vazio. |

Respostas:

| Caso | Estado | Corpo |
|---|---|---|
| Sucesso | 200 | `{"data": [{"b64_json": "<base64 image>"}]}` |
| O corpo não é JSON, ou `prompt` ou `image` falta | 400 | `{"error": {"message": "Invalid request: prompt and image required"}}` |
| `image` não é base64 válido | 400 | `{"error": {"message": "Invalid image data: base64 decode failed"}}` |
| O fornecedor não devolveu nenhuma imagem | 500 | `{"error": {"message": "No image was generated"}}` |
| Exceção do fornecedor | 500 | `{"error": {"message": "Image editing failed. Please try again."}}` |

### Carregamento de ficheiros

|  |  |
|---|---|
| Caminho | `/dxpr_builder/ajax/file_upload` |
| Rota | `dxpr_builder.ajax_file_upload_callback` |
| Métodos | POST, DELETE (declarado no encaminhamento; o controlador tem um único processador de carregamento e nenhum ramo de eliminação separado) |
| Requisitos | Utilizador faturável, token CSRF |
| Controlador | `UploadFileController::fileUpload()` |

| Parâmetro | Origem | Obrigatório | Notas |
|---|---|---|---|
| `upload` | Ficheiros de formulário multipart, enviados como `upload[]` | Obrigatório | Um ou mais ficheiros carregados. |

O controlador ordena cada ficheiro pela primeira parte do seu tipo MIME de cliente em `<default scheme>://dxpr_builder_images`, `dxpr_builder_videos` ou `dxpr_builder_files`. Uma imagem precisa de uma extensão dos tipos MIME `image/gif`, `jpg`, `jpeg`, `png`, `webp`, `avif` ou `svg`. Um vídeo precisa de um de `video/webm`, `ogv`, `ogg`, `mp4` ou `quicktime` (por exemplo `.mov`). O limite de tamanho é o máximo de carregamento do PHP. Um ficheiro com o mesmo nome e conteúdo SHA-256 idêntico a um ficheiro gerido existente que o utilizador pode ver é reutilizado em vez de guardado de novo. Quando o `media` módulo está instalado e um tipo de média chamado `image`, `media_image`, `video` ou `media_video` existe, uma entidade de média publicada é criada (ou reutilizada) para o ficheiro. O módulo `dxpr_builder` regista o uso do ficheiro.

Respostas:

| Caso | Estado | Corpo |
|---|---|---|
| Sucesso | 201 | Array JSON, um objeto por ficheiro: `url` (URL de ficheiro absoluto), `uuid` e `id` (da entidade de média quando existe, senão do ficheiro), `fid` (ID de ficheiro), `entity_type` (`media` ou `file`). |
| Sem ficheiros `upload` enviados | 400 | `{"message": "No files were uploaded."}` |
| Carregamento inválido, destino não gravável ou falha ao guardar | 500 | `{"message": "<reason>"}` |
| Falha de validação (extensão ou tamanho) | 422 | `{"message": "<violation messages>"}` |
| Nome de ficheiro já bloqueado por outro pedido | 503 | `{"message": "File \"<name>\" is already locked for writing."}` |

### Caixa de diálogo da biblioteca de média

|  |  |
|---|---|
| Caminho | `/dxpr_builder/media-library` |
| Rota | `dxpr_builder.media_library` |
| Métodos | Não declarado (qualquer método). Os parâmetros são lidos da query string. |
| Requisitos | `view media`; rota de administração |
| Controlador | `AjaxController::openImageMediaLibrary()` |

| Parâmetro | Origem | Obrigatório | Notas |
|---|---|---|---|
| `media_type` | Query string | Optional | `image` (predefinição) ou `video`. |
| `remaining_slots` | Query string | Optional | Número de itens que o abridor aceita; predefine-se 1. |
| `uuid` | Query string | Optional | Passado ao abridor como `opener_parameters.uuid`. |

O tipo de média oferecido depende do `media_browser` definição: `media_library` usa o `image` ou `video` tipo de média diretamente; `media_library_acquia_dam` usa `acquia_dam_image_asset` ou `acquia_dam_video_asset` quando esse tipo de média existe.

Respostas:

| Caso | Resultado |
|---|---|
| Sucesso | Um array de apresentação construído por `MediaLibraryUiBuilder::buildUi()` com o abridor `media_library.opener.dxpr_builder`. O Drupal apresenta-o como uma página HTML destinada a um iframe. |
| `media_library` módulo não instalado | 403, texto simples `Media Library is not enabled. Please enable it to access this feature.` |
| Não suportado `media_type` | 400, texto simples `Unsupported media type "<value>".` |
| `media_browser` a definição não tem nenhum tipo de média utilizável | 400, texto simples `The "<setting>" settings is not supported.` |

### Validador de ligações de ajuda

|  |  |
|---|---|
| Caminho | `/dxpr_builder/ajax/help_link_validator` |
| Rota | `dxpr_builder.ajax_help_link_validator` |
| Métodos | Não declarado (qualquer método). O script de desenvolvimento `dxpr_builder_dev.js` envia POST com corpo codificado como formulário. |
| Requisitos | Utilizador faturável |
| Controlador | `AjaxController::validateHelpLink()` |

| Parâmetro | Origem | Obrigatório | Notas |
|---|---|---|---|
| `help_link` | POST body | Obrigatório para uma resposta útil | Apenas `http` ou `https` URLs no anfitrião `dxpr.com` com um caminho a começar por `/documentation/` são verificados. |

Resposta: um array JSON. `[true]` quando um pedido HEAD à ligação (sem seguir redirecionamentos) devolve 200; `[false]` quando o cliente HTTP dispara; `[]` em todos os outros casos, incluindo um parâmetro em falta, um URL não correspondente ou um estado diferente de 200.

### Sugestões de ligações de entidades

|  |  |
|---|---|
| Caminho | `/dxpr_builder/entity-link-suggestions` |
| Rota | `dxpr_builder.entity_link_suggestions` |
| Métodos | GET |
| Requisitos | `edit with dxpr builder`, token CSRF; `no_cache` opção de rota |
| Controlador | `EntityLinkSuggestionsController::suggestions()` |

| Parâmetro | Origem | Obrigatório | Notas |
|---|---|---|---|
| `q` | Query string | Obrigatório para resultados | Texto de pesquisa, em minúsculas. Um valor como `/node/123` carrega essa entidade diretamente. |
| `langcode` | Query string | Optional | Língua da entidade anfitriã; predefine-se a língua atual. Só são devolvidas entidades disponíveis nesta língua. |

Os pacotes são os com `ckeditor5_link_suggestions` ativado na sua informação de pacote; quando nenhum está configurado, pesquisam-se todos os pacotes de nós. Até 100 entidades por tipo de entidade são associadas com um `CONTAINS` pesquisa através dos plugins de seleção de referências de entidades do núcleo.

Resposta: `{"suggestions": [...]}` com possibilidade de cache privada e idade máxima de 300 segundos. Cada sugestão tem `description`, `entity_type_id`, `entity_uuid`, `group`, `label` e `path`. Quando `q` não corresponde a nada, o array contém uma única sugestão de ligação manual com `description`, `label` (a entrada em minúsculas) e `path` (a entrada quando é um URL válido, senão uma string vazia). Quando `q` está vazio, `suggestions` é um array vazio.

### Definições de editor do utilizador

|  |  |
|---|---|
| Caminho | `/dxpr_builder/user-settings` |
| Rota | `dxpr_builder.user_settings` |
| Métodos | POST |
| Requisitos | `edit with dxpr builder`, token CSRF; `no_cache` opção de rota |
| Controlador | `UserSettingsController::save()` |

O editor envia este pedido quando um utilizador muda as suas próprias definições de editor, por exemplo em **Definições do editor**. Os valores são guardados com a conta de utilizador em `user.data`, módulo `dxpr_builder`.

| Parâmetro | Origem | Obrigatório | Notas |
|---|---|---|---|
| `controls_layout` | Corpo JSON | Obrigatório (a única definição) | `element`, `breadcrumb` ou `default`. `default` remove a escolha do utilizador, para se aplicar o perfil ou a definição do site. |

Respostas:

| Caso | Estado | Corpo |
|---|---|---|
| Guardado | 200 | `{"settings": {"controls_layout": "<value>"}}`: todas as definições depois de guardar, `default` onde o utilizador não tem nenhuma escolha guardada. |
| O corpo não é um objeto JSON não vazio, ou um nome ou valor é inválido | 400 | `{"error": "Invalid setting or value."}`. Nada é guardado. |

## Operações do processador AJAX principal

Todas as operações vão para `/dxpr_builder/ajax` com o parâmetro de consulta de token obtido de `/dxpr_builder/csrf`. O nome da operação é enviado no campo do corpo POST `action`; todos os outros parâmetros são campos do corpo POST salvo indicação em contrário. A coluna "Re-checks billable" marca as operações que chamam `isBillableUser()` novamente dentro do switch. Quando essa verificação falha, devolvem a vazia `AjaxResponse` descrito acima, salvo se a linha disser o contrário.

### Sessão e acesso

| Operação | Parâmetros | Reverifica faturável | Devolve |
|---|---|---|---|
| `dxpr_login` | None | No | Booleano JSON: se o utilizador atual é faturável. |
| `dxpr_builder_csrf` | None | Yes | String JSON: o URL do processador com um `token` parâmetro de consulta (igual a `/dxpr_builder/csrf` sem o `enterprise` opção). |

### Contentores (campos apresentados com o formatador DXPR Builder)

| Operação | Parâmetros | Reverifica faturável | Devolve |
|---|---|---|---|
| `dxpr_get_container_types` | None | Yes | Objeto JSON indexado `entity_type\|bundle` com valor `entity_type - bundle`, uma entrada por pacote cuja apresentação de vista predefinida usa o `dxpr_builder_text` formatador em pelo menos um campo. |
| `dxpr_get_container_names` | `container_type` (obrigatório, `entity_type\|bundle`) | Sim (devolve uma string JSON vazia em vez da resposta vazia) | Objeto JSON indexado `entity_id\|field_name` (ou `entity_id\|field_name\|langcode` para entidades traduzíveis) com valor `entity label\|field label`. Quando `container_type` falta, ou a verificação de faturável falha, a resposta é uma string JSON vazia. |
| `dxpr_save_container` | `type` (obrigatório, `entity_type\|bundle`); `name` (obrigatório, `entity_id\|field_name` ou `entity_id\|revision_id\|field_name`); `htmlContent` (obrigatório, marcação codificada); `lang` (opcional, predefine-se a língua predefinida do site) | Yes | String JSON vazia em caso de sucesso. HTTP 400 com mensagem JSON quando `htmlContent` não é uma string ou a língua não se aplica a uma entidade não traduzível; 404 quando a tradução pedida não existe; 500 quando a entidade não pode ser carregada. |

`dxpr_save_container` faz o seguinte:

1. Descodifica `htmlContent`: XOR a cada byte com 7 e depois descodificação de URL.
2. Escreve o resultado no primeiro delta do campo indicado.
3. Cria uma nova revisão predefinida com a mensagem de registo `Saved with DXPR builder` quando o tipo de entidade permite revisões.
4. Remove qualquer bloqueio de conteúdo da entidade.
5. Atualizações `block_revision_id` em secções Layout Builder que referenciam o bloco em linha guardado.
6. Incrementa o `dxpr_builder.saves_count` valor de estado.

A gravação só acontece quando o utilizador tem `update` acesso à entidade. Sem ele, a operação continua a devolver a resposta de sucesso de string vazia.

### Elementos CMS (blocos e vistas)

| Operação | Parâmetros | Reverifica faturável | Devolve |
|---|---|---|---|
| `dxpr_builder_get_cms_element_names` | None | Yes | Objeto JSON de `DxprBuilderService::getCmsElementNames()` com chaves `list`, `disallowed` e `blockCategories`. |
| `dxpr_get_cms_element_settings` | `name` (obrigatório): `view-<view_id>-<display_id>` ou `block-<plugin_id>`; `ajax_page_state[libraries]` (opcional, bibliotecas separadas por vírgulas já carregadas) | Yes | Objeto JSON com `css`, `js`, `settings` e `data`. Para uma vista, `data` são os widgets de filtros expostos apresentados; para um bloco, `data` é o formulário de configuração do bloco envolvido em `<form>` etiquetas, com as `provider`, `admin_label`, `label`, `label_display` e `context_mapping` elementos removidos e todos os elementos details abertos. |
| `dxpr_builder_load_cms_element` | `name` (obrigatório, analisado por `parseStringForCmsElementInfo()`); `settings` (obrigatório); `data` (obrigatório, array); `ajax_page_state[libraries]` (opcional) | No | Objeto JSON com `css`, `js`, `settings` e `data`, onde `data` é o bloco ou apresentação de vista apresentado. |

Em ambos `settings`operações que devolvem, `css` e `js` são etiquetas de recursos apresentadas ainda não presentes na página, e `settings` é o descodificado `drupalSettings` objeto, ou uma string vazia quando não há nenhum.

### Modelos de página

| Operação | Parâmetros | Reverifica faturável | Devolve |
|---|---|---|---|
| `dxpr_get_page_templates` | None | Yes | Array JSON de modelos de página ativados, cada um com `title`, `uuid`, `module` (sempre `null`: a entidade não o guarda), `category`, `date`, `weight` (inteiro) e `image` (um `data:` URL, ou do `not-found.png` URL). |
| `dxpr_load_page_template` | `uuid` (obrigatório) | Yes | Resposta HTML com a marcação do modelo e tokens base substituídos; vazia quando nenhum modelo ativado corresponde. |

### Modelos de utilizador

| Operação | Parâmetros | Reverifica faturável | Devolve |
|---|---|---|---|
| `dxpr_get_templates` | None | Yes | Array JSON de modelos do utilizador atual ou marcados como globais; modelos cujo autor já não existe são excluídos. Cada entrada tem `id`, `uuid`, `name`, `global`, `current_user_is_author`, `author_id`, `author_name`, `type` e, quando guardado, `image` (um `data:` URL). |
| `dxpr_load_template` | `uuid` (obrigatório) | Yes | Resposta HTML com a marcação do modelo e tokens base substituídos; vazia quando nenhum modelo ativado corresponde. |
| `dxpr_save_template` | `name` (obrigatório); `template` (obrigatório, marcação); `type` (opcional, predefine-se `custom`); `global` (opcional, convertido para booleano); `image` (opcional: uma string base64 ou `data:image` URL no corpo POST, ou um campo de ficheiro multipart chamado `image`) | Yes | Objeto JSON com `message` e `code`. `code` 200 em caso de sucesso; `code` 409 (estado HTTP 200) quando existe um modelo com o mesmo nome de máquina; `code` 400 com HTTP 400 quando a imagem não são dados de imagem válidos. |
| `dxpr_delete_template` | `name` (obrigatório) | Yes | String JSON vazia. |

O nome de máquina deriva de `name` passando-o para minúsculas e substituindo cada sequência de carateres fora de `a-z0-9_` por um sublinhado. `type` recorre ao `data-azb` atributo na marcação quando um modelo guardado não tem tipo.

### Imagens

| Operação | Parâmetros | Reverifica faturável | Devolve |
|---|---|---|---|
| `dxpr_builder_get_image_urls` | `entityIDs` (obrigatório, array); `imageStyle` (obrigatório; `original` para o ficheiro sem estilo); `entityType` (obrigatório; `media` resolve itens de média; qualquer outro valor é usado como tipo de entidade dos IDs) | Yes | Corpo de texto: URLs de imagens separados por vírgulas. Os ficheiros dão um URL relativo à raiz com um `fid` parâmetro de consulta. Itens de média do `image` ou `video` tipo resolvem para o seu ficheiro de origem. `acquia_dam_image_asset` itens dão o URL DAM com `mid`, `acquiaDamAsset` e `imageStyle` adicionado. Os outros itens de média são saltados. HTTP 204 sem corpo quando `entityIDs` está vazio, ou quando nenhum item de média pode ser resolvido. |
| `dxpr_builder_get_image_style_url` | `imageStyle` (obrigatório); `entityId` (obrigatório); `entityTypeId` (obrigatório, `file` ou `media`) | Yes | Corpo de texto. Para um ficheiro: o seu URL relativo à raiz através do estilo de imagem (ficheiros SVG e `original` saltar o estilo), com um `fid` parâmetro de consulta. Para um `acquia_dam_image_asset` item de média: o URL DAM. HTTP 204 sem corpo para qualquer outra entidade, ou quando a entidade não é encontrada. |
| `dxpr_builder_get_image_metadata` | `entityId` (obrigatório); `entityType` (obrigatório, `file` ou `media`) | Sim (devolve 403 JSON em vez da resposta vazia) | `{"data": {"alt": "...", "title": "..."}}` do campo de origem de imagem do item de média (um recurso Acquia DAM dá o seu texto alternativo DAM e um título vazio). Para um ficheiro, os valores vêm do primeiro item de média cujo `field_media_image` o referencia. `data` é um array vazio quando a entidade não é um ficheiro nem um item de média, ou quando nenhuma média referencia o ficheiro. Erros: 400 `{"error": "Missing required parameters"}`, 404 `{"error": "Entity not found"}`, 500 `{"error": "Failed to load entity"}`, 403 `{"error": "Access denied"}`. |

### Bloqueios de conteúdo

| Operação | Parâmetros | Reverifica faturável | Devolve |
|---|---|---|---|
| `dxpr_content_lock_status` | `entity_id`, `revision_id`, `entity_type`, `langcode` (todos obrigatórios) | No | Objeto JSON com `status` (booleano) e `label` (rótulo de entidade); quando bloqueado, também `entity_lock_author_id` e `entity_lock_author_name`. |
| `dxpr_toggle_content_lock` | `entity_id`, `revision_id`, `entity_type`, `langcode`, `toggle_action` (todos obrigatórios; `lock` cria o bloqueio; qualquer outro valor remove-o) | No | Objeto JSON com `label` e `status` (`true` depois de bloquear, `false` depois de desbloquear). Um array JSON vazio (`[]`) quando a entidade não pode ser carregada ou o utilizador não tem `update` acesso. |

## Páginas de administração

Todas estas rotas aceitam qualquer método (sem `methods` chave). Caminhos que contêm `{...}` levam o ID da entidade de configuração, ou o ID de migração para `{migration_id}`.

| Caminho | Rota | Permissão | Objetivo |
|---|---|---|---|
| `/admin/dxpr_studio` | `dxpr_builder.admin.studio` | `administer dxpr builder configuration` | Vista geral do DXPR Studio; página de bloco de menu de administração do núcleo que lista páginas filhas. |
| `/admin/dxpr_studio/dxpr_builder` | `dxpr_builder.admin.studio.builder` | `administer dxpr builder configuration` | Vista geral do DXPR Builder; página de bloco de menu de administração do núcleo. |
| `/admin/dxpr_studio/dxpr_builder/settings` | `dxpr_builder.settings` | `administer dxpr builder configuration` | `DxprBuilderSettingsForm`: o formulário de definições do módulo. |
| `/admin/dxpr_studio/dxpr_builder/ai_settings` | `dxpr_builder.ai_settings` | `administer dxpr builder configuration` | `DxprBuilderAiSettingsForm`: o formulário de definições de IA. |
| `/admin/dxpr_studio/dxpr_builder/user_templates` | `entity.dxpr_builder_user_template.collection` | `administer site configuration` | Lista de `dxpr_builder_user_template` entidades de configuração. |
| `/admin/dxpr_studio/dxpr_builder/user_templates/add` | `entity.dxpr_builder_user_template.add_form` | `administer site configuration` | Adicionar um modelo de utilizador. |
| `/admin/dxpr_studio/dxpr_builder/user_templates/{dxpr_builder_user_template}` | `entity.dxpr_builder_user_template.edit_form` | `administer site configuration` | Editar um modelo de utilizador. |
| `/admin/dxpr_studio/dxpr_builder/user_templates/{dxpr_builder_user_template}/delete` | `entity.dxpr_builder_user_template.delete_form` | `administer site configuration` | Apagar um modelo de utilizador (formulário de confirmação). |
| `/admin/dxpr_studio/dxpr_builder/page_template` | `entity.dxpr_builder_page_template.collection` | `administer site configuration` | Lista de `dxpr_builder_page_template` entidades de configuração. |
| `/admin/dxpr_studio/dxpr_builder/page_template/add` | `entity.dxpr_builder_page_template.add_form` | `administer site configuration` | Adicionar um modelo de página. |
| `/admin/dxpr_studio/dxpr_builder/page_template/create` | `dxpr_builder.create_page_template` | `administer dxpr builder configuration` | `PageController::createPageTemplate()`: copia o modelo de utilizador ativado identificado pelo `uuid` parâmetro de consulta num modelo de página novo com o mesmo ID e categoria `DXPR`. Define uma mensagem de estado ou erro e redireciona para a lista de modelos de utilizador. |
| `/admin/dxpr_studio/dxpr_builder/page_template/{dxpr_builder_page_template}` | `entity.dxpr_builder_page_template.edit_form` | `administer site configuration` | Editar um modelo de página. |
| `/admin/dxpr_studio/dxpr_builder/page_template/{dxpr_builder_page_template}/delete` | `entity.dxpr_builder_page_template.delete_form` | `administer site configuration` | Apagar um modelo de página (formulário de confirmação). |
| `/admin/dxpr_studio/dxpr_builder/profile` | `entity.dxpr_builder_profile.collection` | `administer dxpr_builder_profile` | Lista de `dxpr_builder_profile` entidades de configuração. |
| `/admin/dxpr_studio/dxpr_builder/profile/add` | `entity.dxpr_builder_profile.add_form` | `administer dxpr_builder_profile` | Adicionar um perfil. |
| `/admin/dxpr_studio/dxpr_builder/profile/{dxpr_builder_profile}` | `entity.dxpr_builder_profile.edit_form` | `administer dxpr_builder_profile` | Editar um perfil. |
| `/admin/dxpr_studio/dxpr_builder/profile/{dxpr_builder_profile}/delete` | `entity.dxpr_builder_profile.delete_form` | `administer dxpr_builder_profile` | Apagar um perfil (formulário de confirmação). |
| `/admin/dxpr_studio/dxpr_builder/user_licenses` | `dxpr_builder.user_licenses` | `administer dxpr builder configuration` | `PageController::userLicensesPage()`: tabela sem cache de utilizadores licenciados (colunas User, Roles, Sites, Assigned e Operations). Por cima, a página apresenta o seu próprio cartão de resumo de licença (`dxpr-license-info`) quando há informação de licença disponível e, enquanto uma licença libertada aguarda os seus 30 dias, um aviso "Next license available on". Nesta rota, o **Informações de licença** bloco não apresenta nada, para o resumo nunca aparecer duas vezes. |
| `/admin/dxpr_studio/dxpr_builder/user_licenses/sites` | `dxpr_builder.user_licenses.sites` | `administer dxpr builder configuration` | `PageController::userLicensesSitesPage()`: lista de itens dos domínios registados para o utilizador indicado no `mail` parâmetro de pedido; aberto numa janela a partir da tabela de licenças. |
| `/admin/dxpr_studio/dxpr_builder/content` | `dxpr_builder.licensed_content` | `administer dxpr builder configuration` | `PageController::licensedContentPage()`: tabela paginada (20 por página) de conteúdos editados com o DXPR Builder, com o resumo de licença de conteúdos. O parâmetro de consulta `needs_migration=1` mostra apenas itens que precisam de uma migração de conteúdo. Vazio quando não há informação de licença disponível. |
| `/admin/dxpr_studio/dxpr_builder/migration-status` | `dxpr_builder.migration_status` | `administer dxpr builder configuration` | `MigrationStatusController::statusPage()`: tabela sem cache de migrações de conteúdo registadas com os seus itens pendentes. Cada migração pendente tem um **Correr agora** ligação, e uma **Correr todas as migrações pendentes** botão aparece quando há pendentes. |
| `/admin/dxpr_studio/dxpr_builder/migration-run/{migration_id}` | `dxpr_builder.migration_run_confirm` | `administer dxpr builder configuration` | `MigrationRunConfirmForm`: confirma e depois corre uma migração em lote e volta à página de estado. |
| `/admin/dxpr_studio/dxpr_builder/migration-run-all` | `dxpr_builder.migration_run_all_confirm` | `administer dxpr builder configuration` | `MigrationRunAllConfirmForm`: confirma e depois corre todas as migrações registadas num lote e volta à página de estado. |
| `/dxpr-builder/disavow-user` | `dxpr_builder.disavow_user_confirm` | `administer dxpr builder configuration` | `DisavowUserConfirmForm`: confirma a exclusão do utilizador indicado no `uid` parâmetro de consulta da edição do DXPR Builder. |
| `/dxpr-builder/delete-stale-user` | `dxpr_builder.delete_stale_user_confirm` | `administer dxpr builder configuration` | `DeleteStaleUserConfirmForm`: confirma a remoção dos dados de licença do endereço de e-mail indicado no `email` parâmetro de consulta. |

## E a seguir?

- [Referência de configuração](/pt-pt/hc/documentation/learn-dxpr-builder/reference/config-reference) para as definições que controlam o navegador de média e o comportamento de IA usados por estes pontos de extremidade.
- [API PHP](/hc/documentation/learn-dxpr-builder/development/api) para os serviços que os controladores chamam.
- [API de hooks](/hc/documentation/learn-dxpr-builder/development/hooks-api) para os hooks que permitem a outros módulos alterar o comportamento do construtor.