---
url: 'https://dxpr.com/hc/documentation/learn-dxpr-builder/reference/config-reference'
title: 'Configuration reference | DXPR'
author:
  name: docs-sync
  url: 'https://dxpr.com/users/docs-sync'
date: '2026-10-23T14:31:17+00:00'
copyright: 'Copyright DXPR. All rights reserved.'
type: article
summary: 'Every key in `dxpr_builder.settings` with its default and allowed values'
tags:
  - 'Configuration and API'
image: 'https://dxpr.com/themes/custom/dxpr_com/images/dxpr-share-card.jpg'
published: true
og:
  site_name: DXPR
  updated_time: '2026-10-23T14:31:17+0000'
  'image:alt': 'DXPR, powered by Drupal: AI-powered Drupal for marketers.'
schema:
  '@context': 'https://schema.org'
  '@graph':
    -
      mainEntity: {  }
    -
      '@type': TechArticle
      headline: 'Configuration reference'
      description: 'Every key in `dxpr_builder.settings` with its default and allowed values'
      image:
        '@type': ImageObject
        url: 'https://dxpr.com/themes/custom/dxpr_com/images/dxpr-share-card.jpg'
        width: '1200'
        height: '630'
      datePublished: '2026-10-23T14:31:17+0000'
      dateModified: '2026-10-23T14:31:17+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/hc/documentation/learn-dxpr-builder/reference/config-reference'
      articleSection: 'Configuration and API'
    -
      '@type': WebPage
      '@id': 'https://dxpr.com/hc/documentation/learn-dxpr-builder/reference/config-reference'
      description: 'Every key in `dxpr_builder.settings` with its default and allowed values'
      breadcrumb:
        '@type': BreadcrumbList
        itemListElement:
          -
            '@type': ListItem
            position: 1
            name: Home
            item: 'https://dxpr.com/'
      publisher:
        '@type': Organization
        '@id': 'https://dxpr.com/#organization'
        name: DXPR
      inLanguage: en
---
[Help Center](/hc)/[Documentation](/hc/documentation) /[Learn DXPR Builder](/hc/documentation/learn-dxpr-builder) /[Reference](/hc/documentation/learn-dxpr-builder/reference) /[Configuration and API](/hc/documentation/learn-dxpr-builder/reference/config-and-api) # Configuration reference.

Every key in &#96;dxpr\_builder.settings&#96; with its default and allowed values

 Learn DXPR BuilderReferenceConfiguration and API

   ## In this guide

 Related guides

- [General settings](/hc/documentation/learn-dxpr-builder/admin/general-settings)
- [Firewall and data residency](/hc/documentation/learn-dxpr-builder/getting-started/behind-a-firewall)
- [API endpoints](/hc/documentation/learn-dxpr-builder/reference/api-endpoints)

DXPR Builder stores its configuration in Drupal's configuration system. This page lists every key declared in `config/schema/dxpr_builder.schema.yml`with its type, allowed values and default. It also lists the `status` key of each configuration entity and the settings keys that code reads without a schema entry. Bold names are the form labels.

The module ships no `config/install/dxpr_builder.settings.yml`. Defaults are set by `hook_install()` and update hooks in `dxpr_builder.install`, or applied in code when a key is missing; the **Default** column states which.

## General settings

Configuration object: `dxpr_builder.settings`

Admin path: `/admin/dxpr_studio/dxpr_builder/settings`(`src/Form/DxprBuilderSettingsForm.php`)

