Previous Next JavaScript must be enabled to correctly display this content

## 2 New Features

Oracle APEX release 26.1 includes a number of new features. These new features are not present in APEX release 24.2 and earlier releases.

### 2.1 APEXlang

Oracle has a new Open Application Specification Language called APEXlang.

#### 2.1.1 APEXlang Features

Modern, Developer- and LLM-Friendly Application Artifact Files

In APEX 26.1, your APEX apps can optionally use the new, readable APEXlang syntax. APEXlang is a declarative language for the generative development of Oracle APEX applications. It gives developers and LLMs a supported way to represent APEX applications as human-readable files that can be reviewed, versioned, diffed, scanned, validated, and governed.

Developers can work through the APEX App Builder and export to APEXlang, or author and modify APEXlang directly using industry-standard AI agents and text editors. When stored in source control, APEXlang files (`.apx`) serve as the application source of truth.

Search and Edit APEXlang Using SQL Developer for VS Code

You can work on apps in the declarative APEX App Builder, then export them at any time to search or modify their APEXlang text file representation in your favorite editor. APEXlang is natively supported in Oracle SQL Developer for VS Code, providing direct integration with AI assistants and inheriting industry-leading source control, editing, and diffing capabilities. Oracle SQLcl provides command-line support, embedded within Oracle SQL Developer for VS Code for terminal use and available as a standalone download for headless environments.

APEXlang Read-Only Preview

From Page Designer, use the new APEXlang View option to preview a read-only snapshot of the current page in APEXlang format.

#### 2.1.2 APEXlang Export and Import

Export Types

When exporting applications and pages, APEX has four different export types:

- Standard Export - Recommended for source control; includes developer metadata.
- Runtime Export - For runtime environments. Omits developer metadata; sets build status to Run Application Only.
- Full Export - Full export. Includes developer metadata, workflow and task activity, and saved private and public reports.
- Custom - For granular control over all export options.

To see the advanced options for Standard Export, Runtime Export, or Full Export, select the type, and then select Custom.

Exporting in APEXlang

You can now choose between exporting in SQL and exporting in APEXlang:

- SQL - file name `f100.zip`
- APEXlang - file name `app-alias.zip`

For more information, see Exporting an Application in Oracle APEX App Builder User’s Guide.

Note:

In APEX 26.1, exporting runtime data such as Public Reports, Private Reports, Report Subscriptions, Workflow Instances, and Task Instances is not supported for APEXlang exports.

Importing in APEXlang

When importing an APEXlang file, at least one schema in the workspace must be REST-enabled. If errors occur during the APEXlang import, a new error page shows errors and warnings.

Currently, APEXlang imports import the entire application. It is not possible to import a single page via APEXlang import in this release.

#### 2.1.3 APEXlang Name for Plug-ins

A new attribute, APEXlang Name, is now available for plug-ins and plug-in components: Attribute Groups, Custom Attributes, Attribute List of Values, Plug-in Slots, Plug-in Action Templates, and Plug-in Action Positions. APEXlang Name is a camel case representation of the plug-in name as it appears in an APEXlang export file. When you update existing applications, APEX generates readable APEXlang Name values based on `NAME` data. The generated values are unique and made up of alphanumeric characters.

#### 2.1.4 Static ID Added

APEX 26.1 now has a new unique Static ID attribute for several components. Static ID is used in the export file to refer to components. A unique readable Static ID is generated based on Component Name upon APEX upgrade, or during import of APEX applications from prior releases.

Static ID is read-only by default to prevent accidental changes. Use the Unlock/Lock icon to toggle edit mode.

Static ID is supported in all shared components, page components, and templates.

Caution:

Be careful when changing the Static ID. APEXlang exports use Static ID, and if the Static ID changes, the diffs show up incorrectly.
For applications imported from an earlier (pre-26.1) version of APEX, APEX automatically generates unique readable Static ID values.

### 2.2 AI Integration and Tools

Oracle APEX 26.1 contains a number of new AI tools and features.

#### 2.2.1 Natural Language Support for Interactive Report

Interactive Reports now accept natural language input from APEX users, providing the functionality to apply report settings, including filter, break, and chart, with natural language. By enabling this feature, existing interactive reports are enhanced for users without needing extensive customization by developers.

When natural language support is turned on, the Default Search Mode is Search with AI.

To enable Natural Language Support for Interactive Report (NL2IR), you must have a Generative AI Service configured and the service selected within the AI Attributes of the application. For more information, see Adding Natural Language Support to Interactive Reports in Oracle APEX App Builder User’s Guide.

#### 2.2.2 Create Page Using Natural Language

You can now create pages by using natural language. Enter a description of the data or table in natural language (for example, Create a report on EBA_PROJECTS), and AI provides a possible page name, page type, and table or sample data to use. If desired, you can refine the prompt or accept the suggestions and continue with the Create Page wizard.

For more information, see Adding a New Page Using Generative AI in Oracle APEX App Builder User’s Guide.

#### 2.2.3 AI Agent Tools

AI Configurations are now renamed to AI Agents, which can now leverage a new functionality: AI Tools.

AI Tools let your AI Agent expose additional capabilities that help the AI Service to achieve a goal. When responding to a user prompt, the AI Service can call your agent's tools to retrieve additional data or perform tasks. Each tool has a name, and may have a description and parameters. Your agent runs any Augment System Prompt tools on the initial exchange with the AI Service, and gives the service the On Demand tools list. Examples might include `get_product_data`, `start_procurement_workflow`, or `email_invoice`. You implement tools using SQL, PL/SQL, or JavaScript.

If the AI Service has everything it needs, it may respond directly. If not, it may call one or more of your agent's On Demand tools. The APEX engine runs them, passing in parameters the AI Service provides. APEX responds to the service with your tools' results. This agent loop conversation continues until the AI Service decides to respond with the final answer.

Deciding Between Execution Points

Your AI Agent tool's Execution Point sets when it runs: On Demand or Augment System Prompt.

The APEX engine runs your agent's On Demand tools only when the AI Service needs them. In contrast, Augment System Prompt tools run before your agent sends the initial request to the AI Service. They can be conditional, and any results become additional system prompts that precede user input. Prior APEX releases called an Augment System Prompt tool a RAG Source. Any existing RAG Sources automatically become Augment System Prompt tools in APEX 26.1.

Either tool type can perform Retrieval Augmented Generation (RAG). For an Augment System Prompt tool, the developer determines when data is needed, often requiring complicated conditions. With On Demand tools, the AI Service decides when to use which tools instead.

Tip:

Consider migrating existing RAG Sources to On Demand tools. This can often yield better results, simplify the Agent's implementation, and lower token usage by not sending more data than needed.

Native Tool Types

APEX offers three native tool types out of the box to use on-demand or to augment the system prompt:

- Retrieve Data - Returns data based on a SQL Query, Function Body returning a CLOB, or static text.
- Execute Server-side Code - Performs server-side logic using PL/SQL or JavaScript (MLE) code. Override the default "success" result with set_tool_result in the `APEX_AI` package.
- Execute Client-side Code - Request end user-input or call browser APIs in an async context.

For example, use a Retrieve Data tool in SQL Query mode to return a person's details by querying the `PEOPLE` table. Use an Execute Server-side Code tool to insert a new person in the same table, then call `set_tool_result` to return their new ID for use by subsequent tools. Use an Execute Client-side Code tool to request the user's permission before proceeding by displaying a confirmation dialog and returning the user's choice.

Using Tool Parameters

