---
url: 'https://dxpr.com/pl/hc/documentation/learn-dxpr-builder/reference/api-endpoints'
title: 'Punkty końcowe API. | DXPR'
author:
  name: Jurriaan
  url: 'https://dxpr.com/users/jurriaan'
date: '2026-10-24T02:48:31+00:00'
updated: '2026-10-24T09:09:48+00:00'
copyright: 'Copyright DXPR. All rights reserved.'
type: article
summary: |-
  Ta strona wymienia każdą trasę (route) rejestrowaną przez DXPR
  Builder w dxpr_builder.routing.yml, z metodami HTTP, wymaganiami
  dostępu, parametrami żądań i kształtami odpowiedzi zaimplementowanymi
  w kontrolerach. JavaScript edytora jest zamierzonym klientem punktów
  końcowych AJAX; nic na tej stronie nie jest stabilnym publicznym API,
  a nazwy parametrów mogą zmieniać się między wydaniami.
  Wymagania dostępu
  Trasy używają trzech rodzajów wymagań. Trasa może je łączyć.
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: 'Punkty końcowe API.'
      description: |-
        Ta strona wymienia każdą trasę (route) rejestrowaną przez DXPR
        Builder w dxpr_builder.routing.yml, z metodami HTTP, wymaganiami
        dostępu, parametrami żądań i kształtami odpowiedzi zaimplementowanymi
        w kontrolerach. JavaScript edytora jest zamierzonym klientem punktów
        końcowych AJAX; nic na tej stronie nie jest stabilnym publicznym API,
        a nazwy parametrów mogą zmieniać się między wydaniami.
        Wymagania dostępu
        Trasy używają trzech rodzajów wymagań. Trasa może je łączyć.
      image:
        '@type': ImageObject
        url: 'https://dxpr.com/themes/custom/dxpr_com/images/dxpr-share-card.jpg'
        width: '1200'
        height: '630'
      datePublished: '2026-10-24T02:48:31+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/pl/hc/documentation/learn-dxpr-builder/reference/api-endpoints'
      articleSection: 'Configuratie en API'
    -
      '@type': WebPage
      '@id': 'https://dxpr.com/pl/hc/documentation/learn-dxpr-builder/reference/api-endpoints'
      description: |-
        Ta strona wymienia każdą trasę (route) rejestrowaną przez DXPR
        Builder w dxpr_builder.routing.yml, z metodami HTTP, wymaganiami
        dostępu, parametrami żądań i kształtami odpowiedzi zaimplementowanymi
        w kontrolerach. JavaScript edytora jest zamierzonym klientem punktów
        końcowych AJAX; nic na tej stronie nie jest stabilnym publicznym API,
        a nazwy parametrów mogą zmieniać się między wydaniami.
        Wymagania dostępu
        Trasy używają trzech rodzajów wymagań. Trasa może je łączyć.
      breadcrumb:
        '@type': BreadcrumbList
        itemListElement:
          -
            '@type': ListItem
            position: 1
            name: 'Strona Główna'
            item: 'https://dxpr.com/pl'
      publisher:
        '@type': Organization
        '@id': 'https://dxpr.com/#organization'
        name: DXPR
      inLanguage: pl
---
[Help Center](/pl/hc)/[Documentation](/pl/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) # Punkty końcowe API..

 Learn DXPR BuilderReferenceConfiguratie en API

   ## In this guide

 Related guides

- [Opis konfiguracji.](/pl/hc/documentation/learn-dxpr-builder/reference/config-reference)
- [Dokumentacja API](/pl/hc/documentation/learn-dxpr-builder/development/api)
- [Dokumentacja hooków API](/pl/hc/documentation/learn-dxpr-builder/development/hooks-api)

Ta strona wymienia każdą trasę (route) rejestrowaną przez DXPR Builder w `dxpr_builder.routing.yml`, z metodami HTTP, wymaganiami dostępu, parametrami żądań i kształtami odpowiedzi zaimplementowanymi w kontrolerach. JavaScript edytora jest zamierzonym klientem punktów końcowych AJAX; nic na tej stronie nie jest stabilnym publicznym API, a nazwy parametrów mogą zmieniać się między wydaniami.

## Wymagania dostępu

Trasy używają trzech rodzajów wymagań. Trasa może je łączyć.

| Wymaganie | Znaczenie |
|---|---|
| `_permission` | Użytkownik potrzebuje nazwanego uprawnienia Drupala. DXPR Builder definiuje `administer dxpr builder configuration`, `edit with dxpr builder` i `administer dxpr_builder_profile` w `dxpr_builder.permissions.yml`; `view media` i `administer site configuration` pochodzą z rdzenia. |
| `_csrf_token` | Żądanie musi nieść prawidłowy token CSRF w parametrze zapytania `token`. Dla głównego handlera AJAX edytor pobiera URL z tokenem spod `/dxpr_builder/csrf` (albo z operacji `dxpr_builder_csrf`). Dla pozostałych tras formatter pola umieszcza URLe z tokenem w `drupalSettings.dxprBuilder`, na przykład `fileUploadUrl`, `entityLinkSuggestionsUrl`, `userSettingsUrl` i `aiAgent.endpointUrl`. |
| `_dxpr_builder_billable_user` | Użytkownik musi być użytkownikiem rozliczanym (billable user), jak zdefiniowano poniżej. |

### Co znaczy „billable user”

