Developer Features in 26R3
Filters
Application Family
Tags
We are pleased to bring you the following additions and enhancements to Developer Portal features in 26R3.
VQL: Support Tokens for Date Literal Expressions
Section link for VQL: Support Tokens for Date Literal ExpressionsVQL 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}VQL FIND ALL Operator
Section link for VQL FIND ALL OperatorWe 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')
Vault Java SDK
Section link for Vault Java SDKSDK: Document Lifecycle Entry Criteria & Action Config Metadata
Section link for SDK: Document Lifecycle Entry Criteria & Action Config MetadataThis 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.
ObjectLifecycleStateEntryCriteriaMetadataRequestDocumentLifecycleStateEntryCriteriaMetadataRequestObjectLifecycleStateEntryActionMetadataRequestDocumentLifecycleStateEntryActionMetadataRequestObjectLifecycleStateEntryCriteriaMetadataResponseDocumentLifecycleStateEntryCriteriaMetadataResponseObjectLifecycleStateEntryActionMetadataResponseDocumentLifecycleStateEntryActionMetadataResponse
Tool Call Invoking Agent Actions
Section link for Tool Call Invoking Agent ActionsVault 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
AiToolTypeRuntimeHandlerto 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.
Global Context Scope
Section link for Global Context ScopeCustom 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.
Search URL Parameter Service
Section link for Search URL Parameter ServiceThe 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.
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();
}
}Java SDK for Formatted Datetime Based on Locale
Section link for Java SDK for Formatted Datetime Based on LocaleThe 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.
LocalizedDisplayRequest datetimeRequest = localizationService
.newLocalizedDisplayRequestBuilder()
.withLocaleCode("en_US")
.withBaseValues(ValueType.DATETIME, logTimestamps)
.withTimeZone("america_new_york__sys")
.build();File Staging Service
Section link for File Staging ServiceFileStagingService 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.
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();Vault Java SDK: Retrieve Record Status Metadata for Object Lifecycle States
Section link for Vault Java SDK: Retrieve Record Status Metadata for Object Lifecycle StatesThe 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.
DocumentMetadataService Updates
Section link for DocumentMetadataService UpdatesThis feature adds a new getCrosslinkSource() method to DocumentMetadataService.
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)) {Vault API v26.3
Section link for Vault API v26.3Grouping ID in Audit Exports
Section link for Grouping ID in Audit ExportsThe 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.
API/SDK Support for Object Reference Notation for Document Fields
Section link for API/SDK Support for Object Reference Notation for Document FieldsTo 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")
URCP for System and Integration Users
Section link for URCP for System and Integration UsersWe 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.
Hierarchy Node: Loader Export & Import
Section link for Hierarchy Node: Loader Export & ImportVault 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.
Settings Migration Support and API
Section link for Settings Migration Support and APISupport 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
GET /api/{version}/configuration/settings/
Retrieve Settings Type
GET /api/{version}/configuration/settings/{type}
Retrieve Settings Type Metadata
GET /api/{version}/configuration/settings/{type}/metadata
Update Settings Type
PUT /api/{version}/configuration/settings/{type}
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.
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.xmlEnhanced Migration Mode for Documents
Section link for Enhanced Migration Mode for DocumentsDocument 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.
Connection Authorization: API Key Support
Section link for Connection Authorization: API Key SupportAdmins 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.
Vault Loader Empty Row Handling
Section link for Vault Loader Empty Row HandlingVault 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.
Unified Time Management for Vault Jobs
Section link for Unified Time Management for Vault JobsWe 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.
Export Record Attachments API
Section link for Export Record Attachments APIThis 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
POST /api/{version}/vobjects/{object_name}/attachments/actions/export
Remove & Replace Participant Vault API & Java SDK
Section link for Remove & Replace Participant Vault API & Java SDKWe 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
POST /objects/objectworkflows/{workflow_id}/actions/replaceparticipants
Remove Participants on a Single Workflow
POST /objects/objectworkflows/{workflow_id}/actions/removeparticipants
Replace Participants on Multiple Workflows
POST /object/workflow/actions/replaceparticipants
Remove Participants on Multiple Workflows
POST /object/workflow/actions/removeparticipants
Replace Participant on All Active Workflows
POST /object/workflow/actions/replaceparticipant
Remove Participant on All Active Workflows
POST /object/workflow/actions/removeparticipant
Retrieve Replace Participants on Multiple Workflows Results
GET /object/workflow/actions/replaceparticipants/results/{job_id}
Retrieve Remove Participants on Multiple Workflows Results
GET /object/workflow/actions/removeparticipants/results/{job_id}
Retrieve Replace Participant on All Active Workflows Results
GET /object/workflow/actions/replaceparticipant/results/{job_id}
Retrieve Remove Participant on All Active Workflows Results
GET /object/workflow/actions/removeparticipant/results/{job_id}
Retrieve Workflow Actions on a Specific Workflow
GET /objects/objectworkflows/{workflow_id}/actions
Retrieve Workflow Action Details on a Specific Workflow
GET /objects/objectworkflows/{workflow_id}/actions/{workflow_action}
Retrieve Bulk Workflow Actions
GET /object/workflow/actions
SDK Interfaces
WorkflowInstanceServiceWorkflowBulkActionEventHandler
Query Explain Plan
Section link for Query Explain PlanThis 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.
{
"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
}
]
}
}Vault Information API
Section link for Vault Information APIA 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
GET /api/{version}/vault
Bulk Annotations Export
Section link for Bulk Annotations ExportTo improve performance and simplify integrations, we've introduced a cross-document bulk annotation export API, replacing the need to make individual API requests for each document version. The new endpoint returns bulk annotation data synchronously using API-controlled pagination.
The data format matches the existing single read endpoint, requiring no new field mapping. Passing include_replies=true returns full reply threads inline, removing the need for separate requests.
POST /api/{version}/objects/documents/annotations/batch/actions
Data Change Request API Third Party Data Confirmation
Section link for Data Change Request API Third Party Data ConfirmationThis 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.
POST /api/{version}/app/clinical/opendata/{object}/data_change_request?source_verified={true|false|null}
Direct Data API
Section link for Direct Data APIGrouping Id for Document Audit Log Extracts
Section link for Grouping Id for Document Audit Log ExtractsDirect Data API exports of document audit trail will now expose the grouping_id attribute, which groups entries that belong to the same transaction.
Direct Data API: Updated Audit Field Lengths
Section link for Direct Data API: Updated Audit Field LengthsWe have increased the String value limit to 10,000 characters in audit trail extracts. Direct Data API truncates any excess data.
Admin Configurable Entry Criteria Validation Messages
Section link for Admin Configurable Entry Criteria Validation MessagesTo 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.
Quality Teams Standard Triggers (SDK Object Groups)
Section link for 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.
Document Translation
Section link for Document TranslationVault 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.
Unordered Packages
Section link for Unordered PackagesTo 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. This will allow a package to be built iteratively, without having to worry about reordering the steps every time a new set of components and data are added.
The VPK files are now unordered, organized by configuration and component type in the structure outlined below. Packages support a maximum of 1,000 components.
/javasdk
/src/main/java/com/veeva/vault/custom/
<CODE FILES...>
/websdk
/dist__c/dist/
<UI CODE FILES...>
/components
/<COMPONENT TYPE...>
/COMPONENT NAME.../
<COMPONENT NAME>.mdl
/data
/<DATASET NAME>-<OBJECT NAME>/
<OBJECT NAME>.xml
<OBJECT NAME>.csv
vaultpackage.xmlDuring validation, Vault creates a plan for how to execute the deployment to get the Vault to the end state described by the package. The order of deployment for the components and data will be determined relying on the new IMPORT statements in the .mdl files in the VPK, and the data model inside of Vault.
IMPORT Object.call2__v#Field.customer__v; IMPORT Object.call2__v#Field.customer_type_picklist__v; IMPORT Objecttype.call2__v.base__v;
RECREATE Pagelayout call_detail_page_layout__c ( … );When exporting VPKs from Vault, it will include the IMPORT statements, however to obtain them when using Vault API, the new ?imports=true parameter must be included when sending requests to the Retrieve Component Record (MDL) endpoint.
GET /api/mdl/components/{type.name}?imports=true
Dynamic Date Constraints
Section link for Dynamic Date ConstraintsTo 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.
Complaints: Known Complaint Profiles
Section link for Complaints: Known Complaint ProfilesThe 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.
Complaint Intake Follow-Up: Email Collaboration
Section link for Complaint Intake Follow-Up: Email CollaborationComplaint 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:
QualityexternalnotificationQualityexternalnotificationtemplateQualityinboundemailaddressconfiguration
Complaint Intake Email Ingestion: Auto-Create Complaint Contacts
Section link for Complaint Intake Email Ingestion: Auto-Create Complaint ContactsComplaint 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
Complaint Intake Follow-Up: Auto-Retry
Section link for Complaint Intake Follow-Up: Auto-RetryThis feature builds on top of Complaint Intake Follow-Up processing by streamlining the creation of subsequent follow-up request attempts to support Good Faith Efforts.
To support this feature the following MDL component type has been updated:
Qualityinboundemailaddressconfiguration
Accessibility Support for Renditions
Section link for Accessibility Support for RenditionsThis 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.