| Key | Type | Allowed values | Default | Description |
|---|---|---|---|---|
| `json_web_token` | string | A DXPR product key (JWT) | empty | **Product key**, only when `api_key_storage` is `config`. Cleared when the key is stored in the Key module; update 9026 clears a value left behind there. |
| `api_key_storage` | string | `config` (**Configuration storage**), `key` (**Key module**) | not set (treated as `config`); `key` after `dxpr_builder_update_9020()` moves an existing key | **Storage method** for the product key. |
| `key_provider` | string | A Key entity id | empty; update 9020 sets `dxpr_builder_jwt` when it moves an existing key | **Key** entity holding the product key when `api_key_storage` is `key`. |
| `bootstrap` | string | `0`, `bs5` | not set (no Bootstrap files loaded) | **Sideload Bootstrap files**: `0` = **None (theme provides Bootstrap)**, `bs5` = **Bootstrap 5**. Update 8040 rewrites the removed `1` and `bs4` values to `bs5`. |
| `cke_stylesset` | string | One `[label]=[element].[class]` entry per line | empty (the editor then uses the styles shipped with DXPR Builder) | **Custom styles** for the text editor, for example `Sassy Title=h1.sassy-title`. |
| `editor_assets_source` | integer | `0`, `1`, `2` | not set (`0`) | **Asset source**: `0` = **Cloud**, `1` = **Local (minified)**, `2` = **Local (unminified)**. The field only appears when a local build exists in the module's `dxpr_builder/` folder. With `0` stored, such a build is still used, the unminified one first. |
| `format_filters` | boolean | `true`, `false` | not set (off) | **Apply text format filters to frontend content**. |
| `media_browser` | string | `''` (**Basic file upload**), `media_library` (**Media Library**), `media_library_acquia_dam` (**Media Library (Acquia DAM)**), or an Entity Browser id | `media_library` when the Media Library module is installed, else `dxpr_builder_media_modal` when `dxpr_builder_media` is installed, else `''` (set by `hook_install()`) | **Browser type** used by image fields. |
| `offset_selector` | string | A CSS selector | `.dxpr-theme-header--sticky, .dxpr-theme-header--fixed` (applied when empty) | **Scroll offset selector** for fixed headers. |
| `controls_layout` | string | `element` (**On each element**), `breadcrumb` (**One row**) | `element` (applied when empty) | **Control bars** in edit mode: a bar on each element, or one row above the element you point at. A profile and a user's own setting override it. The user's setting is not configuration: it is stored with the user account (`user.data`, module `dxpr_builder`, name `controls_layout`). |

### AI settings

Stored in the same `dxpr_builder.settings` object.

Admin path: `/admin/dxpr_studio/dxpr_builder/ai_settings`(`src/Form/DxprBuilderAiSettingsForm.php`)

| Key | Type | Allowed values | Default | Description |
|---|---|---|---|---|
| `ai_enabled` | boolean | `true`, `false` | `true` when missing; set by update 9008 | **Enable text editing assistant**. |
| `ai_page_enabled` | boolean | `true`, `false` | `true` when missing; set by update 9012 | **Enable page creation assistant**. |
| `ai_image_enabled` | boolean | `true`, `false` | `true` when missing; set by update 9015 | **Enable image generation**. |
| `ai_user_model_selection` | boolean | `true`, `false` | `true` when missing; set by update 9016 | **Allow users to choose model**. Only shown when `ai_provider_dxpr` is not installed. |
| `ai_model` | string | `dxai_kavya_m1`, `dxai_kavya_m1_eu`, `dxai_kavya_m1_fast` | `dxai_kavya_m1` (`AiModelConstants::getDefaultModel()`) | **Default model**. The API names are `kavya-m1`, `kavya-m1-eu` and `kavya-m1-fast`. Only shown and saved when `ai_provider_dxpr` is not installed. |
| `ai_provider_selection_mode` | string | `automatic` (**Automatic**), `manual` (**Manual priority**) | `automatic` | **Service providers** mode. `manual` uses the order in `ai_providers`. Only saved when `ai_provider_dxpr` is not installed. |
| `ai_providers` | sequence of mappings keyed by provider id | Keys: `anthropic`, `gemini`, `mistral`, `openai`, `xai`. Each has `enabled` (boolean), `weight` (integer) and `region` (`enabled` or `disabled`) | empty (the form then lists all five as enabled) | Provider priority table for the `manual` mode. `region` is the table section the row sits in, not a geographic region. |
| `tone_of_voice_vocabulary` | string | A taxonomy vocabulary id | `ai_tone_of_voice` (vocabulary created by `hook_install()` when Taxonomy is enabled, and by update 9007) | **Tone of voice vocabulary**. Update 9025 points the value back to `ai_tone_of_voice` when the stored vocabulary no longer exists. |
| `enable_taxonomy_tones` | boolean | `true`, `false` | `true` once a tone vocabulary is set | Set to `true` with the vocabulary, by `hook_install()`, the updates or the form. No form field, and no code reads it. |
| `commands_vocabulary` | string | A taxonomy vocabulary id | `ai_agent_commands` (created by `hook_install()` when Taxonomy is enabled, and by update 9007, only when the key is empty) | **Commands vocabulary**. |
| `enable_taxonomy_commands` | boolean | `true`, `false` | `true` once a commands vocabulary is set | Set to `true` with the vocabulary, by `hook_install()`, update 9007 or the form. No form field, and no code reads it. |
| `ai_output_allowed_domains` | text | Domains one per line (wildcards such as `*.wikipedia.org` allowed); `*` allows all; empty blocks all external URLs | `unsplash.com`, `images.unsplash.com`, `pexels.com`, `images.pexels.com`, `pixabay.com`, `promptahuman.com` (set by `hook_install()` and update 9013) | **Allowed domains**. Unchecking **Filter AI output** on the form stores `*`. |
| `ai_output_allowed_tags` | text | HTML tag names one per line | A list of common text, list, table, inline, media and form tags (`div` to `rp`) applied in the form when the key is missing | **Allowed HTML tags**; unlisted tags lose their markup but keep their text. |
| `ai_output_stripped_tags` | text | HTML tag names one per line | `script`, `style` | **Blocked tags**, removed with their contents. Unchecking **Filter AI output** stores the default `script` and `style`. |