`DxprBuilderBillableUserAccessCheck` pozwala na dostęp, gdy `DxprBuilderLicenseService::isBillableUser()` zwraca true dla bieżącego konta. Metoda zwraca false dla kont zablokowanych i dla kont z ustawionym polem `dxpr_user_is_disavowed`(administrator wyklucza użytkownika z edycji na stronie User Licenses). W przeciwnym razie zwraca true dla użytkownika 1 i dla każdego konta z uprawnieniem `edit with dxpr builder`. W skrócie: użytkownik rozliczany (billable user) to aktywne, niewykluczone konto, które może edytować za pomocą DXPR Builder, a usługa licencji liczy te konta względem twojego klucza produktu.

### Metody HTTP

Gdy trasa deklaruje `methods`, trasowane są tylko te metody. Gdy nie, trasa przyjmuje każdą metodę (`MethodFilter` Drupala filtruje tylko trasy deklarujące metody). Tabele poniżej podają metodę, której JavaScript edytora faktycznie używa, gdy widać to w źródle.

## Punkty końcowe AJAX edytora

### URL tokenu CSRF

|  |  |
|---|---|
| Ścieżka | `/dxpr_builder/csrf` |
| Trasa | `dxpr_builder.csrf_refresh` |
| Metody | Niezadeklarowane (dowolna metoda). Edytor wysyła GET (`backend-connect.js`, `fetchCsrfTokenUrl()`). |
| Wymagania | Użytkownik rozliczany (billable user) |
| Kontroler | `AjaxController::ajaxRefresh()` |

Żądanie musi nieść nagłówek `X-Requested-With: XMLHttpRequest`; bez niego kontroler zwraca HTTP 403 z treścią JSON `{"error": "Invalid request"}`.

| Parametr | Źródło | Wymagany | Uwagi |
|---|---|---|---|
| `enterprise` | Ciąg zapytania | Opcjonalny | Gdy ustawione na `true` i zainstalowany jest moduł `dxpr_builder_e`, token jest generowany dla trasy `dxpr_builder_e.ajax_callback`. Gdy ustawione na `true` bez tego modułu, kontroler rzuca wyjątek. |

Odpowiedź: ciąg JSON z URlem głównego handlera AJAX i parametrem zapytania `token`. URL jest ścieżką od korzenia witryny (ze ścieżką bazową, bez hosta). JavaScript wysyła POSTem każdą operację kreatora na ten URL.

### Główny handler AJAX

|  |  |
|---|---|
| Ścieżka | `/dxpr_builder/ajax` |
| Trasa | `dxpr_builder.ajax_callback` |
| Metody | Niezadeklarowane (dowolna metoda). Kontroler czyta każdy parametr z treści POST, a edytor wysyła POST. |
| Wymagania | Użytkownik rozliczany (billable user), token CSRF |
| Kontroler | `AjaxController::ajaxCallback()` |

