**Source URL:** https://general.veevavault.dev/rn/26r3

# Developer Features in 26R3

We are pleased to bring you the following additions and enhancements to Developer Portal features in 26R3.

## Release Highlights

<ReleaseNote id="OOU0000000SD028" lr="26r2.4" app_family="platform" version="26r3">
### Vault CLI

Command Line Interface (CLI) for Veeva Vault. The Vault CLI queries data, makes API calls, and moves configuration between local files and vaults.

Users authenticate the CLI from the browser or with API Access Tokens.

Designed for power users, developers, and tools. Supported on Windows, Linux, and Mac.

Vault CLI releases on the [AI Release](https://rn.veevavault.help/en/gr/about-vault-releases/#vault-ai-releases) schedule.

**Installation on MacOS and Linux**

`curl -fsSL https://download.veevavault.dev/cli/install.sh | sh`

**Installation on Windows**

`irm https://download.veevavault.dev/cli/install.ps1 | iex`

**Sample commands**

`vault login` `vault query "SELECT name__v FROM RECENT documents"` `vault mdl "RECREATE Picklist color__c(...);"` `vault config pull` `vault upgrade`
</ReleaseNote>

<ReleaseNote id="OOU0000000SF030" lr="26r3.0" app_family="platform" version="26r3">
### Public Claude Plugins

To allow AI agents to effectively communicate and work within Vault, we have created a marketplace for official Claude plugins for Vault.

The marketplace contains the following plugins that help Vault Admins and developers leverage the capabilities of AI agents, all of which are built by the Veeva Product Team:

*   `plugin: vault`
    *   `skill: login` Signs in to a named Vault and classifies it as production or sandbox Vault before anything writes.
    *   `skill: query` Turns plain-English questions into VQL, reviews existing queries, and runs confirmed queries.
*   `plugin: vault-administrator`
    *   `skill: config` Pulls a Vault's configuration into a local workspace and answers configuration questions from the files.
    *   `skill: file-staging` Uploads, downloads, lists, moves, and deletes files in your Vault's file staging.
    *   `skill: mdl` Reads, writes, and runs MDL for configuration changes.
    *   `skill: vpk` Builds, validates, and deploys Vault packages.
    *   `skill: reporting` Builds, explains, and clones Vault reports, report types, and dashboards.
*   `plugin: vault-developer`
    *   `skill: api` Finds the correct Vault API endpoint, shapes the request, runs it, and reads the response.
    *   `skill: java-sdk` Writes Vault Java SDK record triggers, actions, jobs, and custom APIs.
    *   `skill: custom-pages` Scaffolds Vault Custom Pages: the `Page` MDL component, the Java `PageController`, and the client bundle.
    *   `skill: ai-agents` Scaffolds Vault AI Agents: the `Agent` MDL and the tool, context, and result handlers behind it.

The marketplace provides easy install and automatic updates using Claude's native plugin model. Veeva Claude plugins are designed for Claude Code, but can be used with other coding agents. To use Veeva Claude Plugins with another agent, copy the plugin folder into your project and point your agent at the `SKILL.md` for the skill you want to use. The agent reads the file, understands what the skill does and when to apply it, and follows its instructions.

**Prerequisites**

*   Claude Code
*   A Vault user account with API access
*   Vault CLI 26.2.4 or later (optional)
*   For Windows, you must have Git Bash or WSL

**Installation**

Run the following commands within a Claude Code session:

Add marketplace (one time)

`/plugin marketplace add veeva-ai/claude-plugins`

Add marketplace (for users without Git)

`/plugin marketplace add https://download.veevavault.dev/claude-plugins/marketplace.json`

Install a plugin

`/plugin install vault-developer@veeva-claude-plugins`

Start a new Claude Code session after installing.
</ReleaseNote>

## Vault AI

<ReleaseNote id="OOU0000000SK022" lr="26r2.4" app_family="platform" version="26r3">
### Vault AI MCP Server Support for Query Agent

Query Agent and Vault AI metadata enhancements expand the Query Agent's capabilities by enabling Vault API and MCP access, improving data display, enriching metadata, and optimizing token efficiency.

The benefits include:

*   Enables Query Agent via Vault API and MCP (non-interactive mode) for programmatic access
*   Delivers user-friendly, localized data display through automated VQL post-processing
*   Reduces token consumption and latency via tool response history optimization
*   Enriches agent context with object types, document lifecycles, and a new knowledge base object
</ReleaseNote>

## VQL

<ReleaseNote id="OOU0000000SF026" lr="26r2.3" app_family="platform" version="26r3">
### VQL: Support Tokens for Date Literal Expressions in Vault Java SDK

VQL now supports the use of Vault tokens for date literal expressions in Vault Java SDK. Developers can use the tokens with the date literal expressions instead of having to construct the VQL expression every time, allowing for cleaner code.

The following example utilizes a Vault token within a VQL query:

```
SELECT id, name__v FROM project__c WHERE datefield__c < LAST_YEARS:${Custom.TokenName}
```
</ReleaseNote>

<ReleaseNote id="OOU0000000R4006" lr="26r2.3" app_family="platform" version="26r3">
### VQL FIND ALL Operator

We have introduced a new `FIND ALL` operator, which will constrain the results obtained from regular `FIND` queries by only showing results where all search terms are present.

It is specifically optimized for Chinese, Japanese, and Korean (CJK) users who expect that a multi-character search term (which may be internally tokenized into multiple pieces) will only return results where the entire concept is found.

`SELECT id, name__v FROM documents FIND ALL ('term1 term2 term3')`
</ReleaseNote>

## Vault Java SDK

<ReleaseNote id="OOU0000000RP016" lr="26r2.2" app_family="platform" version="26r3">
### SDK: Document Lifecycle Entry Criteria & Action Config Metadata

This feature provides developers with a read-only, structured way to inspect the rules, conditions, and actions associated with a specific lifecycle state.

With this release, we've added new Vault Java SDK interfaces to retrieve lifecycle configuration metadata for entry criteria and entry action configuration.

The new interfaces extend `ObjectLifecycleMetadataService` and `DocumentLifecycleMetadataService`, and follow a request/response pair pattern with a Builder for each new service method.

*   `ObjectLifecycleStateEntryCriteriaMetadataRequest`
*   `DocumentLifecycleStateEntryCriteriaMetadataRequest`
*   `ObjectLifecycleStateEntryActionMetadataRequest`
*   `DocumentLifecycleStateEntryActionMetadataRequest`
*   `ObjectLifecycleStateEntryCriteriaMetadataResponse`
*   `DocumentLifecycleStateEntryCriteriaMetadataResponse`
*   `ObjectLifecycleStateEntryActionMetadataResponse`
*   `DocumentLifecycleStateEntryActionMetadataResponse`
</ReleaseNote>

<ReleaseNote id="OOU0000000QG106" lr="26r2.3" app_family="platform" version="26r3">
### Subagent Tools

Vault now supports tool calling an agent action, enabling AI agents to invoke other agent actions (sub-agents) as tools during LLM-driven orchestration. This capability supports both a programmatic Vault Java SDK approach for maximum flexibility and a zero-code configurable tool type for simple scenarios.

There are two ways to achieve this:

*   **Programmatic (Java SDK)**: Developers implement `AiToolTypeRuntimeHandler` to invoke one or more agent actions asynchronously within a tool call, with full pre/post-processing control.
*   **Configurable Agent Action Tool Type (UI/MDL)**: Admins configure a tool by selecting an agent and agent action, without the need for code. This supports custom objects and documents. This functionality will be available in 26R2.4.
</ReleaseNote>

<ReleaseNote id="OOU0000000RP012" lr="26r2.3" app_family="platform" version="26r3">
### Global Context Scope

Custom context types now support a global scope for context that doesn't require a document or object record. One global context type, such as a list of approved terms, can be assigned to both object and document agents, so you no longer need separate context types for each.
</ReleaseNote>

<ReleaseNote id="OOU0000000QF006" lr="26r2.3" app_family="platform" version="26r3">
### Search URL Parameter Service

The `UrlService` is enhanced to support converting filtering and sorting criteria into navigation-ready Vault search URLs. It allows developers to dynamically generate UI search paths for standard and custom objects or documents.

```java
public interface SearchUrlRequest {

    interface Builder {

        /** Sets the VQL filter criteria statement. Only AND conditions are supported */
        Builder withCriteriaVQL(String criteriaVql);

        /** Sets the targeted object name or "Documents". */
        Builder withQueryTarget(String queryTarget);

        /** Adds columns that are not displayed by default. Limit 50. */
        Builder appendDisplayColumn(String displayColumn);

        /** Sets a single field target to sort the resulting search UI view. */
        Builder withSortField(String sortField);

        /** Configures the active sort direction via an explicit enum option. */
        Builder withSortDirection(SortDirection sortDirection);

        /** Set the generated URL to open inside Business Admin. */
        Builder withOpenInBusinessAdmin(boolean openInBusinessAdmin);

        /**
         * Assembles the immutable request object.
         * Performs no validation logic locally within this method.
         */
        SearchUrlRequest build();
    }
}
```
</ReleaseNote>

<ReleaseNote id="OOU0000000RO021" lr="26r2.3" app_family="platform" version="26r3">
### Java SDK for Formatted Datetime Based on Locale

The `LocalizedDisplayRequest` can now retrieve formatted strings for `date` and `datetime` values, based on Vault timezones (picklist). This is in addition to the current locale-based number formatted strings.

This is an addition to the existing Localization Service where developers can obtain a formatted string for a DateTime value, with a specified locale and time zone.

```java
LocalizedDisplayRequest datetimeRequest = localizationService
    .newLocalizedDisplayRequestBuilder()
    .withLocaleCode("en_US")
    .withBaseValues(ValueType.DATETIME, logTimestamps)
    .withTimeZone("america_new_york__sys")
    .build();
```
</ReleaseNote>

<ReleaseNote id="OOU0000000SA020" lr="26r2.3" app_family="platform" version="26r3">
### File Staging Service

`FileStagingService` is a new Vault Java SDK service that allows developers to read and write files and folders in their Vault's file staging.

Developers can work with a `FileStagingFileReference`, a new type of `FileReference`, which is a pointer to a file. This allows Vault files to be created from a file on file staging or to export a Vault file to file staging.

Developers can manage files and directories on file staging. `FileStagingService` has functional parity with the File Staging API.

```java
fileStagingService.createItems(
    fileStagingService.newCreateItemsCollectionRequestBuilder()
        .withItems(
            VaultCollections.asList(
                fileStagingService.newCreateItemRequestBuilder()
                    .withKind(FileStagingKind.FOLDER)
                    .withPath("/docs/")
                    .build(),
                fileStagingService.newCreateItemRequestBuilder()
                    .withKind(FileStagingKind.FILE)
                    .withPath("/docs/filename.pdf")
                    .withFileReference(docFileRef)
                    .build()
            )
        ).build()
)
.onSuccess(resp -> {
    resp.getItems().forEach(response -> {
        System.out.println("Created: " + response.getFileStagingItem().getPath());
    });
})
.onError(createFileStagingItemErrors -> {
    createFileStagingItemErrors.forEach(error -> {
        System.out.println(error.getError().getMessage());
    });
})
.execute();
```
</ReleaseNote>

<ReleaseNote id="OOU0000000SK003" lr="26r2.3" app_family="platform" version="26r3">
### Vault Java SDK: Retrieve Record Status Metadata for Object Lifecycle States

The `ObjectLifecycleStateMetadata` interface in the `com.veeva.vault.sdk.api.lifecycle` package now includes the `getRecordStatus()` method.

Developers can use this method to retrieve the configured `record_status` value (such as `active__v`, `inactive__v`, `in_migration__v`, or `archived__v`) for a specific object lifecycle state.
</ReleaseNote>

<ReleaseNote id="OOU0000000SE069" lr="26r2.3" app_family="platform" version="26r3">
### DocumentMetadataService Updates

This feature adds a new `getCrosslinkSource()` method to `DocumentMetadataService`.

```java
package com.veeva.vault.sdk.api.document;

import com.veeva.vault.sdk.api.core.ServiceLocator;

/**
 * Shows how to call getCrossLinkSource() on a DocumentType.
 * This file is for reading only — it is not meant to compile as-is.
 */
public class UsageExample {

    void example() {

        // Step 1: Get the DocumentMetadataService from the platform.
        DocumentMetadataService metadataService =
                ServiceLocator.locate(DocumentMetadataService.class);

        // Step 2: Build a request for a specific document type.
        // You can identify the type by its type/subtype/classification names,
        // or by its document type detail record ID.
        DocumentTypeRequest request = metadataService.newDocumentTypeRequestBuilder()
                .withType("training_material__v")
                .withSubtype("instructor_led__v")
                .withClassification("slide_deck__v")
                .build();

        // Step 3: Retrieve the document type metadata.
        DocumentType docType = metadataService.getDocumentType(request);

        // Step 4: Read the crosslink source setting.
        // This tells you which file a CrossLink document built on this type will expose.
        String crossLinkSource = docType.getCrossLinkSourceType();

        if (crossLinkSource == null) {
            // null means this level has no explicit crosslink source setting.
            // The platform inherits from the parent type and falls back to rendition.
            System.out.println("CrossLink source is inherited from the parent type.");
        } else if ("source_file_and_rendition__sys".equals(crossLinkSource)) {
```
</ReleaseNote>

<ReleaseNote id="OOU0000000SR018" lr="26r3.0" app_family="platform" version="26r3">
### Tool Type Java SDK Enhancement: isExecutable Method

The tool type SDK entry point now includes an `isExecutable` method, which is useful to determine if a tool should be made available to the agent, based on user permissions.
</ReleaseNote>

## Vault API v26.3

<ReleaseNote id="OOU0000000Q4005" lr="26r2.2" app_family="platform" version="26r3">
### Grouping ID in Audit Exports

The `grouping_id` attribute is now available in the document audit details for the Retrieve Audit Details and Retrieve Complete Audit History for a Single Document endpoints. The *Grouping ID* column is also available in the CSV exports for these endpoints.

The *Grouping ID* groups the entries that belong to the same transaction. The *Grouping ID* attribute was previously only available for object audit trail details.
</ReleaseNote>

<ReleaseNote id="OOU0000000R5017" lr="26r2.2" app_family="platform" version="26r3">
### API/SDK Support for Object Reference Notation for Document Fields

To allow better portability and improved readability of code and payload, object reference notation can now be used to set object reference field values on a document via Vault API or Vault Java SDK.

`docToUpdate.setValue("document_product__vr.name__v", "VERTEO-NATEVBA")`
</ReleaseNote>

<ReleaseNote id="OOU0000000RD008" lr="26r2.3" app_family="platform" version="26r3">
### URCP for System and Integration Users

We are exposing the User Record Control Profile values for users, which can help Admins determine if certain users in the system are controlled by special behaviours. Special users include system managed users, AI agent users, and App Integration users.

To support this feature the `Userrecordcontrolprofile` component type is now publicly available, and a new field, *User Record Control Profile* (`user_record_control_profile__sys`) has been added to the *User* object.
</ReleaseNote>

<ReleaseNote id="OOU0000000PI097" lr="26r2.3" app_family="platform" version="26r3">
### Hierarchy Node: Loader Export & Import

Vault Loader now supports loading and exporting hierarchy node data for objects that support hierarchy.

To extract hierarchies via Vault Loader API, developers can optionally add the `node_id__sys`, `order__sys`, and `parent_node_id__sys` columns to the extract.

To import hierarchies via Vault Loader API, a new `update_hierarchy` value is available for the `action` body parameter for objects where hierarchy is supported.
</ReleaseNote>

<ReleaseNote id="OOU0000000QZ050" lr="26r2.3" app_family="platform" version="26r3">
### Settings Migration Support and API

Support for settings migration allows Vault configuration to be managed via Vault API, making them deployable across environments, and manageable in source control systems such as Git. This feature also adds support to include Vault settings in VPK packages.

**API Endpoints**

**List Settings Types**

<Endpoint path="/api/{version}/configuration/settings/" method="GET" />

**Retrieve Settings Type**

<Endpoint path="/api/{version}/configuration/settings/{type}" method="GET" />

**Retrieve Settings Type Metadata**

<Endpoint path="/api/{version}/configuration/settings/{type}/metadata" method="GET" />

**Update Settings Type**

<Endpoint path="/api/{version}/configuration/settings/{type}" method="PUT" />

**SDK Interfaces**

The `SettingsService` provides read-only access to global settings from within the Vault Java SDK. This allows custom logic to be gated by administrative feature flags.

```java
SettingsService settingsService = ServiceLocator.locate(SettingsService.class);

SettingRetrieveRequest checklistsEnabledRequest =
    settingsService.newSettingRetrieveRequestBuilder()
        .withType("general_settings__sys")
        .withGroup("checklist")
        .withSetting("enabled")
        .build();
boolean checklistsEnabled =
    settingsService.retrieve(checklistsEnabledRequest).getValue(ValueType.BOOLEAN);
```

**VPK Structure**

Developers can include the settings JSON in VPK packages constructed outside of Vault by adding them to the `settings` folder at the root of the VPK package.

```
(root)
  settings
    general_settings__sys.json
  data
  components
  vaultpackage.xml
```
</ReleaseNote>

<ReleaseNote id="OOU0000000ON011" lr="26r2.3" app_family="platform" version="26r3">
### Enhanced Migration Mode for Documents

Document Migration Mode has been enhanced as part of our effort to reach parity with Record Migration Mode for objects, supporting the same relaxed field validation to enable the rapid import of documents.

The existing migration mode behavior of bypassing entry actions, entry criteria, event actions, and notifications will persist, as does the related option to bypass triggers when in migration mode.
</ReleaseNote>

<ReleaseNote id="OOU0000000SL025" lr="26r2.3" app_family="platform" version="26r3">
### Connection Authorization: API Key Support

Admins are now able to create **API Key** as a Connection Authorization Type for **External**, **Translation**, and **LLM** Vault Connection types. This extends the existing list of **Basic Auth** and **Client Credential** Connection Authorization Type.
</ReleaseNote>

<ReleaseNote id="OOU0000000SH007" lr="26r2.3" app_family="platform" version="26r3">
### Vault Loader Empty Row Handling

Vault Loader now automatically skips empty rows in CSV input files and displays a notification about skipped rows in Vault. This ensures that even if there are unintentional gaps in the rows of a CSV file, Vault will process all rows without errors.
</ReleaseNote>

<ReleaseNote id="OOU0000000QZ025" lr="26r2.3" app_family="platform" version="26r3">
### Unified Time Management for Vault Jobs

We are making an adjustment to how Vault jobs handle timezones to streamline configuration for Admins. To make managing job schedules more intuitive, we will be storing all Vault job schedules as absolute UTC timestamps and adding a *Use Vault Time* (`use_vault_time`) attribute to Vault job configurations.

This update simplifies existing timezone behaviors, giving you clearer control over whether a job follows your default Vault timezone or a specific, Admin-configured timezone.

This update also brings enhanced stability during time changes. Jobs will now always run at their originally configured local times, completely respecting the time changes of Daylight Saving Time (DST). We have adjusted the system logic so you no longer need to worry about the system shifting the underlying time attribute when DST begins or ends.
</ReleaseNote>

<ReleaseNote id="OOU0000000R1051" lr="26r2.3" app_family="platform" version="26r3">
### Export Record Attachments API

This feature enables developers to export object record attachments from up to 500 object records in a single call to Vault API. Prior to this feature, developers had to make one call per object record, leading to inefficiencies in use cases where it is required to download record attachment files in bulk.

**Export Object Record Attachments**

<Endpoint path="/api/{version}/vobjects/{object_name}/attachments/actions/export" method="POST" />

**Retrieve Object Record Attachments Export Results**

<Endpoint path="/api/{version}/vobjects/{object_name}/attachments/actions/export/{job_id}/results" method="GET" />

**Download Object Record Attachment Export File**

<Endpoint path="/api/{version}/vobjects/{object_name}/attachments/files/{file_part_name}" method="GET" />
</ReleaseNote>

<ReleaseNote id="OOU0000000R3006" lr="26r2.3" app_family="platform" version="26r3">
### Remove & Replace Participant Vault API & Java SDK

We have created new Vault API endpoints and Vault Java SDK interfaces to allow removing and replacing participants with bulk support across multiple workflows. This will allow integrations, developers, and API-enabled Admins to better manage participants in active workflows within Vault.

**API Endpoints**

**Replace Participants on a Single Workflow**

<Endpoint path="/api/{version}/objects/objectworkflows/{workflow_id}/actions/replaceparticipants" method="POST" />

**Remove Participants on a Single Workflow**

<Endpoint path="/api/{version}/objects/objectworkflows/{workflow_id}/actions/removeparticipants" method="POST" />

**Replace Participants on Multiple Workflows**

<Endpoint path="/api/{version}/object/workflow/actions/replaceparticipants" method="POST" />

**Remove Participants on Multiple Workflows**

<Endpoint path="/api/{version}/object/workflow/actions/removeparticipants" method="POST" />

**Replace Participant on All Active Workflows**

<Endpoint path="/api/{version}/object/workflow/actions/replaceparticipant" method="POST" />

**Remove Participant on All Active Workflows**

<Endpoint path="/api/{version}/object/workflow/actions/removeparticipant" method="POST" />

**Retrieve Replace Participants on Multiple Workflows Results**

<Endpoint path="/api/{version}/object/workflow/actions/replaceparticipants/results/{job_id}" method="GET" />

**Retrieve Remove Participants on Multiple Workflows Results**

<Endpoint path="/api/{version}/object/workflow/actions/removeparticipants/results/{job_id}" method="GET" />

**Retrieve Replace Participant on All Active Workflows Results**

<Endpoint path="/api/{version}/object/workflow/actions/replaceparticipant/results/{job_id}" method="GET" />

**Retrieve Remove Participant on All Active Workflows Results**

<Endpoint path="/api/{version}/object/workflow/actions/removeparticipant/results/{job_id}" method="GET" />

**Retrieve Workflow Actions on a Specific Workflow**

<Endpoint path="/api/{version}/objects/objectworkflows/{workflow_id}/actions" method="GET" />

**Retrieve Workflow Action Details on a Specific Workflow**

<Endpoint path="/api/{version}/objects/objectworkflows/{workflow_id}/actions/{workflow_action}" method="GET" />

**Retrieve Bulk Workflow Actions**

<Endpoint path="/api/{version}/object/workflow/actions" method="GET" />

**SDK Interfaces**

*   `WorkflowInstanceService`
*   `WorkflowBulkActionEventHandler`
</ReleaseNote>

<ReleaseNote id="OOU0000000MM010" lr="26r2.3" app_family="platform" version="26r3">
### Query Explain Plan

This feature adds a new explain plan Vault API header, `X-VaultAPI-Explain`, that returns query cost breakdown, helping developers and agents optimize VQL queries.

The Query Explain Plan gives Vault developers the information they need to write an optimal query. If the plan shows a query is going to be expensive to run, the caller can choose a different execution strategy before running it. You can set the `X-VaultAPI-Explain` header in the Vault API call to `summary`, `verbose`, or `analyze`.

```json
{
    "responseStatus": "SUCCESS",
    "explain_level": "verbose",
    "query_string": "SELECT id, name__v FROM project__c",
    "explain_plan": {
        "cardinality_basis": "ESTIMATE",
        "targets": [
            {
                "id": "cb4d5b62-ff1e-422b-af41-12780a95ed1f",
                "object": "project__c",
                "target_type": "SVO",
                "position": "PRIMARY",
                "traversal_type": null,
                "relationship_name": null,
                "initial_row_count": "77",
                "initial_row_count_execution_ms": 19,
                "applied_filters": "",
                "applied_order": "",
                "memory_estimate_bytes_per_row": 145,
                "initial_query": {
                    "cost_factors": {
                        "target_complexity": 7.57,
                        "complexity_factors": [],
                        "security": {
                            "record_level": true
                        }
                    }
                },
                "paging_query": null
            }
        ]
    }
}
```
</ReleaseNote>

<ReleaseNote id="OOU0000000SI005" lr="26r2.3" app_family="platform" version="26r3">
### Vault Information API

A new Vault API endpoint returns basic information about the calling Vault: the Vault name, DNS, ID, time zone, language, locale, domain, Vault type, domain type, and whether the Vault is a Vault Basics Vault. This exposes the same data already available to users via Vault Java SDK.

**Retrieve Vault Information**

<Endpoint path="/api/{version}/vault" method="GET" />
</ReleaseNote>

<ReleaseNote id="OOU0000000S6010" lr="26r2.3" app_family="platform" version="26r3">
### SiteVault-EDC Data Exchange

Vault now supports a VeevaID user session generation flow that allows an authorized application to redirect a VeevaID user through a Vault-hosted login and obtain a domain session scoped to a target Vault. This enables cross-Vault integration scenarios. The primary use case being data exchange between SiteVault and an EDC Vault, where the application needs to act on behalf of an authenticated VeevaID user without bypassing their identity verification or MFA.

**VeevaID User Session Fetch**

<Endpoint path="<auth_lb_dns>/auth/api/veevaid/oauth/login/fetch" method="GET" />
</ReleaseNote>

<ReleaseNote id="OOU0000000S2004" lr="26r2.3" app_family="clinical" version="26r3">
### Data Change Request API Third Party Data Confirmation

This feature introduces a data-origin check via a new `source_verified` parameter in the OpenData Clinical Submit Data Change Request (DCR) API. Integration consumers must now explicitly confirm that any submitted data does not originate from a third-party data provider before a DCR can be created in Veeva Clinical Operations.

<Endpoint path="/api/{version}/app/clinical/opendata/{object}/data_change_request?source_verified={true|false|null}" method="POST" />
</ReleaseNote>

<ReleaseNote id="OOU0000000QX025" lr="26r2.3" app_family="safety" version="26r3">
### Safety API Updates

With this release, Veeva Safety introduces dedicated *Inbox Item*\-related APIs and enhancements to the JSON Import API to support seamless data transfer from Veeva Falcon. These capabilities provide full access to *Inbox Item* fields, streamline pre-promotion duplicate checks, and optimize document handling during data import to drive greater operational efficiency.

Key updates include:

*   **Field Retrieval and Updates:** New API endpoints allow Vaults to programmatically retrieve and update all fields on an *Inbox Item*, ensuring complete data management prior to *Case* creation.
*   **Pre-Promotion Duplicate Search:** A dedicated duplicate search API allows integrations to check existing *Inbox Items* for potential matches before promotion, reducing duplicate records in downstream workflows.
*   **Direct Case Promotion:** A new promotion API enables automated conversion of *Inbox Items* to *Cases*.
*   **Optimized Document Import:** The JSON Import API is updated to utilize a *Document ID* element instead of requiring a raw document upload within the payload call, accelerating ingestion performance.

**Get Inbox Item**

<Endpoint path="/api/{version}/app/safety/intake/inbox/{inbox_item_id}" method="GET" />

**Promote to Case**

<Endpoint path="/api/{version}/app/safety/intake/promote?inbox_item_id={inbox_item_id}" method="POST" />

**Highlight Document with Intake**

<Endpoint path="/api/{version}/app/safety/ai/intake" method="POST" />

**Duplicate Search**

<Endpoint path="/api/{version}/app/safety/intake/duplicate-search?id={inbox_item_id}" method="GET" />

**Update**

<Endpoint path="/api/{version}/app/safety/intake/inbox/{inbox_item_id}" method="POST" />
</ReleaseNote>

<ReleaseNote id="OOU0000000PA090" lr="26r2.4" app_family="platform" version="26r3">
### Sandbox Refresh Preserves Connections

To save time and effort for Admins, Vault now preserves existing connections and their statuses when a sandbox is refreshed.

The refresh process will not copy over the connection from the source Vault, for example, a production Vault. Instead, the connections that were in the sandbox Vault before the refresh remain in place.
</ReleaseNote>

<ReleaseNote id="OOU0000000QW049" lr="26r2.4" app_family="platform" version="26r3">
### Vault API: Detailed Entry Criteria Validation Errors

The Entry Criteria API is a service that translates Vault's lifecycle state change entry criteria evaluation into structured requirements. This new capability enables AI agents and users to easily diagnose and resolve state-change issues.

The following existing user action execution endpoints have been enhanced to return the structured entry criteria evaluation payload on execution failure. The `?entrycriteria=true` query parameter enables callers to receive the structured evaluation response during execution failure of the supported actions.

**Initiate Document User Action on Multiple Documents**

<Endpoint path="/api/{version}/objects/documents/lifecycle_actions/{action_name}" method="PUT" />

**Initiate Document User Action on Single Record**

<Endpoint path="/api/{version}/objects/documents/{id}/versions/{major_version}/{minor_version}/lifecycle_actions/{action_name}" method="PUT" />

**Initiate Object Action on Multiple Records**

<Endpoint path="/api/{version}/vobjects/{object_name}/actions/{action_name}" method="POST" />

**Initiate Object Action on Single Record**

<Endpoint path="/api/{version}/vobjects/{object_name}/{object_record_id}/actions/{action_name}" method="POST" />

**Complete Single-Item Workflow Task**

<Endpoint path="/api/{version}/objects/objectworkflows/tasks/{task_id}/actions/complete" method="POST" />

**Complete Multi-Item Workflow Task**

<Endpoint path="/api/{version}/objects/objectworkflows/tasks/{task_id}/actions/mdwcomplete" method="POST" />

**Initiate Document Workflow**

<Endpoint path="/api/{version}/objects/documents/actions/{workflow_name}" method="POST" />

**Initiate Multi Record Workflow**

<Endpoint path="/api/{version}/objects/objectworkflows/actions/{workflow_name}" method="POST" />

**Cancel Workflow**

<Endpoint path="/api/{version}/objects/objectworkflows/{workflow_id}/actions/cancel" method="POST" />

**Cancel Task**

<Endpoint path="/api/{version}/objects/objectworkflows/tasks/{task_id}/actions/cancel" method="POST" />

**Resume Workflow**

<Endpoint path="/api/{version}/objects/objectworkflows/{workflow_id}/actions/resumeworkflow" method="POST" />

**Example Response**

```json
{
  "source_context": {
    "is_nested": false,
    "type": "object",
    "object_name": "task__c",
    "record_id": "V99000000001005",
    "lifecycle": "contract_management_lifecycle__c",
    "target_state": "in_review_state__c"
  },
  "entry_criteria": [
    {
      "type": "field",
      "message": "Payment Terms required before approving this contract.",
      "field": {
        "name": "payment_terms__c",
        "url": "/api/v26.3/metadata/vobjects/contract__c/fields/payment_terms__c"
      }
    },
    {
      "type": "related_data",
      "message": "All related Contract Tasks must be Complete.",
      "related_data": {
        "direction": "INBOUND",
        "related_object": "contract_task__c",
        "field_name": "contract__c",
        "field_url": "/api/v26.3/metadata/vobjects/contract_task__c/fields/contract__c",
        "relationship_name": "contract_tasks__cr",
        "required_states": [
          "complete_state__c"
        ],
        "required_state_lifecycle": "contract_task_lifecycle__v",
        "operator": "ALL_EQUAL",
        "unmet_count": 100
      }
    },
    {
      "type": "related_data",
      "message": "Contract Owner must not be Active.",
      "related_data": {
        "direction": "OUTBOUND",
        "related_object": "user__sys",
        "field_name": "contract_owner__c",
        "field_url": "/api/v26.3/metadata/vobjects/contract__c/fields/contract_owner__c",
        "relationship_name": "contract_owner__cr",
        "required_states": [
          "active_state__sys"
        ],
        "required_state_lifecycle": "vault_membership_lifecycle__sys",
        "operator": "NOT_EQUALS",
        "unmet_count": 1
      }
    },
    {
      "type": "related_data",
      "message": "All related Parent B records must be Inactive.",
      "related_data": {
        "direction": "JOIN",
        "join_object": "join_c__c",
        "related_object": "parent_b__c",
        "field_name": "parent_b__c",
        "field_url": "/api/v26.3/metadata/vobjects/join_c__c/fields/parent_b__c",
        "relationship_name": "parent_b__cr",
        "source_field_name": "parent_a__c",
        "required_states": [
          "inactive_state__c"
        ],
        "required_state_lifecycle": "parent_b_lifecycle__c",
        "operator": "ALL_EQUAL",
        "unmet_count": 100
      }
    },
    {
      "type": "related_data",
      "message": "All related Contract Changes must be Complete.",
      "related_data": {
        "direction": "INBOUND",
        "related_object": "contract_task__c",
        "field_name": "contract__c",
        "field_url": "/api/v26.3/metadata/vobjects/contract_task__c/fields/contract__c",
        "relationship_name": "contract_tasks__cr",
        "required_state_types": [
          "complete_state__sys"
        ],
        "operator": "ALL_EQUAL",
        "unmet_count": 100
      }
    },
    {
      "type": "related_data",
      "message": "Related document Contract Document (v0.1) does not have a lifecycle state configured for the Steady State state type.",
      "related_data": {
        "direction": "OUTBOUND",
        "related_object": "documents",
        "field_name": "contract_document__c",
        "field_url": "/api/v26.3/metadata/vobjects/contract__c/fields/contract_document__c",
        "relationship_name": "contract_document__cr",
        "required_state_types": [
          "steady"
        ],
        "operator": "ALL_EQUAL",
        "unmet_count": 1
      }
    },
    {
      "type": "related_data",
      "message": "Related documents do not have a lifecycle state configured for the Steady State state type.",
      "related_data": {
        "direction": "INBOUND",
        "related_object": "documents",
        "field_name": "contract1__c",
        "field_url": "/api/v26.3/metadata/objects/documents/properties",
        "relationship_name": "document_contract1__cr",
        "required_state_types": [
          "steady"
        ],
        "operator": "ALL_EQUAL",
        "unmet_count": 100
      }
    },
    {
      "type": "message",
      "message": "Formula must be TRUE."
    }
  ]
}
```
</ReleaseNote>

<ReleaseNote id="OOU0000000R6099" lr="26r2.4" app_family="platform" version="26r3">
### Document Redaction

Document redaction enables users to create redacted versions of documents using the PDF viewable rendition as the source. Redactions are applied directly in the document viewer using a new redaction annotation type (`redaction__sys`) and tool.

Redacted text including OCR text will be removed from the generated redacted document, and as such will not provide search results with the `FIND` clause in VQL.

Developers can use the existing Create Annotation API endpoints to create redaction annotations by defining `"type__sys":"redaction__sys"` and defining the `redaction_type__sys` in their request payload.

```json
[
    {
        "document_version_id__sys": "1501_0_1",
        "placemark": {
            "text_start_index__sys": 11,
            "text_end_index__sys": 14,
            "type__sys": "text__sys",
            "page_number__sys": 1
        },
        "comment__sys": "Redacted due to CCI",
        "type__sys": "redaction__sys",
        "redaction_type__sys": "cci__sys",
        "state__sys": "open__sys"
    }
]
```
</ReleaseNote>

<ReleaseNote id="OOU0000000RT047" lr="26r2.4" app_family="platform" version="26r3">
### Bulk Annotations Export

This feature introduces a new Vault API endpoint that triggers an asynchronous job to collect annotations created or modified within a specified `start_date` and `end_date` range and writes the results to a Vault's file staging. The caller follows the existing Retrieve Job Status and Download Item Content endpoints to poll for completion and download the file.

<Endpoint path="/api/{version}/objects/documents/annotations/batch/actions" method="POST" />
</ReleaseNote>

<ReleaseNote id="OOU0000000SO044" lr="26r2.4" app_family="regulatory" version="26r3">
### API: Export Single Submission & Retrieve Submission Export Results Optimizations

<Aside type="caution">
This feature may affect existing integrations. Refer to the [Vault Help Release Notes](https://rn.veevavault.help/en/gr/announcements/#future-scalable-apis-in-26r2-regulatory) for more information.
</Aside>

The Export Single Submission API now defaults to delivering compressed `.zip` files directly to the Vault's file staging. The Retrieve Submission Export Results API returns the `.zip` file path. This change supports custom integration development, while minimizing API call volumes.

**Retrieve Submission Export Results**

<Endpoint path="/api/{version}/app/regulatory/submissions_archive/export_job/{job_id}" method="GET" />

**Example Response**

```json
{
  "status": "SUCCESS",
  "responseMessage": "Submissions Archive Export Results",
  "data": {
    "job_id": "428589",
    "job_status": "SUCCEEDED",
    "user_id": "724713",
    "submission_path": "/u724713/Submissions Archive Export/428589/nda724713-0000.zip",
    "export_summary": "/u724713/Submissions Archive Export/428589/nda724713-0000-export-summary.zip"
  }
}
```
</ReleaseNote>

## Direct Data API

<ReleaseNote id="OOU0000000S9056" lr="26r2.2" app_family="platform" version="26r3">
### Grouping Id for Document Audit Log Extracts

Direct Data API exports of document audit trail will now expose the `grouping_id` attribute, which groups entries that belong to the same transaction.
</ReleaseNote>

<ReleaseNote id="OOU0000000SK026" lr="26r2.3" app_family="platform" version="26r3">
### Direct Data API: Updated Audit Field Lengths

We have increased the String value limit to 10,000 characters in audit trail extracts. Direct Data API truncates any excess data.
</ReleaseNote>

## MDL

<ReleaseNote id="OOU0000000RI013" lr="26r2.2" app_family="platform" version="26r3">
### Admin Configurable Entry Criteria Validation Messages

To provide a better user experience for entry criteria on document and object lifecycles, Admins can configure optional validation messages for each rule of up to 500 characters. If Admins choose not to configure custom validation messages, Vault returns the default system messages.

Validation messages can be retrieved via Vault Java SDK using the `getErrorMessage()` method.

In support of this feature the MDL for document and object lifecycles has been updated with the `<errorMessage>` tag for `<action>` nodes in the XML.
</ReleaseNote>

<ReleaseNote id="OOU0000000RG023" lr="26r2.2" app_family="quality" version="26r3">
### Quality Teams Standard Triggers (SDK Object Groups)

Currently, *Quality Teams* dynamically provision custom triggers for custom objects. This consumes Vault Platform trigger capacity, subjects the Veeva QMS application logic to custom SDK timeouts (500 ms) and memory limits, and causes VPK deployment errors due to inconsistent name-truncation behaviors across Vaults.

This release addresses those issues by utilizing Vault Platform's SDK Object Groups, which enables the Veeva QMS application to use a single unified standard trigger to coordinate execution across both standard and custom object types.

This release adds a new SDK Object Group named `team_enabled_objects_group__v` for the QMS application. The group contains all *Quality Team*\-enabled objects, ensuring standard triggers are used for all *Quality Teams*. The new group is hidden from customers and is read-only.

<Aside>
After this release, Veeva QMS will no longer utilize the triggers defined for *Quality Team* enabled objects on the following Vault Admin UI pages:

*   **Admin > Configuration > Record Triggers**
*   **Admin > Configuration > Record Role Triggers**

These triggers will be removed from the Veeva QMS application in a future release. When an Admin configures a new *Quality Team*, the associated triggers will automatically be included in the `team_enabled_objects_group__v`, and will not appear in *Admin > Configuration > Record Triggers* or *Admin > Configuration > Record Role Triggers*. Furthermore, the `record_trigger` and `recordrole_trigger` attributes of the new *Quality Team*'s corresponding `Qualityteam` MDL component will be blank.
</Aside>
</ReleaseNote>

<ReleaseNote id="OOU0000000R6087" lr="26r2.3" app_family="platform" version="26r3">
### Document Translation

Vault now includes a File Translation Service that allows users to translate documents directly from Vault using DeepL or Google Cloud Translate, with translated output stored as a new document or new version while preserving its original formatting.

We also added support in Vault Java SDK, which allows developers to integrate translation into custom triggers. Vault developers can use the `FileTranslationService` to submit a batch of files to the translation provider. Vault hands the completed files to a post-processing `FileTranslationEventHandler` after the run finishes.

To support this feature we have also introduced a new `Doctranslationsconfig` MDL component type.
</ReleaseNote>

<ReleaseNote id="OOU0000000QF040" lr="26r2.3" app_family="platform" version="26r3">
### Unordered Packages

To make Vault Deployment Packages (VPK) more robust and to allow VPKs to be created from configuration stored as code (config-as-code), we are changing the structure of the packages to be unordered. The order of execution will be set on import to the target Vault. This will also allow a custom package to be built intuitively, without having to worry about ordering the steps. Existing ordered saved package files will continue to import successfully.

The VPK files are now unordered, organized by configuration and component type in the structure outlined below.

```
/javasdk
    /src/main/java/com/veeva/vault/custom/
        <CODE FILES...>
/websdk
    /dist__c/
        <UI CODE FILES...>
/components
    /<COMPONENT TYPE...>
        /COMPONENT NAME.../
            <COMPONENT NAME>.mdl
/data
    /<DATASET NAME>-<OBJECT NAME>/
        <OBJECT NAME>.xml
        <OBJECT NAME>.csv
vaultpackage.xml
```

During validation, Vault creates a plan for how to execute the deployment to get the Vault to the end state described by the package.
</ReleaseNote>

<ReleaseNote id="OOU0000000QY014" lr="26r2.3" app_family="platform" version="26r3">
### Dynamic Date Constraints

To improve end user experience when selecting dates, this feature allows Admins to set the minimum and maximum dates allowed to be selected based on a formula, which is enforced in the calendar picker and upon saving.

When using the calendar picker, users will no longer be able to select invalid values for the dates based on the minimum and maximum value formulas.

To support this feature the `min_value_formula` and `max_value_formula` have been added for Date fields as optional attributes.
</ReleaseNote>

<ReleaseNote id="OOU0000000Q4001" lr="26r2.3" app_family="quality" version="26r3">
### Complaints: Known Complaint Profiles

The Known Complaint profiles functionality shall leverage a pre-defined set of approved Known Complaint Profiles and automatically link *Risks*, *Investigations*, and *Root Causes* to *Complaint* records, significantly reducing the administrative burden for complaint handling teams.

To support this feature a new `Qmsknowncomplaintprofileconfiguration` MDL component type has been introduced.
</ReleaseNote>

<ReleaseNote id="OOU0000000QW045" lr="26r2.3" app_family="quality" version="26r3">
### Complaint Intake Follow-Up: Email Collaboration

Complaint Intake Follow-Up processing offers a streamlined approach to initiate and manage all outbound follow-up requests for additional information or clarifications.

This feature enhances Complaint Intake Follow-Up (Manual Processing) by introducing email collaboration. Users can now email back-and-forth with contacts directly within Vault to clarify complaints. This centralizes communication and maintains an audit trail, eliminating the need to copy and paste external emails.

To support this feature the following MDL component types have been updated:

*   `Qualityexternalnotification`
*   `Qualityexternalnotificationtemplate`
*   `Qualityinboundemailaddressconfiguration`
</ReleaseNote>

<ReleaseNote id="OOU0000000SH018" lr="26r2.3" app_family="quality" version="26r3">
### Complaint Intake Email Ingestion: Auto-Create Complaint Contacts

Complaint Intake Email Ingestion is enhanced to automatically generate *Complaint Contact* records. This feature is a supporting feature to the *Complaint Intake Follow-Up: Email Collaboration* feature.

To support this feature the following MDL component type has been updated:

*   `Qualityinboundemailaddressconfiguration`
</ReleaseNote>

<ReleaseNote id="OOU0000000R6098" lr="26r2.3" app_family="platform" version="26r3">
### Accessibility Support for Renditions

This feature adds a new attribute, `carry_forward_accessibility_information`, to the `Renditionprofile` MDL component type. If set to `true`, Vault generates the PDF rendition as a tagged PDF that carries forward the source file's document structure tags and alt text.
</ReleaseNote>