### Keys read by code without a form field

These keys are not in the schema but the module reads them from `dxpr_builder.settings`. Set them with `drush config:set` or a configuration override in `settings.php`.

| Key | Type | Default when missing | Description |
|---|---|---|---|
| `record_analytics` | boolean | `true` | Sends editor usage analytics to `tuur.dxpr.com` when true. |
| `notifications` | boolean | `true` | Shows DXPR notifications in the editor when true. |
| `cloud_url` | string | `https://cdn2.dxpr.com/VERSION/` | CDN base URL for editor assets; `VERSION` is replaced with the module version. |
| `license_endpoint` | string | `https://dxpr.com/api/central-user-storage/` | Endpoint for licensed user synchronisation. |

## Page templates

Configuration objects: `dxpr_builder.page_template.*`(entity type `dxpr_builder_page_template`)

Admin path: `/admin/dxpr_studio/dxpr_builder/page_template`

| Key | Type | Allowed values | Default | Description |
|---|---|---|---|---|
| `id` | string | Machine name | required | Identifier. |
| `label` | label | Any text | required | **Label**: name shown in the template chooser. |
| `status` | boolean | `true`, `false` | `true` | **Enabled**. The editor only offers and loads enabled templates. |
| `category` | text | Any text | empty (the form requires it) | **Category** the template is grouped under. |
| `template` | string | DXPR Builder HTML | empty (the form requires it) | **Template** markup. |
| `weight` | integer | Any integer | empty (the editor reads it as `0`) | **Weight**: sort order. |
| `date` | integer | Unix timestamp | set by the edit form on every save | Last modified time. |
| `image` | string | Base64-encoded image contents | empty | **Image**: thumbnail. |
| `uuid` | string | UUID | generated | Universally unique id. |

The module ships five page templates in `config/install`: `about_me`, `about_us`, `homepage_basic`, `split_content_and_buttons` and `text_columns`.

## User profiles

Configuration objects: `dxpr_builder.dxpr_builder_profile.*`(entity type `dxpr_builder_profile`)

Admin path: `/admin/dxpr_studio/dxpr_builder/profile`

On a new profile the form ticks every element, block, view display, enabled page template, enabled global user template and icon set, plus a default set of text editor buttons. The defaults below are the entity's own values.