Any tool can declare named parameters with optional description, and specify which if any is required. Supported data types include `VARCHAR2`, `CLOB`, `NUMBER` and `BOOLEAN`. Tools using SQL or PL/SQL reference parameter values as bind variables (`:PERSON_ID`). In JavaScript, they are available via `this.data` (`this.data.PERSON_ID`).

Using an Agent Declaratively

Your Show AI Assistant and Generate Text With AI dynamic actions can reference an AI Agent, as can your Generate Text with AI page processes. For programmatic use, pass the AI Agent's static ID to `APEX_AI` calls. If the AI Service calls your agent's tools, APEX automatically runs them. Client-side tools are allowed when dynamic actions like Show AI Assistant, or Generate Text With AI initiate the request from the browser.

Querying Agent Metadata

Use dictionary views `APEX_AI_AGENTS`, `APEX_AI_AGENT_TOOLS` and `APEX_AI_AGENTS_TOOL_PARAMS` to query agent metadata as needed.

Custom AI Tool Plug-ins

The Generative AI Tool plug-in type lets you create your own reusable tools to extend the built-in set.

Specifying Tool Implementations at Runtime

As an advanced alternative to using a pre-defined AI Agent, pass a collection of tool records to `chat` and `generate` APIs in the `APEX_AI` package. This lets you handle more dynamic use cases by supplying tool names, descriptions, and parameters on the fly. You also provide a PL/SQL stored procedure implementation. Runtime-defined tools come in 2 variants:

- Variant 1 - Individual Callback Procedures
  - See APEX_AI.GENERATE Function Signature 2, Example 3, in Oracle APEX API Reference.
  - In this simpler variant, each tool specifies a `callback_procedure` then provides a required signature. The APEX engine invokes it when an AI services calls the related tool. Your code accesses parameter values via `p_param.args_json` (`JSON_OBJECT_T`) and returns a value via `p_result.result` (`CLOB`).
- Variant 2 - Global Response Handler
  - See APEX_AI.GENERATE Function Signature 2, Example 4, in Oracle APEX API Reference.
  - For more flexibility, specify a "response handler" procedure for the entire call. If you provide a `p_response_handler_procedure`, then the tools may omit a `callback_procedure`. The APEX engine invokes your response handler when tool calls need executing and again when the communication with the AI Service concludes.
  - Unlike Variant 1, your procedure must loop through the list of tool calls, handle them one by one, and provide the results via `set_tool_result` in the `APEX_AI` package. This variant also allows one to inspect the full array of tool calls, see token usage, and optionally log or change the final assistant message.

#### 2.2.4 AI Tool Guardrails

Sensitive On Demand tools can be protected by requiring the user to approve the tool call before it runs. The developer can configure a dialog title, the confirmation message, which supports substitutions, and the OK and Cancel button labels.

When the user approves a tool call, the tool proceeds to execute. When the user denies, the tool does not execute, and the message "user denied" is set as the tool result under the hood. Current restrictions:

- If multiple tools that require approval are called at once, multiple confirmation dialogs are displayed one after the other. As soon as one tool call is denied, the whole batch is considered denied, including any previously approved tool calls.
- Agents with tools that require user approval may only be referenced by front-end components like Show AI Assistant or Generate Text With AI. Invoking such an agent via the `APEX_AI` APIs is not supported.

#### 2.2.5 Generate Text with AI Page Process

APEX now supports a new Generate Text with AI page process that provides a declarative equivalent of the `apex_ai.generate()` API. Use this page process for predefined actions, such as "Generate tags for the provided text", "Summarize text", "Translate text into English", and more.

#### 2.2.6 AI-Generated Structured Outputs (JSON)

Before, it was only possible to generate text using AI. For structured data, you could instruct the LLM to generate a stringified JSON object in natural language, but complete adherence to a specific format with no other surrounding text or formatting was not guaranteed.

It is now possible to specify the Response Format at both the AI Agent level and the API level. Choose between the default Text and the new JSON Object.

After selecting JSON Object, you must specify a JSON Schema that describes the format of the returned JSON object, including expected key value pairs, data types, etc. For more information on JSON Schemas, see the JSON Schema documentation.

For example, the following schema extracts a title, description, and list of tags from an unstructured piece of text:

    {
      "type": "object",
      "properties": {
        "title": {
          "type": "string"
        },
        "description": {
          "type": "string"
        },
        "tags": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      },
      "required": [
        "title",
        "description",
        "tags"
      ],
      "additionalProperties": false
    }

Currently, AI Agents with Response Format set to JSON Object cannot be used by the Show AI Assistant and Generate Text Using AI components. These configurations can only be referenced in calls to the `APEX_AI.GENERATE` API. `APEX_AI.GENERATE` accepts either a reference to an AI Configuration with the new Response Format, or a JSON Schema directly inline via the `p_response_json_schema` parameter.
The configuration generates a stringified JSON object adhering to the JSON Schema. On Oracle Database 26ai and above, APEX validates the output in the background using the `DBMS_JSON_SCHEMA` package functionality. On Oracle Database 19c, you should add programmatic validations.

Tip:

- Most AI Providers expect a strict JSON Schema where each object has `additionalProperties` set to `false` and each member of an object is marked as required. For optional members, you can still mark them as required, but set the type as `["string", "null"]`.
- Not all AI Providers support the same subset of JSON Schema functionality. While the basics are supported across the board, more advanced features might not be. Consult documentation for the specific AI Provider you're using for more information.

#### 2.2.7 Generative AI Token Usage Limits

A new attribute, Max AI Tokens, gives you the ability to define the maximum number of inbound and outbound tokens consumed by Generative AI requests at the instance level or the workspace level. You can also configure this attribute at the Generative AI Service or Vector Provider level.

#### 2.2.8 Additional AI Provider Support

APEX now additionally supports the following providers:

- Anthropic Claude
- Google Gemini
- Mistral AI
- Ollama

For more information on configuring Generative AI services in APEX, see Managing Generative AI Services in Oracle APEX App Builder User’s Guide.

### 2.3 Data Reporter

Data Reporter is a powerful and easy way to create ad-hoc reports based on custom defined datasets. Data Reporter is a peer of App Builder and SQL Workshop, available from the APEX home page. Administrators can define datasets from objects already present on the workspace, and create streamlined reports from those datasets. Data Reporter pages are not editable in Page Designer, but can be exported and imported.

For more information on Data Reporter, see Introduction to Data Reporter in Oracle APEX Data Reporter Guide.

### 2.4 Workflow and Task Enhancements

Workflows and tasks are updated to include new functionality with this release.

#### 2.4.1 Parallel Flow Support

Parallel Flow allows the execution of workflow activities in parallel via two or more branches. The workflow runtime engine simultaneously processes the branches, and moves to the next activity in the workflow once all branches are completed. For more information on parallel flow activities, see About Workflow Activities in Oracle APEX App Builder User’s Guide.

#### 2.4.2 Multi-Tenancy and Data Segregation

Data Segregation is now supported across workflow and task instance tables for multi-tenant environments, ensuring data isolation and security. When a new workflow or task is created, APEX honors the Tenant ID of the APEX session and persists the Tenant ID in all workflow and task instance tables. The Workflow Console and Unified Task List honor the APEX session tenant ID, maintaining strict tenant separation.

#### 2.4.3 Other Workflow Enhancements

Export Support for Workflow and Task Instances

You can now export workflow and task instances when exporting an application. Once exported, you can import the task and workflow instances into another environment.

"Generate Text with AI" Activity

A new Generate Text with AI workflow activity allows you to generate text with AI as part of a workflow. Use this workflow activity for predefined actions, such as "Generate tags for the provided text", "Summarize text", "Translate text into English", "Draft emails", and more.