Pole treści POST `action` wybiera operację. Każda operacja i jej parametry są wymienione w [operacjach głównego handlera AJAX](#main-ajax-handler-operations). Gdy `action` brakuje albo jest nieznane, kontroler zwraca pustą drupalową odpowiedź `AjaxResponse` bez poleceń. Większość operacji ponownie sprawdzających status użytkownika rozliczanego zwraca tę samą pustą odpowiedź, gdy sprawdzanie zawiedzie; tabele odnotowują dwa wyjątki.

### Czat AI

|  |  |
|---|---|
| Ścieżka | `/dxpr_builder/ajax/ai/chat` |
| Trasa | `dxpr_builder.ai_chat` |
| Metody | POST |
| Wymagania | `edit with dxpr builder`, użytkownik rozliczany (billable user), token CSRF |
| Kontroler | `AiChatController::chat()` |

Treść żądania to JSON. Kontroler pośredniczy w żądaniu do dostawcy `dxpr` drupalowego modułu `ai`, więc żaden klucz API nie trafia do przeglądarki. Przed wywołaniem scala domeny z ustawienia `ai_output_allowed_domains` do filtra nazw hostów modułu `ai`, gdy ta usługa istnieje. Wartość `*` ustawia filtr na pełne zaufanie. Filtr jest potem przywracany.

| Parametr | Źródło | Wymagany | Uwagi |
|---|---|---|---|
| `messages` | Treść JSON | Wymagany | Tablica obiektów z `role` i `content`. |
| `stream` | Treść JSON | Opcjonalny | Wartość logiczna, domyślnie `true`. |
| `model` | Treść JSON | Opcjonalny | Domyślnie `kavya-m1`. |
| `prediction` | Treść JSON | Opcjonalny | Przekazywane do konfiguracji dostawcy jako tablica. |
| `providers` | Treść JSON | Opcjonalny | Przekazywane do konfiguracji dostawcy. |
| `allowed_html_tags` | Treść JSON | Opcjonalny | Przekazywane do konfiguracji dostawcy. |
| `allowed_html_classes` | Treść JSON | Opcjonalny | Przekazywane do konfiguracji dostawcy. |
| `web_search` | Treść JSON | Opcjonalny | Przekazywana jest tylko wartość `false`; każda inna wartość jest ignorowana. |
| `response_format` | Treść JSON | Opcjonalny | Przekazywane do konfiguracji dostawcy jako tablica. |

Odpowiedzi:

| Przypadek | Status | Treść |
|---|---|---|
| Strumieniowana (`stream` true i dostawca strumieniuje) | 200, `Content-Type: text/event-stream` | Zdarzenia wysyłane przez serwer (server-sent events). Każde zdarzenie to `data: <JSON>`, gdzie JSON ma `choices[0].delta.content` oraz, gdy dostawca je podaje, `id`, `object`, `created`, `model`, `original_model` i `usage`. Strumień kończy się na `data: [DONE]`. |
| Niestrumieniowana | 200, `application/json` | `{"choices": [{"message": {"role": "assistant", "content": "<text>"}}]}` |
| Treść nie jest JSONem albo brakuje `messages` lub jest puste | 400, zwykły tekst | `Invalid request: messages required` |
| `model` nie ma na liście `allowed_models` w `ai_provider_dxpr.settings` (sprawdzane tylko, gdy moduł `ai_provider_dxpr` jest zainstalowany i lista jest ustawiona) | 403, `application/json` | `{"error": {"code": "model_not_allowed", "message": "The selected model is not allowed. Please refresh the page to update your model options."}}` |
| Wyjątek dostawcy | 500, `application/json` | `{"error": {"message": "The request could not be completed."}}` |

### Generowanie obrazów AI

|  |  |
|---|---|
| Ścieżka | `/dxpr_builder/ajax/ai/image` |
| Trasa | `dxpr_builder.ai_image` |
| Metody | POST |
| Wymagania | `edit with dxpr builder`, użytkownik rozliczany (billable user), token CSRF |
| Kontroler | `AiImageController::generate()` |

| Parametr | Źródło | Wymagany | Uwagi |
|---|---|---|---|
| `prompt` | Treść JSON | Wymagany | Prompt tekstowy. |
| `model` | Treść JSON | Opcjonalny | Domyślnie `kavya-image`. |
| `size` | Treść JSON | Opcjonalny | Przekazywane do konfiguracji dostawcy, gdy niepuste. |
| `quality` | Treść JSON | Opcjonalny | Przekazywane do konfiguracji dostawcy, gdy niepuste. |
| `background` | Treść JSON | Opcjonalny | Przekazywane do konfiguracji dostawcy, gdy niepuste. |

Odpowiedzi:

| Przypadek | Status | Treść |
|---|---|---|
| Pomyślnie | 200 | `{"data": [{"b64_json": "<base64 image>"}]}` (zwracany jest tylko pierwszy wygenerowany obraz) |
| Treść nie jest JSONem albo brakuje `prompt`. | 400 | `{"error": {"message": "Invalid request: prompt required"}}` |
| Dostawca nie zwrócił obrazu | 500 | `{"error": {"message": "No image was generated"}}` |
| Wyjątek dostawcy | 500 | `{"error": {"message": "Image generation failed. Please try again."}}` |

### Edycja obrazów AI

|  |  |
|---|---|
| Ścieżka | `/dxpr_builder/ajax/ai/image/edit` |
| Trasa | `dxpr_builder.ai_image_edit` |
| Metody | POST |
| Wymagania | `edit with dxpr builder`, użytkownik rozliczany (billable user), token CSRF |
| Kontroler | `AiImageController::edit()` |

| Parametr | Źródło | Wymagany | Uwagi |
|---|---|---|---|
| `prompt` | Treść JSON | Wymagany | Instrukcja edycji. |
| `image` | Treść JSON | Wymagany | Obraz źródłowy zakodowany w base64 (ścisłe dekodowanie). |
| `mimeType` | Treść JSON | Opcjonalny | Domyślnie `image/png`; podtyp staje się rozszerzeniem pliku przekazanym dostawcy. |
| `model` | Treść JSON | Opcjonalny | Domyślnie `kavya-image`. |
| `size`, `quality`, `background` | Treść JSON | Opcjonalny | Przekazywane do konfiguracji dostawcy, gdy niepuste. |

Odpowiedzi:

| Przypadek | Status | Treść |
|---|---|---|
| Pomyślnie | 200 | `{"data": [{"b64_json": "<base64 image>"}]}` |
| Treść nie jest JSONem albo brakuje `prompt` lub `image`. | 400 | `{"error": {"message": "Invalid request: prompt and image required"}}` |
| `image` nie jest prawidłowym base64 | 400 | `{"error": {"message": "Invalid image data: base64 decode failed"}}` |
| Dostawca nie zwrócił obrazu | 500 | `{"error": {"message": "No image was generated"}}` |
| Wyjątek dostawcy | 500 | `{"error": {"message": "Image editing failed. Please try again."}}` |

### Wysyłanie plików

|  |  |
|---|---|
| Ścieżka | `/dxpr_builder/ajax/file_upload` |
| Trasa | `dxpr_builder.ajax_file_upload_callback` |
| Metody | POST, DELETE (zadeklarowane w routingu; kontroler ma jeden handler wysyłania i nie ma osobnej gałęzi usuwania) |
| Wymagania | Użytkownik rozliczany (billable user), token CSRF |
| Kontroler | `UploadFileController::fileUpload()` |

| Parametr | Źródło | Wymagany | Uwagi |
|---|---|---|---|
| `upload` | Pliki formularza wieloczęściowego (multipart), wysyłane jako `upload[]` | Wymagany | Jeden lub więcej wysłanych plików. |

Kontroler sortuje każdy plik według pierwszej części jego klientowego typu MIME do `<default scheme>://dxpr_builder_images`, `dxpr_builder_videos` albo `dxpr_builder_files`. Obraz potrzebuje rozszerzenia z typów MIME `image/gif`, `jpg`, `jpeg`, `png`, `webp`, `avif` albo `svg`. Film potrzebuje jednego z `video/webm`, `ogv`, `ogg`, `mp4` albo `quicktime` (na przykład `.mov`). Limit rozmiaru to maksimum wysyłania PHP. Plik o tej samej nazwie i identycznej zawartości SHA-256 co istniejący zarządzany plik, który użytkownik może oglądać, jest używany ponownie zamiast zapisywania od nowa. Gdy moduł `media` jest zainstalowany i istnieje rodzaj multimediów o nazwie `image`, `media_image`, `video` albo `media_video`, dla pliku tworzony jest opublikowany byt multimedialny (albo używany ponownie). Użycie pliku jest rejestrowane w module `dxpr_builder`.

Odpowiedzi:

| Przypadek | Status | Treść |
|---|---|---|
| Pomyślnie | 201 | Tablica JSON, jeden obiekt na plik: `url` (bezwzględny URL pliku), `uuid` i `id` (bytu multimedialnego, gdy istnieje, inaczej pliku), `fid` (ID pliku), `entity_type` (`media` albo `file`). |
| Brak plików `upload`. | 400 | `{"message": "No files were uploaded."}` |
| Nieprawidłowe wysłanie, niezapisywalny cel albo błąd zapisu | 500 | `{"message": "<reason>"}` |
| Błąd walidacji (rozszerzenie albo rozmiar) | 422 | `{"message": "<violation messages>"}` |
| Nazwa pliku już zablokowana przez inne żądanie | 503 | `{"message": "File \"<name>\" is already locked for writing."}` |

### Okno biblioteki mediów

|  |  |
|---|---|
| Ścieżka | `/dxpr_builder/media-library` |
| Trasa | `dxpr_builder.media_library` |
| Metody | Niezadeklarowane (dowolna metoda). Parametry czytane są z ciągu zapytania. |
| Wymagania | `view media`; trasa administracyjna (admin route) |
| Kontroler | `AjaxController::openImageMediaLibrary()` |

| Parametr | Źródło | Wymagany | Uwagi |
|---|---|---|---|
| `media_type` | Ciąg zapytania | Opcjonalny | `image` (domyślnie) albo `video`. |
| `remaining_slots` | Ciąg zapytania | Opcjonalny | Liczba elementów akceptowanych przez otwierającego; domyślnie 1. |
| `uuid` | Ciąg zapytania | Opcjonalny | Przekazywane do otwierającego jako `opener_parameters.uuid`. |

Oferowany rodzaj multimediów zależy od ustawienia `media_browser`: `media_library` używa wprost rodzaju multimediów `image` albo `video`; `media_library_acquia_dam` używa `acquia_dam_image_asset` albo `acquia_dam_video_asset`, gdy ten rodzaj istnieje.

Odpowiedzi:

| Przypadek | Wynik |
|---|---|
| Pomyślnie | Tablica renderowana zbudowana przez `MediaLibraryUiBuilder::buildUi()` z otwierającym `media_library.opener.dxpr_builder`. Drupal renderuje ją jako stronę HTML przeznaczoną do iframe. |
| `media_library`: moduł niezainstalowany. | 403, zwykły tekst `Media Library is not enabled. Please enable it to access this feature.` |
| Nieobsługiwany `media_type` | 400, zwykły tekst `Unsupported media type "<value>".` |
| `media_browser`: ustawienie nie ma używalnego rodzaju multimediów. | 400, zwykły tekst `The "<setting>" settings is not supported.` |

### Walidator linków pomocy

|  |  |
|---|---|
| Ścieżka | `/dxpr_builder/ajax/help_link_validator` |
| Trasa | `dxpr_builder.ajax_help_link_validator` |
| Metody | Niezadeklarowane (dowolna metoda). Skrypt deweloperski `dxpr_builder_dev.js` wysyła POST z treścią zakodowaną jak formularz. |
| Wymagania | Użytkownik rozliczany (billable user) |
| Kontroler | `AjaxController::validateHelpLink()` |

| Parametr | Źródło | Wymagany | Uwagi |
|---|---|---|---|
| `help_link` | Treść POST | Wymagany dla sensownej odpowiedzi | Sprawdzane są tylko URLe `http` albo `https` na hoście `dxpr.com` ze ścieżką zaczynającą się od `/documentation/`. |

Odpowiedź: tablica JSON. `[true]`, gdy żądanie HEAD do linku (bez podążania za przekierowaniami) zwraca 200; `[false]`, gdy klient HTTP rzuca wyjątek; `[]` w każdym innym przypadku, łącznie z brakującym parametrem, niepasującym URlem albo statusem innym niż 200.

### Sugestie linków do bytów

|  |  |
|---|---|
| Ścieżka | `/dxpr_builder/entity-link-suggestions` |
| Trasa | `dxpr_builder.entity_link_suggestions` |
| Metody | GET |
| Wymagania | `edit with dxpr builder`, token CSRF; opcja trasy `no_cache`. |
| Kontroler | `EntityLinkSuggestionsController::suggestions()` |

| Parametr | Źródło | Wymagany | Uwagi |
|---|---|---|---|
| `q` | Ciąg zapytania | Wymagany dla wyników | Szukany tekst, małymi literami. Wartość w rodzaju `/node/123` wczytuje ten byt wprost. |
| `langcode` | Ciąg zapytania | Opcjonalny | Język bytu goszczącego; domyślnie bieżący język. Zwracane są tylko byty dostępne w tym języku. |

Rodzaje to te z włączonym `ckeditor5_link_suggestions` w informacji o rodzaju; gdy żaden nie jest skonfigurowany, przeszukiwane są wszystkie rodzaje węzłów. Do 100 bytów na rodzaj bytu jest dopasowywanych wyszukiwaniem `CONTAINS` przez wtyczki wyboru referencji do bytów z rdzenia.

Odpowiedź: `{"suggestions": [...]}` z prywatną cachowalnością i maksymalnym wiekiem 300 sekund. Każda sugestia ma `description`, `entity_type_id`, `entity_uuid`, `group`, `label` i `path`. Gdy `q` nic nie dopasowuje, tablica trzyma jedną sugestię linku ręcznego z `description`, `label` (wejście małymi literami) i `path` (wejście, gdy jest prawidłowym URlem, inaczej pusty ciąg). Gdy `q` jest puste, `suggestions` to pusta tablica.

### Ustawienia edytora użytkownika

|  |  |
|---|---|
| Ścieżka | `/dxpr_builder/user-settings` |
| Trasa | `dxpr_builder.user_settings` |
| Metody | POST |
| Wymagania | `edit with dxpr builder`, token CSRF; opcja trasy `no_cache`. |
| Kontroler | `UserSettingsController::save()` |

Edytor wysyła to żądanie, gdy użytkownik zmienia własne ustawienia edytora, na przykład w **Editor settings**. Wartości zapisywane są przy koncie użytkownika w `user.data`, moduł `dxpr_builder`.

| Parametr | Źródło | Wymagany | Uwagi |
|---|---|---|---|
| `controls_layout` | Treść JSON | Wymagany (jedyne ustawienie) | `element`, `breadcrumb` albo `default`. `default` usuwa wybór użytkownika, więc obowiązuje ustawienie profilu albo witryny. |

Odpowiedzi:

| Przypadek | Status | Treść |
|---|---|---|
| Zapisano | 200 | `{"settings": {"controls_layout": "<value>"}}`: każde ustawienie po zapisie, `default`, gdy użytkownik nie ma zapisanego wyboru. |
| Treść nie jest niepustym obiektem JSON albo nazwa lub wartość jest nieprawidłowa | 400 | `{"error": "Invalid setting or value."}`. Nic nie jest zapisywane. |

## Operacje głównego handlera AJAX

Wszystkie operacje idą pod `/dxpr_builder/ajax` z parametrem tokenu zapytań uzyskanym spod `/dxpr_builder/csrf`. Nazwa operacji jest wysyłana w polu treści POST `action`; wszystkie pozostałe parametry to pola treści POST, chyba że podano inaczej. Kolumna „Ponownie sprawdza rozliczalność” oznacza operacje, które wywołują `isBillableUser()`ponownie wewnątrz switcha. Gdy sprawdzanie zawiedzie, zwracają pustą odpowiedź `AjaxResponse` opisaną wyżej, chyba że wiersz mówi inaczej.

### Sesja i dostęp

| Operacja | Parametry | Ponownie sprawdza rozliczalność | Zwraca |
|---|---|---|---|
| `dxpr_login` | Brak | Nie | Wartość logiczna JSON: czy bieżący użytkownik jest rozliczany. |
| `dxpr_builder_csrf` | Brak | Tak | Ciąg JSON: URL handlera z parametrem zapytania `token` (tak samo jak `/dxpr_builder/csrf` bez opcji `enterprise`). |

### Kontenery (pola renderowane formatterem DXPR Builder)

| Operacja | Parametry | Ponownie sprawdza rozliczalność | Zwraca |
|---|---|---|---|
| `dxpr_get_container_types` | Brak | Tak | Obiekt JSON z kluczami `entity_type\|bundle` o wartościach `entity_type - bundle`, po jednym wpisie na rodzaj, którego domyślne wyświetlanie używa formattera `dxpr_builder_text` w co najmniej jednym polu. |
| `dxpr_get_container_names` | `container_type` (wymagany, `entity_type\|bundle`) | Tak (zwraca pusty ciąg JSON zamiast pustej odpowiedzi) | Obiekt JSON z kluczami `entity_id\|field_name` (albo `entity_id\|field_name\|langcode` dla bytów wielojęzycznych) o wartościach `entity label\|field label`. Gdy brakuje `container_type` albo sprawdzanie rozliczalności zawiedzie, odpowiedzią jest pusty ciąg JSON. |
| `dxpr_save_container` | `type` (wymagany, `entity_type\|bundle`); `name` (wymagany, `entity_id\|field_name` albo `entity_id\|revision_id\|field_name`); `htmlContent` (wymagany, zakodowany markup); `lang` (opcjonalny, domyślnie domyślny język witryny) | Tak | Pusty ciąg JSON przy pomyślnym zapisie. HTTP 400 z komunikatem JSON, gdy `htmlContent` nie jest ciągiem albo język nie pasuje do bytu nieprzetłumaczalnego; 404, gdy żądane tłumaczenie nie istnieje; 500, gdy bytu nie można wczytać. |

`dxpr_save_container` robi, co następuje:

1. Dekoduje `htmlContent`: XOR każdego bajtu z 7, potem dekodowanie URL.
2. Zapisuje wynik do pierwszej delty nazwanego pola.
3. Tworzy nową domyślną rewizję z komunikatem dziennika `Saved with DXPR builder`, gdy rodzaj bytu jest rewidowalny.
4. Usuwa blokadę treści bytu, jeśli istnieje.
5. Aktualizuje `block_revision_id` w sekcjach Konstruktora układu, które odwołują się do zapisanego bloku wstawianego.
6. Zwiększa wartość stanu `dxpr_builder.saves_count`.

Zapis następuje tylko, gdy użytkownik ma dostęp `update` do bytu. Bez niego operacja wciąż zwraca odpowiedź pomyślną z pustym ciągiem.

### Elementy CMS (bloki i widoki)

| Operacja | Parametry | Ponownie sprawdza rozliczalność | Zwraca |
|---|---|---|---|
| `dxpr_builder_get_cms_element_names` | Brak | Tak | Obiekt JSON z `DxprBuilderService::getCmsElementNames()` z kluczami `list`, `disallowed` i `blockCategories`. |
| `dxpr_get_cms_element_settings` | `name` (wymagany): `view-<view_id>-<display_id>` albo `block-<plugin_id>`; `ajax_page_state[libraries]` (opcjonalny, rozdzielone przecinkami już wczytane biblioteki) | Tak | Obiekt JSON z `css`, `js`, `settings` i `data`. Dla widoku `data` to wyrenderowane widżety odsłoniętych filtrów; dla bloku `data` to formularz konfiguracji bloku owinięty w tagi `<form>`, z usuniętymi elementami `provider`, `admin_label`, `label`, `label_display` i `context_mapping` oraz wszystkimi otwartymi elementami details. |
| `dxpr_builder_load_cms_element` | `name` (wymagany, parsowany przez `parseStringForCmsElementInfo()`); `settings` (wymagany); `data` (wymagany, tablica); `ajax_page_state[libraries]` (opcjonalny) | Nie | Obiekt JSON z `css`, `js`, `settings` i `data`, gdzie `data` to wyrenderowany blok albo wyświetlanie widoku. |

W obu operacjach zwracających `settings`, `css` i `js` to wyrenderowane tagi zasobów, których nie ma jeszcze na stronie, a `settings` to zdekodowany obiekt `drupalSettings` albo pusty ciąg, gdy ich nie ma.

### Szablony stron

| Operacja | Parametry | Ponownie sprawdza rozliczalność | Zwraca |
|---|---|---|---|
| `dxpr_get_page_templates` | Brak | Tak | Tablica JSON włączonych szablonów stron, każdy z `title`, `uuid`, `module` (zawsze `null`: byt go nie przechowuje), `category`, `date`, `weight` (liczba całkowita) i `image` (URL `data:` albo URL `not-found.png` modułu). |
| `dxpr_load_page_template` | `uuid` (wymagany) | Tak | Odpowiedź HTML z markupem szablonu po podmianie tokenów bazowych; pusta, gdy żaden włączony szablon nie pasuje. |

### Szablony użytkowników

| Operacja | Parametry | Ponownie sprawdza rozliczalność | Zwraca |
|---|---|---|---|
| `dxpr_get_templates` | Brak | Tak | Tablica JSON szablonów bieżącego użytkownika albo oznaczonych jako globalne; szablony, których konto autora już nie istnieje, są pomijane. Każdy wpis ma `id`, `uuid`, `name`, `global`, `current_user_is_author`, `author_id`, `author_name`, `type` oraz, gdy zapisany, `image` (URL `data:`). |
| `dxpr_load_template` | `uuid` (wymagany) | Tak | Odpowiedź HTML z markupem szablonu po podmianie tokenów bazowych; pusta, gdy żaden włączony szablon nie pasuje. |
| `dxpr_save_template` | `name` (wymagany); `template` (wymagany, markup); `type` (opcjonalny, domyślnie `custom`); `global` (opcjonalny, rzutowany na wartość logiczną); `image` (opcjonalny: ciąg base64 albo URL `data:image` w treści POST albo wieloczęściowe pole pliku o nazwie `image`) | Tak | Obiekt JSON z `message` i `code`. `code` 200 przy pomyślnym zapisie; `code` 409 (status HTTP 200), gdy istnieje szablon o tej samej nazwie maszynowej; `code` 400 ze statusem HTTP 400, gdy obraz nie jest prawidłowym danymi obrazu. |
| `dxpr_delete_template` | `name` (wymagany) | Tak | Pusty ciąg JSON. |

Nazwa maszynowa powstaje z `name` przez małe litery i zamianę każdego ciągu znaków spoza `a-z0-9_` na podkreślenie. `type`sięga do atrybutu `data-azb` w markupu, gdy zapisany szablon nie ma typu.

### Obrazy

| Operacja | Parametry | Ponownie sprawdza rozliczalność | Zwraca |
|---|---|---|---|
| `dxpr_builder_get_image_urls` | `entityIDs` (wymagany, tablica); `imageStyle` (wymagany; `original` dla pliku bez stylu); `entityType` (wymagany; `media` rozwiązuje elementy multimedialne, każda inna wartość używana jest jako rodzaj bytu dla ID) | Tak | Treść tekstowa: rozdzielone przecinkami URLe obrazów. Pliki dają URL względny od korzenia z parametrem zapytania `fid`. Elementy multimedialne rodzaju `image` albo `video` rozwiązują się do pliku źródłowego. Elementy `acquia_dam_image_asset` dają URL DAM z dodanymi `mid`, `acquiaDamAsset` i `imageStyle`. Pozostałe elementy multimedialne są pomijane. HTTP 204 bez treści, gdy `entityIDs` jest puste albo gdy żaden element multimedialny nie daje się rozwiązać. |
| `dxpr_builder_get_image_style_url` | `imageStyle` (wymagany); `entityId` (wymagany); `entityTypeId` (wymagany, `file` albo `media`) | Tak | Treść tekstowa. Dla pliku: jego URL względny od korzenia przez styl obrazu (pliki SVG i `original` pomijają styl), z parametrem zapytania `fid`. Dla elementu multimedialnego `acquia_dam_image_asset`: URL DAM. HTTP 204 bez treści dla każdego innego bytu albo gdy bytu nie znaleziono. |
| `dxpr_builder_get_image_metadata` | `entityId` (wymagany); `entityType` (wymagany, `file` albo `media`) | Tak (zwraca JSON 403 zamiast pustej odpowiedzi) | `{"data": {"alt": "...", "title": "..."}}` z pola źródła obrazu elementu multimedialnego (zasób Acquia DAM daje swój tekst alt z DAM i pusty tytuł). Dla pliku wartości pochodzą z pierwszego elementu multimedialnego, którego `field_media_image` odwołuje się do niego. `data` to pusta tablica, gdy byt nie jest plikiem ani elementem multimedialnym albo gdy żadne multimedia nie odwołują się do pliku. Błędy: 400 `{"error": "Missing required parameters"}`, 404 `{"error": "Entity not found"}`, 500 `{"error": "Failed to load entity"}`, 403 `{"error": "Access denied"}`. |

### Blokady treści

| Operacja | Parametry | Ponownie sprawdza rozliczalność | Zwraca |
|---|---|---|---|
| `dxpr_content_lock_status` | `entity_id`, `revision_id`, `entity_type`, `langcode` (wszystkie wymagane) | Nie | Obiekt JSON z `status` (wartość logiczna) i `label` (etykieta bytu); gdy zablokowane, także `entity_lock_author_id` i `entity_lock_author_name`. |
| `dxpr_toggle_content_lock` | `entity_id`, `revision_id`, `entity_type`, `langcode`, `toggle_action` (wszystkie wymagane; `lock` tworzy blokadę, każda inna wartość ją usuwa) | Nie | Obiekt JSON z `label` i `status` (`true` po zablokowaniu, `false` po odblokowaniu). Pusta tablica JSON (`[]`), gdy bytu nie można wczytać albo użytkownik nie ma dostępu `update`. |

## Strony administracyjne

Wszystkie te trasy przyjmują każdą metodę (bez klucza `methods`). Ścieżki z `{...}` przyjmują ID bytu konfiguracji albo, dla `{migration_id}`, ID migracji.

| Ścieżka | Trasa | Uprawnienie | Cel |
|---|---|---|---|
| `/admin/dxpr_studio` | `dxpr_builder.admin.studio` | `administer dxpr builder configuration` | Przegląd DXPR Studio; strona bloku menu administracji z rdzenia, wymieniająca strony podrzędne. |
| `/admin/dxpr_studio/dxpr_builder` | `dxpr_builder.admin.studio.builder` | `administer dxpr builder configuration` | Przegląd DXPR Builder; strona bloku menu administracji z rdzenia. |
| `/admin/dxpr_studio/dxpr_builder/settings` | `dxpr_builder.settings` | `administer dxpr builder configuration` | `DxprBuilderSettingsForm`: formularz ustawień modułu. |
| `/admin/dxpr_studio/dxpr_builder/ai_settings` | `dxpr_builder.ai_settings` | `administer dxpr builder configuration` | `DxprBuilderAiSettingsForm`: formularz ustawień AI. |
| `/admin/dxpr_studio/dxpr_builder/user_templates` | `entity.dxpr_builder_user_template.collection` | `administer site configuration` | Lista bytów konfiguracji `dxpr_builder_user_template`. |
| `/admin/dxpr_studio/dxpr_builder/user_templates/add` | `entity.dxpr_builder_user_template.add_form` | `administer site configuration` | Dodawanie szablonu użytkownika. |
| `/admin/dxpr_studio/dxpr_builder/user_templates/{dxpr_builder_user_template}` | `entity.dxpr_builder_user_template.edit_form` | `administer site configuration` | Edycja szablonu użytkownika. |
| `/admin/dxpr_studio/dxpr_builder/user_templates/{dxpr_builder_user_template}/delete` | `entity.dxpr_builder_user_template.delete_form` | `administer site configuration` | Usuwanie szablonu użytkownika (formularz potwierdzenia). |
| `/admin/dxpr_studio/dxpr_builder/page_template` | `entity.dxpr_builder_page_template.collection` | `administer site configuration` | Lista bytów konfiguracji `dxpr_builder_page_template`. |
| `/admin/dxpr_studio/dxpr_builder/page_template/add` | `entity.dxpr_builder_page_template.add_form` | `administer site configuration` | Dodawanie szablonu strony. |
| `/admin/dxpr_studio/dxpr_builder/page_template/create` | `dxpr_builder.create_page_template` | `administer dxpr builder configuration` | `PageController::createPageTemplate()`: kopiuje włączony szablon użytkownika wskazany parametrem zapytania `uuid` do nowego szablonu strony o tym samym ID i kategorii `DXPR`. Ustawia komunikat o statusie albo błędzie i przekierowuje do listy szablonów użytkownika. |
| `/admin/dxpr_studio/dxpr_builder/page_template/{dxpr_builder_page_template}` | `entity.dxpr_builder_page_template.edit_form` | `administer site configuration` | Edycja szablonu strony. |
| `/admin/dxpr_studio/dxpr_builder/page_template/{dxpr_builder_page_template}/delete` | `entity.dxpr_builder_page_template.delete_form` | `administer site configuration` | Usuwanie szablonu strony (formularz potwierdzenia). |
| `/admin/dxpr_studio/dxpr_builder/profile` | `entity.dxpr_builder_profile.collection` | `administer dxpr_builder_profile` | Lista bytów konfiguracji `dxpr_builder_profile`. |
| `/admin/dxpr_studio/dxpr_builder/profile/add` | `entity.dxpr_builder_profile.add_form` | `administer dxpr_builder_profile` | Dodawanie profilu. |
| `/admin/dxpr_studio/dxpr_builder/profile/{dxpr_builder_profile}` | `entity.dxpr_builder_profile.edit_form` | `administer dxpr_builder_profile` | Edycja profilu. |
| `/admin/dxpr_studio/dxpr_builder/profile/{dxpr_builder_profile}/delete` | `entity.dxpr_builder_profile.delete_form` | `administer dxpr_builder_profile` | Usuwanie profilu (formularz potwierdzenia). |
| `/admin/dxpr_studio/dxpr_builder/user_licenses` | `dxpr_builder.user_licenses` | `administer dxpr builder configuration` | `PageController::userLicensesPage()`: niecachowana tabela licencjonowanych użytkowników (kolumny User, Roles, Sites, Assigned i Operations). Nad nią strona renderuje własną kartę podsumowania licencji (`dxpr-license-info`), gdy informacje o licencji są dostępne, oraz, gdy zwolniona licencja odczeka swoje 30 dni, powiadomienie „Next license available on”. Na tej trasie blok **License info** nie renderuje niczego, więc podsumowanie nigdy nie pokazuje się dwa razy. |
| `/admin/dxpr_studio/dxpr_builder/user_licenses/sites` | `dxpr_builder.user_licenses.sites` | `administer dxpr builder configuration` | `PageController::userLicensesSitesPage()`: lista domen zapisanych dla użytkownika podanego w parametrze żądania `mail`; otwierana w oknie modalnym z tabeli licencji. |
| `/admin/dxpr_studio/dxpr_builder/content` | `dxpr_builder.licensed_content` | `administer dxpr builder configuration` | `PageController::licensedContentPage()`: stronicowana tabela (20 na stronę) elementów treści edytowanych za pomocą DXPR Builder, z podsumowaniem licencji elementów treści. Parametr zapytania `needs_migration=1` pokazuje tylko elementy wymagające migracji treści. Pusta, gdy brak informacji o licencji. |
| `/admin/dxpr_studio/dxpr_builder/migration-status` | `dxpr_builder.migration_status` | `administer dxpr builder configuration` | `MigrationStatusController::statusPage()`: niecachowana tabela zarejestrowanych migracji treści z ich oczekującymi elementami. Każda oczekująca migracja ma link **Run now**, a przycisk **Run all pending migrations** pojawia się, gdy jakieś oczekują. |
| `/admin/dxpr_studio/dxpr_builder/migration-run/{migration_id}` | `dxpr_builder.migration_run_confirm` | `administer dxpr builder configuration` | `MigrationRunConfirmForm`: potwierdza, potem uruchamia jedną migrację jako proces wsadowy (batch) i wraca na stronę statusu. |
| `/admin/dxpr_studio/dxpr_builder/migration-run-all` | `dxpr_builder.migration_run_all_confirm` | `administer dxpr builder configuration` | `MigrationRunAllConfirmForm`: potwierdza, potem uruchamia każdą zarejestrowaną migrację jako jeden proces wsadowy i wraca na stronę statusu. |
| `/dxpr-builder/disavow-user` | `dxpr_builder.disavow_user_confirm` | `administer dxpr builder configuration` | `DisavowUserConfirmForm`: potwierdza wykluczenie użytkownika podanego w parametrze zapytania `uid` z edycji w DXPR Builder. |
| `/dxpr-builder/delete-stale-user` | `dxpr_builder.delete_stale_user_confirm` | `administer dxpr builder configuration` | `DeleteStaleUserConfirmForm`: potwierdza usunięcie danych licencji dla adresu e-mail podanego w parametrze zapytania `email`. |

## Co dalej?

- [Opis konfiguracji](/pl/hc/documentation/learn-dxpr-builder/reference/config-reference) dla ustawień sterujących przeglądarką mediów i zachowaniem AI używanymi przez te punkty końcowe.
- [PHP API](/hc/documentation/learn-dxpr-builder/development/api) dla usług, które wywołują kontrolery.
- [Hooks API](/hc/documentation/learn-dxpr-builder/development/hooks-api) dla hooków pozwalających innym modułom zmieniać zachowanie kreatora.