| Key | Type | Allowed values | Default | Description |
|---|---|---|---|---|
| `id` | string | Machine name | required | Identifier. |
| `label` | label | Any text | required | **Label**: profile name. |
| `uuid` | string | UUID | generated | Universally unique id. |
| `status` | boolean | `true`, `false` | `true` | **User profile enabled**. Disabled profiles are skipped when a user's roles are matched. |
| `sidebar` | boolean | `true`, `false` | not stored | Legacy key: declared in the schema but not exported by the entity, so it is never saved. |
| `dxpr_editor` | boolean | `true`, `false` | `true`; update 8008 set it on existing profiles | **Start editor when page loads**. When `false`, the controls only appear after the user clicks the eye icon on the main container controls. |
| `controls_layout` | string | `default` (**Same as the site**), `element` (**On each element**), `breadcrumb` (**One row**) | `default` | **Control bars** in edit mode for this profile. A user's own setting overrides it. |
| `weight` | integer | `-10` to `10` in the form | `0` | **Weight**: when a user's roles match several enabled profiles, the lowest weight wins. |
| `roles` | sequence of strings | Role machine names (the form leaves out `anonymous` and `authenticated`) | empty | **Roles** the profile applies to. |
| `elements` | sequence of strings | Element machine names (`az_text`, `az_image`, ...) | empty | Allowed **Elements**. |
| `all_elements` | boolean | `true`, `false` | `false` | **Check/Uncheck all Elements**. When `true`, every element is allowed and `elements` is ignored. |
| `blocks` | sequence of strings | `az_block-<block plugin id>` values | empty | Allowed **Blocks**. |
| `all_blocks` | boolean | `true`, `false` | `false` | **Check/Uncheck all Blocks**. When `true`, every block is allowed, including ones added later. |
| `views` | sequence of strings | `az_view-<view id>-<display id>` values | empty | Allowed **Views** displays. |
| `all_views` | boolean | `true`, `false` | `false` | **Check/Uncheck all Views**. When `true`, every views display is allowed, including ones added later. |
| `page_templates` | sequence of strings | Page template UUIDs | empty | Allowed **Page templates**. |
| `all_page_templates` | boolean | `true`, `false` | `false` | **Check/Uncheck all Page templates**. When `true`, every page template is allowed. |
| `user_templates` | sequence of strings | Global user template UUIDs | empty | Allowed **Global user templates**. |
| `all_user_templates` | boolean | `true`, `false` | `false` | **Check/Uncheck all Global user templates**. When `true`, every global user template is allowed. |
| `icon_sets` | sequence of strings | Icon set ids from `*.dxpr_icon_sets.yml` files | empty | Allowed **Icon sets**. |
| `all_icon_sets` | boolean | `true`, `false` | not set (counts as `true`) | **Check/Uncheck all Icon sets**. When `true` or missing, every icon set is allowed. |
| `inline_buttons` | sequence of strings | CKEditor 5 button names | empty | **Text editor buttons (inline editing)**. Update 8036 migrated CKEditor 4 names in this list and in `modal_buttons`. |
| `modal_buttons` | sequence of strings | CKEditor 5 button names | empty | **Text editor buttons (modal editing)**. |

## User templates

Configuration objects: `dxpr_builder.user_template.*`(entity type `dxpr_builder_user_template`)

Admin path: `/admin/dxpr_studio/dxpr_builder/user_templates`

| Key | Type | Allowed values | Default | Description |
|---|---|---|---|---|
| `id` | string | Machine name | required | Identifier. |
| `label` | label | Any text | required | **Label**: template name. |
| `status` | boolean | `true`, `false` | `true` | No form field. Only enabled templates can be loaded in the editor or copied into a page template. |
| `type` | string | The `data-azb` element type the template was saved from, for example `section`, `row`, `az_block`, `az_view`, or `custom` | `custom` | **Type**. Update 9021 backfills it from the markup; `az_block_*` and `az_view_*` values collapse to `az_block` and `az_view`. |
| `template` | string | DXPR Builder HTML | empty | **Template** markup. Update 8013 moved user templates from a database table into configuration. |
| `uid` | integer | User id | required in the form | **UID**: the owner. |
| `global` | boolean | `true`, `false` | `true` (the editor's save request sends its own value) | **Global**: `true` makes the template available to all users (subject to profiles); `false` keeps it private to the owner. |
| `image` | string | Base64-encoded image contents | empty | **Image**: thumbnail. |
| `uuid` | string | UUID | generated | Universally unique id. |

## Exporting configuration

Export all DXPR Builder configuration:

```bash
drush config:export

```

This exports settings, profiles, page templates, and user templates as YAML files in the config sync directory. When `api_key_storage` is `key`, the product key is not part of `dxpr_builder.settings`. It lives in the selected Key entity and follows that key's own provider, such as configuration, a file or an environment variable.

## What's next?

- [General settings](/hc/documentation/learn-dxpr-builder/admin/general-settings): the settings form
- [Firewall and data residency](/hc/documentation/learn-dxpr-builder/getting-started/behind-a-firewall): the keys that control outbound connections
- [API endpoints](/hc/documentation/learn-dxpr-builder/reference/api-endpoints): routes that read this configuration