Automatically Resume Workflow Instances after Application Upgrade

Previously, workflow instances were automatically suspended during application upgrades, and needed to be manually resumed. Now, workflow instances suspended during an application upgrade automatically resume once the upgrade process is complete.

New Procedure: APEX_WORKFLOW.SET_ACTIVITY_DUE_DATE

A new procedure, `SET_ACTIVITY_DUE_DATE`, is now available in the `APEX_WORKFLOW` API. This procedure allows setting the due date of a workflow activity instance, and can be used to prevent imported workflows from getting stuck on activities when the due date is exceeded.

#### 2.4.4 Other Task Enhancements

Authorization Scheme Support

APEX now supports using an Authorization Scheme as a participant in tasks. This allows tasks to be assigned to a group of users defined by an authorization scheme rather than to individual users. For more information, see About Task Definitions in Oracle APEX App Builder User’s Guide.

The existing Delegate, Invite Participant, and Remove Participant operations only work for users. Authorization schemes cannot be added or removed by a business administrator at runtime.

Excluded Owner and Excluded Admin

In addition to defining potential owners and business administrators in a task definition, you can now define Excluded Owners and Excluded Admins. Excluded participants must be users, not authorization schemes.

The new Exclude Participant operation allows business administrators to exclude potential owners at runtime.

Request Information from Different User

When requesting information for an approval task, you can now reassign that request to a different user when the original initiator is unavailable.

Define Task Participants with Code Editor

If your participant type is SQL Query, Function Body, or Expression, you can now define task participants with a code editor. This allows validation of participant values from directly within the code editor.

Reference Primary Key in Task Definition

If your task details page includes a form region that needs the primary key to look up the row, edit the saved task definition to include `&Pxx_ID=&DETAIL_PK.` in the Task Details URL.

### 2.5 REST Data Source Enhancements

Oracle APEX 26.1 contains enhancements to REST Data Sources.

#### 2.5.1 Specify OAuth at Invocation Level

With APEX 26.1, Web Credentials for OAuth2 Client Credentials are extended. You can now specify the token scope at invocation time. If a token for the requested scope is not yet fetched, APEX fetches the token from the server at invocation, even if access tokens for other scopes already exist. The scope attribute at the Web Credential level remains, but is now a default scope.

REST Data Sources have new Invocation Scope attributes and PL/SQL APIs have a new `P_SCOPE` parameter for the invoker to specify the OAuth scope.

#### 2.5.2 OAuth2 Enhancements

OAuth2 has a number of enhancements:

- The Client Credentials flow now supports Refresh Tokens.
- Web Credentials now support a new authentication type, OAuth2 Password Flow, that passes a user name and password in addition to an optional Client ID and Client Secret.
- Both OAuth2 Password Flow and OAuth2 Client Credentials have a new attribute, Token Authentication Method, that specifies how the credential's Client ID and Client Secret should be passed to the token server.

#### 2.5.3 Support for Client and User Assertions for Token Requests

When using OAuth Authentication Scheme, APEX can now generate signed Client and User Assertions, and use these to make token requests. To use this authentication type, the OAuth Client must be configured in the Identity Provider as Trusted rather than Confidential.

#### 2.5.4 REST Data Sources Dynamic Values

You can now choose the type, value, and language for REST source parameters, allowing you to set the value dynamically. Choose from several options: static, page item, SQL query, expression (PL/SQL or JavaScript), or function body (PL/SQL or JavaScript).

#### 2.5.5 Template Directive Support for REST Data Sources

When defining a REST operation, the Request Body Template can now incorporate template directives to build payloads that require conditional properties. This gives greater flexibility to build JSON for APEX to send to REST endpoints.

Existing Request Body attributes continue to function unchanged.

### 2.6 Map Region Enhancements

Numerous enhancements are available in the Map Region.

Dynamic Substitutions

Dynamic Substitutions are available for Application, Page Items, and System Variable substitutions. Use dynamic substitutions for fill opacity, stroke width, and stroke style. Maps also support the `line-dasharray` MapLibre property.

Map Bounding Box

Use the Bounding Box property to define a restricted map display area. Bounding Box is only enabled if the Infinite Map control is unchecked.

JS API for Layer Visibility

You can now toggle map layer visibility dynamically using JavaScript instead of relying on server-side conditions:

- To make the specified layer invisible, use `apex.region("regionId").hideLayer("layer name");`
- To make the specified layer visible, use `apex.region("regionId").showLayer("layer name");`

Move Layer Function

The `moveLayer` function to change a layer's z-position is now exposed as an API.

To move the first layer before the second layer:

    let layerId = apex.region( "regionId" ).getLayerIdByName( "First Layer Name" ),
          beforeLayerId = apex.region( "regionId" ).getLayerIdByName( "Second Layer Name" );
           apex.region( "regionId" ).moveLayer( layerId, beforeLayerId );

Flexible Map Legends

You can now enable a custom Legend item on a map layer and use either predefined or custom HTML-based legend templates. The custom legend item displays in the map legend area.

Vector Tile Layer Support

Map Regions now support Vector Tile layers, enabling improved performance and scalability when displaying large datasets. By leveraging Oracle Database vector tile generation, map data is delivered more efficiently, allowing faster rendering and smoother interaction with large numbers of objects. To enable this feature, select Use Vector Tiles in the region layer attributes.

### 2.7 Security and Compliance

Oracle APEX 26.1 contains enhancements to security and compliance.

#### 2.7.1 Content Security Policy Support

Oracle APEX 26.1 introduces a major milestone in Content Security Policy (CSP) compliance by removing dependencies on both unsafe-inline and unsafe-hashes. With these improvements, APEX now enables developers to build secure, enterprise-grade applications that comply with modern browser security standards without compromising functionality.

Compliance with CSP without unsafe-hashes

In previous versions, APEX required the unsafe-hashes directive to allow inline styles like `style="display:none;"` during page load. This dependency is now eliminated. All internal references to inline styles are replaced with secure, class-based alternatives, making it possible to exclude unsafe-hashes entirely from your CSP header.

This update enables organizations with stricter security baselines to use APEX without exceptions.

Compliance with CSP without unsafe-inline on APEX core JavaScript files

Inline JavaScript has long required the use of unsafe-inline, a directive that effectively disables CSP's core protections. In APEX 26.1, dynamic behaviors that previously relied on inline scripts are refactored to use external scripts or nonce-based execution, making unsafe-inline unnecessary.

For more information, see Configuring Content Security Policy (CSP) in Oracle APEX App Builder User’s Guide.

#### 2.7.2 Fusion Extensions Security Enhancements

Fusion Apps integration is now more flexible. When creating a Fusion Integration, the home page now displays dynamic authentication data. Groups and roles are automatically pulled into the app, and new pages make it easy to view user details and permissions. For more information on enhanced authentication and authorization schemes and the streamlined app generation process, see Integrating APEX with Fusion Applications in Oracle APEX App Builder User’s Guide.

#### 2.7.3 Allow Configuration of SMTP Credentials at Workspace Level

You can now configure the SMTP credentials for sending emails at the workspace level, rather than the instance level. To manage this feature, visit Workspace Preferences.

For more information, see Configuring Workspace Preferences in Oracle APEX Administration Guide.

### 2.8 Interactive Report Enhancements

Oracle APEX 26.1 contains enhancements to interactive reports.

New Attribute: CSS Classes for Interactive Report Columns

Interactive Report Columns now support CSS Classes so you can easily apply existing CSS classes to columns without needing to use HTML expressions to wrap content. You can add multiple classes to the column appearance by separating the classes with spaces. Interactive Report Column Appearance supports the following substitutions:

- Application
- Page Items
- Region Columns
- System Variables

New Attribute: Maximum Rows to Display

The new Maximum Rows to Display property lets you define the maximum number of rows displayed to the application user after APEX applies all filters, sorting, and other report settings.

This differs from the current Maximum Rows to Process setting that limits the number of rows retrieved before APEX applies report logic.

Row-Based Selection Support

Row-based selection support is now available for Interactive Report regions. The Row Selector column type supports Standard Report view, Icon view, and Detail view.

Use row-based selection support to select values and get the values from the configured Primary Key Column. Once you have selected rows, you can copy them to the clipboard. APEX maintains session state for pagination and navigation, but resets on all other region refreshes.

Invoke Interactive Report Dialog

When creating a dynamic action, the Execute section includes one new action: Invoke Interactive Report Dialog. Use this dynamic action to directly open an interactive report dialog by creating a button that opens the Select Columns dialog directly, or a custom button that invokes the Download IR dialog.

### 2.9 New Application Types

To promote consistency and simplify shared component reuse, three new types of applications are now available:

- Theme - Contains a theme definition that defines the visual style of an application through theme assets such as styles, templates, and template components.
- Library - Contains reusable shared components such as authentication schemes and lists of values (LOVs) that can be subscribed to by standard applications.
- Boilerplate - Provides seeded shared component subscriptions and pre-built pages designed to accelerate the creation of new applications.

Existing applications now have an application type of Standard. You can boost productivity and ensure consistency by using boilerplate applications as starting points for new applications, subscribing to shared components from library applications on existing applications, or maintaining instance-specific themes in theme applications.

### 2.10 Page Item Session State Data Type - BOOLEAN

Tip:

This functionality is only available on database version 26ai and above.

The session state infrastructure is enhanced to support an additional data type: BOOLEAN. This data type accepts one of three values (`TRUE`, `FALSE`, or `NULL`) and facilitates working with the BOOLEAN data type available in Oracle SQL as of database version 26ai.

Setting the Data Type

The BOOLEAN data type is now available for the following native item types:

- Checkbox
- Switch
- Hidden

For these items, under the attribute group Session State, the Data Type select list is now populated with VARCHAR2 (default) and BOOLEAN. If you select the data type BOOLEAN, it implies:

- The item source, default, and any computations must evaluate to a native BOOLEAN value.
- The item's bind variable referenced in PL/SQL code is of data type BOOLEAN.
- Where bind variables are not available, use `apex_session_state.get_boolean` or `apex_session_state.set_value`.

Additionally, when generating Forms and Interactive Grids via the Create wizards, APEX maps any columns of data type BOOLEAN to Switch items of data type BOOLEAN. When generating Classic or Interactive Reports, APEX maps BOOLEAN columns to Plain Text (based on List of Values) columns, referencing an auto-generated LOV named `BOOLEAN` that allows friendlier labels than `TRUE` or `FALSE`.

Behavior in JavaScript

The existing session state data types (VARCHAR2 and CLOB) so far have behaved the same way on the client-side, in that their values were represented as a String. A BOOLEAN item, however, is mapped to a native Boolean, meaning that the typical `getValue` and `setValue` item functions must accept and return real Boolean values.

Plug-in Support

Item type plug-ins can also leverage this new data type. Developers can tick the new BOOLEAN option under the plug-in definition's Session State, Data Types setting. Then, any render and validation callback code must be adapted to support BOOLEAN values. The existing types in the `APEX_PLUGIN` package can facilitate this:

- `t_item.session_state_data_type`
- `t_item_render_param.session_state_value`
- `t_item_validation_param.session_state_value`

Other Notes and Restrictions

- When referencing BOOLEAN values in static contexts, such as passing the value via the URL or assigning a Static value to an item, APEX accepts textual values TRUE, FALSE, or an empty string for null.
- This feature applies strictly to page items, not application items. Application items remain VARCHAR2 only.
- BOOLEAN items are not yet supported in the Invoke API process type.
- BOOLEAN values cannot yet be assigned via the Set Value dynamic action of type PL/SQL Expression or PL/SQL Function Body. A workaround is to use the Execute Server-side Code Dynamic Action with Items to Return instead.

Template Directives

When referenced inside of template directives, APEX substitutes BOOLEAN items with TRUE, FALSE or an empty string for null.

Object Browser Support

Object Browser is extended with the ability to create BOOLEAN table columns and the ability to edit BOOLEAN column values. In the Edit Row dialog, any textual values Oracle SQL accepts for BOOLEAN are accepted, such as `Y`, `N`, `T`, `F`, `1`, `0`, etc.

### 2.11 Oracle BI Publisher Credentials Support

APEX now supports credentials when using the Oracle BI Publisher print server. To configure this endpoint, set the username and password in Instance Administration, Instance Settings, Report Printing. For more information, see Configuring Report Printing for an Instance in Oracle APEX Administration Guide.

### 2.12 List Entry Custom Link Attributes

Lists can now store and render custom HTML attributes on each link:

- Static Lists - new Link Attributes field
- Dynamic Lists - new column `link_attributes` returned by the query

### 2.13 Extension Menu Changes

Backlink Functionality

You can now create a Backlink from an extension application that opens the corresponding app and page in the APEX Page Designer of the original App Builder window. For a shared component, the backlink opens the Shared Component edit page. To generate a backlink, use the `apex_extension.get_builder_link` API.

"Tab Identifier" Attribute

Extension Menu Links now have an additional attribute: Tab Identifier. This option attribute names the browser tab that the Extension Menu Link opens in. When clicking the Extension Menu link, if a tab with the same name already exists, it is reused. Multiple links can have the same Tab Identifier and reuse the same browser tab. If no Tab Identifier is given, a unique identifier is generated that ensures the Extension Menu Link always opens in the same tab.

For more information, see Adding, Editing, and Deleting Extension Menu Links in Oracle APEX Administration Guide.

### 2.14 Dynamic Action Enhancements

Oracle APEX 26.1 contains enhancements to dynamic actions.

#### 2.14.1 New Dynamic Actions

There are new dynamic actions available in the Notification section:

- Show Success Message, to display a success message on the page
- Show Error Message, to display an error message on the page
- Clear Errors, to clear errors displayed on the page

It is no longer necessary to use JavaScript at runtime to create success or error messages.

#### 2.14.2 AI Dynamic Action Enhancements

The AI Dynamic Actions Open AI Assistant and Generate Text with AI have a new setting: Items to Submit. The value of the items specified there is available in backend processing and can be used, for example, in the System Prompt. This prompt can reference an item value with substitution syntax `&P1_ITEM__NAME`.

#### 2.14.3 Declarative Dynamic Action Support for Actions, Buttons, Cards, and Menus

Trigger Actions provide the ability for actions, buttons, cards, and menus to define Dynamic Actions in the Page Designer tree. For actions of multi-row regions, you can access row-specific context column values via enabling the Available on Client column attribute and using Javascript `$v('COLUMN_NAME')` syntax where Javascript is available or substitution syntax (`&COLUMN_NAME.`) in the new success/error message actions. These values are only available for the duration of the execution of the set of triggered actions.

You can also pass the values to the server using Items to Submit and Items to Return. For added security, enable the Value Protected setting. To access the column values in multi-row regions, use the Available on Client attribute.

### 2.15 Unlimited Attributes for Plug-in Types

In APEX 24.2, the custom attribute limit for several plug-in types was lifted. In 26.1, this is extended to other plug-ins, which now leverage this new infrastructure out of the box. For existing plug-ings, developers need to make a few changes.

#### 2.15.1 Authorization, Authentication, and REST Source Plug-ins

In 26.1, unlimited attributes are available for Authorization, Authentication, and REST Source plug-ins. For existing plug-ings, developers need to make a few changes.

Modifying Existing Plug-ins

To modify existing plug-ins to have unlimited attributes:

1. Edit your plug-in and set the API Interface attribute to `Procedure`.
2. Update your custom attributes:
   - For Authentication plug-ins:

         -- Old Session Sentry Functions

         function <name of function> (
             p_authentication in apex_plugin.t_authentication,
             p_plugin         in apex_plugin.t_plugin,
             p_is_public_page in boolean )
             return apex_plugin.t_authentication_sentry_result

         -- New Session Sentry Procedure

         procedure <name of procedure> (
             p_authentication in            apex_plugin.t_authentication,
             p_plugin         in            apex_plugin.t_plugin,
             p_is_public_page in            boolean,
             p_result         in out nocopy apex_plugin.t_authentication_sentry_result )

         ===============================================================================

         -- Old Invalid Session Functions

         function <name of function> (
             p_authentication in apex_plugin.t_authentication,
             p_plugin         in apex_plugin.t_plugin )
             return apex_plugin.t_authentication_inval_result

         -- New Invalid Session Procedures

         procedure <name of procedure> (
             p_authentication in            apex_plugin.t_authentication,
             p_plugin         in            apex_plugin.t_plugin,
             p_result         in out nocopy apex_plugin.t_authentication_inval_result )
         ===============================================================================

         -- Old Authentication Functions

         function <name of function> (
             p_authentication in apex_plugin.t_authentication,
             p_plugin         in apex_plugin.t_plugin,
             p_password       in varchar2 )
             return apex_plugin.t_authentication_auth_result

         -- New Authentication Procedures

         procedure <name of procedure> (
             p_authentication in            apex_plugin.t_authentication,
             p_plugin         in            apex_plugin.t_plugin,
             p_password       in            varchar2,
             p_result         in out nocopy apex_plugin.t_authentication_auth_result )

         ===============================================================================

         -- Old Post Logout Functions

         function <name of function> (
             p_authentication in apex_plugin.t_authentication,
             p_plugin         in apex_plugin.t_plugin )
             return apex_plugin.t_authentication_logout_result

         -- New Post Logout Procedures must implement the following interface:

         procedure <name of procedure> (
             p_authentication in            apex_plugin.t_authentication,
             p_plugin         in            apex_plugin.t_plugin,
             p_result         in out nocopy apex_plugin.t_authentication_logout_result )

         ===============================================================================

         -- Old Authentication Scheme Plug-in Ajax Functions

         function <name of function> (
             p_authentication in apex_plugin.t_authentication,
             p_plugin         in apex_plugin.t_plugin )
             return apex_plugin.t_authentication_ajax_result

         -- New Authentication Scheme Plug-in Ajax Procedures

         procedure <name of procedure> (
             p_authentication in            apex_plugin.t_authentication,
             p_plugin         in            apex_plugin.t_plugin,
             p_result         in out nocopy apex_plugin.t_authentication_ajax_result )

   - For Authorization plug-ins:

         - Old Authorization Functions must implement the following interface:

         function <name of function> (
             p_authorization in apex_plugin.t_authorization,
             p_plugin        in apex_plugin.t_plugin )
             return apex_plugin.t_authorization_exec_result

         -- New Authorization Execution Procedures must implement the following interface:

         procedure <name of procedure> (
             p_authorization in            apex_plugin.t_authorization,
             p_plugin        in            apex_plugin.t_plugin,
             p_result        in out nocopy apex_plugin.t_authorization_exec_result )

   - For REST Data Source, the old procedure interface is available, and no changes are needed.
3. The Substitute Attribute Values switch is deprecated. When you move to the Procedure interface, this switch disappears. To perform substitutions on the attribute values, use extra parameters and the type of substitution in the `get_varchar2` function, including:
   - `p_do_substitutions`
   - `p_do_serveronly_substitutions`
   - `p_substitution_escape_mode`

       -- old
       l_my_auth_attr  varchar2(32767) := p_authentication.attribute_01;
       l_my_autz_attr  varchar2(32767) := p_authorization.attribute_01;
       l_my_web_attr   varchar2(32767) := p_result.attribute_01;

       -- new
       l_my_auth_attr varchar2(32767) := p_authentication.attributes.get_varchar2( 'my_auth_attr' );
       l_my_autz_attr varchar2(32767) := p_authorization.attributes.get_varchar2( 'my_autz_attr' );
       l_my_web_attr varchar2(32767)  := p_result.attributes.get_varchar2( 'my_web_attr' );

   Note:

   The existing get_varchar2 function takes as parameter the Static ID of the custom attribute.

When upgrading to APEX 26.1, custom attributes are migrated to receive this new Static ID. Attributes with sequence 1 get the ID `attribute_01`, attribute 2 gets ID `attribute_02`, and so on.

Creating New Attributes

For new attributes created after moving to APEX 26.1, use whatever Static ID you wish. We recommend keeping the Static ID short, lowercase, and descriptive of the purpose. For example, "`css_classes`", "`page_item_name`", or "`plsql_code`".

The new attributes construct is also available for `t_plugin` in order to read application-scope attributes.

Public Dictionary Views

Public dictionary views are changed. Querying authorization, authentication, and REST data source plug-in attributes is now done by reading the attributes JSON column.

     select s.attributes."my_static_id"
       from apex_appl_plugin_settings s
      where ...

     select a.attributes."my_static_id"
       from apex_application_authorization a
      where ...

      select c.attributes."my_static_id"
       from apex_application_auth c
      where ...

      select m.attributes."my_static_id"
       from apex_appl_web_src_modules m
      where ...

Make sure to alias the view in order to leverage the much friendlier JSON dot notation. The `attribute_01...15` columns are now obsolete and return null.

#### 2.15.2 Dynamic Action Plug-ins

In 26.1, unlimited attributes are extended to Dynamic Action plug-ins.

Modifying Existing Dynamic Action Plug-ins

To modify existing plug-ins to have unlimited attributes:

1. Edit your Dynamic Action plug-in and set the API Interface attribute to `Procedure`.
2. Update your custom attributes:

       -- Old Function Interface --
       -- plsql code
       function render (
           p_dynamic_action in apex_plugin.t_dynamic_action,
           p_plugin         in apex_plugin.t_plugin )
           return apex_plugin.t_dynamic_action_render_result
       as
           l_result       apex_plugin.t_dynamic_action_render_result;
           l_message_type p_dynamic_action.attribute_01%type := p_dynamic_action.attribute_01;
           l_js_code      p_dynamic_action.attribute_02%type := p_dynamic_action.attribute_02;
           l_total        p_dynamic_action.attribute_03%type := p_dynamic_action.attribute_03;
           l_is_true      p_dynamic_action.attribute_04%type := p_dynamic_action.attribute_04 = Y;
       begin
           apex_json.initialize_clob_output;
           apex_json.open_object;

           if l_message_type = 'static' then
             apex_json.write( 'message', l_message );
           else
               apex_json.write_raw (
                   p_name  => 'message',
                   p_value => case l_message_type
                              when 'javascript-expression'    then 'function(){ return ( ' || l_js_code || ');}'
                              when 'javascript-function-body' then 'function(){' || l_js_code || '}'
                              end );

           apex_json.write( 'count',  l_total );
           apex_json.write( 'isTrue', l_is_true );

           apex_json.close_object;

           l_result.javascript_function := 'function(){myFunction(this, ' || apex_json.get_clob_output( p_free => true ) || ');}';
           return l_result;
       end;

       -- js code
       window.myFunction = function(){
           let message = this.action.attribute01;
           let count   = this.action.attribute02;
           let isTrue  = this.action.attribute03;
           apex.da.resume( this.resumeCallback, false );
       };

                     -- New Procedure Interface --
       -- plsql code
       procedure render (
           p_dynamic_action in            apex_plugin.t_dynamic_action,
           p_plugin         in            apex_plugin.t_plugin,
           p_param          in            apex_plugin.t_dynamic_action_render_param,
           p_render_result  in out nocopy apex_plugin.t_dynamic_action_render_result
       as
           l_message_type varchar2(4000) := p_dynamic_action.attributes.get_varchar2('display-message');
           l_js_code      varchar2(4000) := p_dynamic_action.attributes.get_varchar2('js-code');
           l_total        number         := p_dynamic_action.attributes.get_number('total-value' );
           l_is_true      boolean        := p_dynamic_action.attributes.get_boolean('is-true');
       begin
           p_render_result.function_name := 'myFunction';

           p_render_result.function_param.open_object;
           if l_message_type = 'static' then
               p_render_result.function_param.put( 'message', l_message );
           else
               p_render_result.function_param.put_function (
                   p_key   => 'message',
                   p_code  =>  l_js_code,
                   p_type  => case l_message_type
                              when 'javascript-expression'    then apex_javascript.c_type_expression
                              when 'javascript-function-body' then apex_javascript.c_type_function_body
                              end );

           p_render_result.function_param.put( 'totalValue',  l_total );
           p_render_result.function_param.put( 'isTrue',      l_is_true );
           p_render_result.function_param.close_object;
       end;

       --js code
       window.myFunction = ( settings, daConfig ) => {
           const { message, totalValue, isTrue } = settings;
           apex.da.resume( daConfig.resumeCallback, false );
       };

3. The Substitute Attribute Values switch is deprecated. When you move to the Procedure interface, this switch disappears. To perform substitutions on the attribute values, use extra parameters and the type of substitution in the `get_varchar2` function, including:
   - `p_do_substitutions`
   - `p_do_serveronly_substitutions`
   - `p_substitution_escape_mode`

       -- Old
       l_my_attribute varchar2(32767) := p_dynamic_action.attribute_01;

       -- NEW
       l_my_attribute varchar2(32767) := p_dynamic_action.attributes.get_varchar2 (
                                         p_static_id                => 'my_static_id',
                                         p_do_substitution          => true,
                                         p_substitution_escape_mode => apex_session_state.c_escape_mode_html );

When upgrading to APEX 26.1, custom attributes are migrated to receive this new Static ID. Attributes with sequence 1 get the ID `attribute_01`, attribute 2 gets ID `attribute_02`, and so on.

Creating New Attributes

For new attributes created after moving to APEX 26.1, use whatever Static ID you wish. We recommend keeping the Static ID short, lowercase, and descriptive of the purpose. For example, "`img_tag`", "`set_value`", or "`get_count`".

The new attributes construct is also available for `t_plugin` in order to read application-scope attributes.

Public Dictionary Views

Public dictionary views are changed. Querying dynamic action plug-in attributes is now done by reading the attributes JSON column.

    select da.attributes.my_static_id
      from apex_application_page_da_acts da
     where ...

Make sure to alias the view in order to leverage the much friendlier JSON dot notation. The `attribute_01...15` columns are now obsolete and return null.

#### 2.15.3 Process Plug-ins

In 26.1, unlimited attributes are extended to Process plug-ins.

Modifying Existing Process Plug-ins

To modify existing process plug-ins to have unlimited attributes:

1. Edit your Process plug-in and set the API Interface attribute to `Procedure`.
2. Update your custom attributes:

       -- Old Function Interface --
       function render (
           p_process in apex_plugin.t_process,
           p_plugin  in apex_plugin.t_plugin )
           return apex_plugin.t_process_exec_result
       as
           l_result       apex_plugin.t_process_exec_result;
           l_message_type p_process.attribute_01%type := p_process.attribute_01;
           l_total        p_process.attribute_02%type := p_process.attribute_02;
           l_is_true      p_process.attribute_03%type := p_process.attribute_03 = Y;
       begin
           —
           — Plug-in code here
           --
           return l_result;
       end;

       -- New Procedure Interface --
       procedure render (
           p_process   in            apex_plugin.t_process,
           p_plugin    in            apex_plugin.t_plugin,
           p_result    in out nocopy apex_plugin.t_process_exec_result )
       as
           l_message_type varchar2(4000) := p_process.attributes.get_varchar2('display-message');
           l_total        number         := p_process.attributes.get_number('total-value' );
           l_is_true      boolean        := p_process.attributes.get_boolean('is-true');
       begin
           —
           — Plug-in code here
           --
       end;
       procedure render (
           p_process   in            apex_plugin.t_process,
           p_plugin    in            apex_plugin.t_plugin,
           p_result    in out nocopy apex_plugin.t_process_exec_result )
       as
           l_message_type varchar2(4000) := p_process.attributes.get_varchar2('display-message');
           l_total        number         := p_process.attributes.get_number('total-value' );
           l_is_true      boolean        := p_process.attributes.get_boolean('is-true');
       begin
           —
           — Plug-in code here
           --
       end;

3. The Substitute Attribute Values switch is deprecated. When you move to the Procedure interface, this switch disappears. To perform substitutions on the attribute values, use extra parameters and the type of substitution in the `get_varchar2` function, including:
   - `p_do_substitutions`
   - `p_do_serveronly_substitutions`
   - `p_substitution_escape_mode`

       -- Old
       l_my_attribute varchar2(32767) := p_process.attribute_01;

       -- NEW
       l_my_attribute varchar2(32767) := p_process.attributes.get_varchar2 (
                                         p_static_id                => 'my_static_id',
                                         p_do_substitution          => true,
                                         p_substitution_escape_mode => apex_session_state.c_escape_mode_html );

When upgrading to APEX 26.1, custom attributes are migrated to receive this new Static ID. Attributes with sequence 1 get the ID `attribute_01`, attribute 2 gets ID `attribute_02`, and so on.

After making these changes to your existing Process plug-ins, or when creating a new Process plug-in in APEX 26.1, you benefit from unlimited custom attributes, and a new, more ergonomic way to reference these values in your code.

### 2.16 UI for APEX Install/Upgrade Logs

The new Install / Upgrade Logs report in Administration Services displays information about the installation and upgrade process for the APEX instance, including all upgrade phases, warnings and errors, and a drill-down to individual steps.

### 2.17 PWA Manifest Property Support

Oracle APEX now supports PWA manifest properties (`short_name`, `handle_links`. `sizes`, `form_factor`) to improve the install experience and compatibility with modern browsers. Existing screenshots without these attributes still work, but are not optimized.

### 2.18 Run Applications from Modal Dialog

You can now run APEX applications from both the Global Page and Modal Dialogs. When using Save and Run on a Global Page, the current active page reloads, including any open modal dialogs. If no page is currently running, the application's main page (home or login) opens. When using Save and Run on a Modal Dialog, the modal dialog reloads. If no modal dialog is currently running, the active page reloads. If there is no active page, the application's main page (home or login) opens.

### 2.19 Application Lock

You can now lock APEX applications, preventing changes through App Builder. While an application is locked, you can only change the application using APEXlang, If your application has one or more Working Copies, you can also lock the application to prevent changes to the Main version of the application.

The Report view of App Builder indicates whether any applications in the workspace are locked. To learn more, see Locking and Unlocking an Application in Oracle APEX App Builder User’s Guide.

### 2.20 Infinite Scroll for Select One, Select Many, Combobox, and Autocomplete

Select One, Select Many, Combobox, and Autocomplete items now support an infinite scroll-like pattern so that users have the option of seeing all results without being limited by the Maximum Values in List property.

### 2.21 Template Directive Enhancements

Oracle APEX 26.1 contains enhancements to template directives.

#### 2.21.1 Improved Authoring of Template Directives

Writing template directives as part of Template Components, in Page Designer properties, or anywhere else in the builder is improved:

- Code Editor now supports template directive syntax highlighting
- Typing `{` now lists supported directives
- Typing `#` or `&` now lists the supported placeholders and substitutions

Plug-in developers can also opt into this new feature. Plug-in custom attributes now have a Template Support setting with the following options:

- None - The attribute value stays as-is.
- Substitutions - Page Designer help indicates substitutions are supported.
- Template Directives - Client - Page Designer help indicates substitutions are supported and template directives are processed. If the custom attribute is a Textarea or HTML type, Page Designer also performs syntax highlighting.

If using Template Directives - Client, plug-in code must still replace substitutions and process template directives as before. This new setting only affects the help text and code editor behavior in Page Designer.

#### 2.21.2 Template Directive Support for Theme Templates

Template Directives are now supported for the following theme templates: button, list, item, region, and page templates. This simplifies template maintenance and allows re-use of partials.

### 2.22 Sample Data Source

The Sample Data data source is now available to use in newly-created components so that you can create components without specifying data source details. Sample Data sources return a few rows of data so that the component is able to display.

### 2.23 Copy and Paste for Interactive Grid

Editable Interactive Grids now support clipboard features:

- Copy - copies the selected data to the clipboard
- Cut - copies the selected data to the clipboard and removes it from the editable interactive grid
- Paste - pastes the data from the clipboard, overwriting the existing data
- Paste Insert - inserts new row(s) and pastes the data from the clipboard
- Dragging a range of cells from a spreadsheet or other program that supports drag and drop of tabular data

Tip:

Copy was previously supported, but has improvements in this release. For more information, see Clipboard and Selection Feature Changes for Interactive Grid.
You can copy and paste data within the same interactive grid, or between different interactive grids. All clipboard features only work when not in edit mode. Paste only works with source apps that put tabular data on the clipboard in an appropriate format, and you must ensure that data is appropriate for the columns being pasted into. For example, a number field should only have numbers pasted into it. Select lists, including LOV types, may be complex, as the display value is not the same as the internally-stored value.

Browsers require the application use a secure URL (`https`). Browsers may require users to provide permission for the browser to access the clipboard.

### 2.24 Client-side Template Component Partials

You can now use Template Component Partials in components rendered client-side. You can use an HTML expression to reference a Template Component. For example, for the Avatar Template Component, use:

    {with/}
    TYPE:=INITIALS
    INITIALS:=MH
    {apply THEME$AVATAR/}

Use Template Components client-side for items (Combobox, Select Many, Select One) or for regions (Maps, Interactive Grid Columns, Card). If the Template Component has CSS or JavaScript files to load, APEX loads the files dynamically when the template is applied.

### 2.25 "Exclude" for Faceted Search and Smart Filters

Facets and filters for Checkbox Group, Radio Group, or Range now have an Exclude option that filters the report by all options except for the excluded ones.

### 2.26 Copy and Paste for File Upload and Image Upload

A new setting, Allow Copy and Paste, is introduced for both File Upload and Image Upload items. If enabled, users can paste files directly into the browser using standard clipboard operations (`Ctrl+V`, `Cmd+V`).

### 2.27 New "Describe Tables" Feature

The new Describe Tables feature is available in SQL Workshop under Utilities and via the `APEX_DB_DICTIONARY` API. Use this functionality to get a human-readable and LLM-friendly description of tables and views in your schema. The description can be in Markdown or plain text format, and includes columns, data types, comments, annotations, and (optionally) constraints and indexes.

This feature uses `DBMS_DEVELOPER`, and is only available in Oracle AI Database 26ai and recent patches of 19c.

### 2.28 Quick Pick Enhancements

The Quick Pick functionality of list-based items is improved. You can now configure Quick Picks with four different options: None, Static, Dynamic, and SQL Query. This allows APEX to display Quick Picks dynamically.

### 2.29 Document Generator Support for Password-Protected PDFs

The Document Generator Prebuilt Function now supports password-protected PDFs. APEX supports both hardcoded passwords and page item substitutions (`&P1_PASSWORD`).

Use the new `GENERATE_DOCUMENT` overloads to reference custom office templates stored in OCI Object Storage.

### 2.30 Blueprints

APEX now supports a new Markdown-based blueprint format for Spec-Driven Development (SDD) with AI coding assistants. With SDD, the specification becomes the durable source of truth: it describes what the application should do, what the database means, and how users should work with the data. An AI assistant can use those specifications to generate an inspectable APEX application design artifact that can be reviewed before creating the application.

For more information on blueprint support, see https://github.com/oracle/apex.

Importing an Application Blueprint

Application Blueprints can be imported directly through the App Builder Import page.

### 2.31 Universal Theme Enhancements

This release includes updates to Universal Theme, including new templates, additional component capabilities, and expanded styling options:

- a new default theme style: Iris
- added template components: Metric Card, Blank Page
- group support for Avatars, Timeline, Comments, and Media List
- updated Drawers and Dialogs to support Top and Bottom Drawer support and a Footer slot for Inline Drawers and Inline Dialogs
- advanced theme customizations and support for conditional and dynamic properties via Theme Roller
- expanded icon support with Font APEX 2.5, including 66+ new icons, new modifiers, and improved template and component options for data visualization and navigation
- Badge support for buttons using a custom `data-count` attribute
- added utility classes for overflow, tabular numbers, and flex
- added vertical alignment options for page templates
- added inbound and outbound styles for Comments component
- added option to remove default file icons when navigation collapse mode is hidden
- added CSS variable support to core components (for example, selected tree node background color)

In addition to these updates, Universal Theme now supports APEX 26.1features, including NL2IR.

To view more details, bug fixes, and best practices when using Universal Theme, run the Universal Theme Reference app.

### 2.32 Declarative Menu Buttons

Buttons now have two new properties: Show as Disabled and Type.

Show as Disabled is a switch that determines whether a button or menu entry should be rendered as disabled rather than hidden when the server-side condition evaluates to `FALSE`. This behavior aligns with Template Component Actions.

Type is a select list with two options: Standard and Menu. Standard preserves the button's existing properties. Menu hides certain action-related properties and automatically creates a Menu entry under the button in the Rendering Tree.

These properties are available in Universal Theme 26.1.

### 2.33 Show Processing for Execute Server-side Code

The Execute Server-side Code dynamic action has a new attribute: Show Processing. When set to `on`, APEX automatically displays a wait spinner for long-running PL/SQL code.

Show Processing displays an item-level spinner for each item specified in Items to Return, or a page-level spinner if there are no items specified. This ensures users receive clear visual feedback while the dynamic action is running.

### 2.34 Text Message-Based Application Translations

You can now use Text Messages for application translation. Export text message strings for a chosen language (or for all languages) in XLIFF or CSV format. Then import the translated text messages into the application, creating a translated version of text messages and allowing the application to run in multiple languages without the need for multiple translated applications.

### 2.35 PL/SQL API Updates

New Procedures

A new procedure, `APEX_HUMAN_TASK.REFRESH_BUSINESS_ADMINS`, is available. This procedure recalculates and updates the business administrators for existing tasks. Invoke this API when the current business administrators are no longer in the role and active tasks remain pending.

The new `APEX_WORKFLOW.DELETE_TASKS` procedure allows the deletion of workflow instances that are no longer relevant.

The new `APEX_HUMAN_TASK.DELETE_TASKS` procedure allows the deletion of task instances that are no longer relevant.

`SET_TOOL_RESULT` procedures are now available in the `APEX_AI` package.

New Packages

A new package, `APEX_INSTANCE_DEBUG`, lets privileged DB users (`APEX_ADMINISTRATOR_READ_ROLE` or `APEX_ADMINISTRATOR_ROLE`) list debug logs and activity logs in clients like SQL*Plus and sqlcl. The scripts in the `apex/utilities/debug` directory are updated to use this package underneath.

Previously, APEX required `SYS` access to run these scripts, so this functionality was not available to APEX administrators.

The new `APEX_DB_DICTIONARY` package is used to get a human-readable and LLM-friendly description of tables and views in your schema. The API uses `DBMS_DEVELOPER`, and is only available in Oracle AI Database 26ai and recent patches of 19c.

Changes to Existing Packages

The `REFRESH` and `PUBLISH` APIs in the `APEX_SHARED_COMPONENT` package can now be used to refresh and publish themes.

The `APEX_AI` package is updated throughout, including changes to the `CHAT` and `GENERATE` functions.

Various corrections and improvements made throughout, including:

- Available parameter values for `APEX_INSTANCE_ADMIN`
- Updated data types for `APEX_EXEC` and `APEX_EXPORT`

APEX Diff App

To compare changes and updates in PL/SQL APIs between versions 19.2 through 26.1, access the APEX Diff app: apex.oracle.com/apexdiff.

#### 2.35.1 Subscription Mode

A new installation option, Subscription Mode, is now available. Subscription Mode allows users to define how subscriptions should be managed during the application installation process.

Set Subscription Mode with the newly added API `apex_application_install.set_subscription_mode`. Use the new API `apex_application_install.set_subscription_mapping` to update subscriptions from one application to another during installation.

These APIs are applicable when installing files exported from APEX 26.1 or later.

#### 2.35.2 File Attachment Support for APEX_AI

It is now possible to attach images and other files to `APEX_AI.GENERATE` calls. Consider the following example that passes along the images uploaded via a File Upload page item on page submit:

    declare
        l_file_names    apex_t_varchar2;
        l_file          apex_application_temp_files%rowtype;
        l_attachments   apex_ai.t_attachments := apex_ai.t_attachments();
    begin
        l_file_names :=
            apex_string.split (
                p_str => :P1_ATTACHMENTS,
                p_sep => ':' );

        for i in 1 .. l_file_names.count loop
            select *
              into l_file
              from apex_application_temp_files
             where name = l_file_names( i );

            l_attachments.extend( 1 );
            l_attachments( l_attachments.count ) :=
                apex_ai.t_attachment (
                    mime_type    => l_file.mime_type,
                    content_blob => l_file.blob_content,
                    file_name    => l_file.name );
        end loop;

        :P1_RESULT :=
            apex_ai.generate (
                p_prompt        => 'Transcribe any text in the following images.',
                p_attachments   => l_attachments );
    end;

Supported file types and extensions vary between AI providers. Consult the provider's specific documentation for more details. For example, while all supported providers can handle images, not all providers support PDFs.

Processing speed for uploaded files depends on file type, file size, provider, and model. In general, smaller files are processed much faster. Consider enforcing file size limits or resolution limits for images.

Additionally, `t_attachment` records accept a `detail_level` value, such as `low` or `high` that can be used to speed up image processing at the expense of fidelity or increase fidelity at the expense of speed. This setting defaults to `auto`.

For more information, see APEX_AI in Oracle APEX API Reference.

### 2.36 JavaScript API Updates

New interfaces, functions, and methods:

- New interface `interactiveReportRegion` that includes selection and current row management.
- New `apex.util` functions: `applyNamedTemplate`, `defineTemplates`, `getTemplateDef`, `listTemplates`
- New `mapRegion` interface methods `hideLayer`, `moveLayer`, `showLayer` and option `bboxCustom`
- New `htmlBuilder` interface methods: `append`, `css`, `toJquery` for better content security policy support

Widget `grid` updates for improved clipboard and selection functionality:

- New methods: `getSelectedRanges` and `setSelectedRanges` and associated type definition `Range`
- New options: `allowCut`, `allowPaste`, `multipleRanges`, `selectCellsColumn`, `selectCellsRow`
- Option `copyValueToClipboard` has new behavior when the value is false
- Option `updateStatus` callback (from `tableModelViewBase`) has new option property `altMessage`
- Methods `copyDownSelection` and `fillSelection` now have a return value
- Updated descriptions for clipboard, selection, context menu, and keyboard information and also the `selectAll` and `selectCells` options.

Other changes:

- `actions` interface `action` type definition has new `purpose` property for improved link accessibility
- `actions` interface shortcut names support an OS-sensitive pseudo modifier "CtrlOrMeta"
- `apex.lang` methods to format messages support new named parameter syntax
- `model` interface `RecordMetadata` type definition has new properties `index` and `recSequence` and some notifications have been updated with related information. The `addData` and `move` notifications have new properties.
- `apex.util.applyTemplate` function now documents the `{with/}`, `{apply/}` template directives and has new built-in placeholders
- `apex.util.applyTemplate` function has new and updated properties for the `pOptions` parameter
- Function `apex.util.showSpinner` has new options `ariaProcessingStarted`, `ariaStillProcessing`, `ariaProcessed`, and `suppressAria` for improved accessibility
- Interface `facets` `listControl` type definition has new property `allowExclude`
- `treeNodeAdapter` interface has new method `getAccDescription` and corresponding default node property `accDescription`. The `renderNodeContent` method has new `pState` parameter property.
- Widget `menu` has new option `popupMenuLabelId` and `Item` type definition property `aria-keyshortcuts` for improved accessibility
- `menuButton` now describes new data attributes `data-menu-position` and `data-hover-menu`, describes new hover menu behavior, and gives new rules for proper accessible markup for menu buttons.
- General improvements to some descriptions including terminology change from "static id" to "HTML DOM id".
- General fixes and improvements to some examples including modernizing JavaScript and jQuery usage.

### 2.37 JavaScript Library Upgrades

- @opentelemetry/core 2.6.0
- @opentelemetry/instrumentation 0.213.0
- @opentelemetry/instrumentation-document-load 0.58.0
- @opentelemetry/instrumentation-fetch 0.213.0
- @opentelemetry/instrumentation-xml-http-request 0.213.0
- @opentelemetry/sdk-trace-base 2.6.0
- @opentelemetry/sdk-trace-web 2.6.0
- Anthropic API 0.86.0
- DOMPurify 3.4.0
- Google Gemini REST API Spec b11274
- FullCalendar 6.1.20
- JavaScript Extension Toolkit (JET) 20.0.2
- JQuery 3.7.1
- jQueryUI 1.14.1
- Less.js 4.6.3
- MapLibre 5.6.1
- marked 17.0.4
- Mistral AI Spec 0.0.2
- monaco-editor 0.55.1
- Ollama API Spec 0.19.0
- Oracle Rich Text Library (ORTL) 2607.0.2
- prism.js 1.30.0
- Terser 5.46.0
- Turndown 7.2.2