Developer Features in 25R1
Filters
Application Family
Tags
We are pleased to bring you the following additions and enhancements to Developer Portal features in 25R1.
Service Announcements
Section link for Service AnnouncementsService Announcements are changes that may affect existing integrations. Organizations should assess these features against their existing integrations and make updates where necessary.
Java 17 for Vault Java SDK: Auto-Enablement
Section link for Java 17 for Vault Java SDK: Auto-EnablementIn 25R2, Veeva is upgrading Vault Java SDK to Java 17. Java 17 includes optimizations that can improve performance and efficiency compared to Java 8, allowing for reduced resource usage.
In this release, Vault is auto-enabling Java 17 compilation in all Vaults. When enabled, Vault compiles new SDK code deployments with Java 17 instead of Java 8. This means that enabling Java 17 does not automatically test your custom code for compatibility, as existing code is not recompiled. To test your code for compatibility with Java 17, redeploy any existing custom code to recompile with Java 17. We are also adding additional Java 17 syntax to the JDK allowlist.
When Java 17 is enabled:
- Existing custom code deployed to your Vault is not affected.
- Updates to (or re-deployment of) existing code will cause the code to compile with Java 17 instead of Java 8.
- New code deployed to your Vault will compile with Java 17.
TLS Cipher Suite and Version Changes
Section link for TLS Cipher Suite and Version ChangesIn the 25R1 release, we have modified the set of TLS 1.2 cipher suites supported by Vault servers, removing weak cipher suites, and adding support for TLS 1.3. These changes may affect some custom integrations, but not users accessing Vault with a supported browser. All customers and partners with affected integrations have been contacted directly by Developer Support.
Learn more about Veeva Vault cipher suite changes.
Picklist Limit Updates
Section link for Picklist Limit UpdatesIn multi-value picklist fields on objects, users can select a maximum of 100 values. Prior to this change, users could select more than 1,000 values, which resulted in a less optimal user experience and performance.
To prevent immediate integration interruption, users can still edit existing multi-value picklist fields on object records with more than 100 values selected, as long as the new number of values selected is less than or equal to the quantity currently selected. For example, an existing multi-value picklist with 150 values selected could be updated to 149 selected, but not to 151. Once updated to 149, a subsequent update to the same multi-value picklist could not have 150 values selected.
To ensure the ongoing functionality of integrations, developers need to evaluate their code to ensure all updates to multi-picklist values do exceed 100 picklist values (or the existing number of values, whichever is greater).
Additionally, this feature raises the limit for the number of possible entries that can exist in a picklist (on objects or documents) from 1,204 to 2,000.
Release Highlights
Section link for Release HighlightsCustom Pages
Section link for Custom PagesWith Custom Pages, your organization can now build completely custom user interfaces in Vault. This enables you to create specialized user interfaces for specific use cases without setting up external infrastructure. For example, with Custom Pages, your organization can build complex data entry forms, aggregated data views, and integration portal interfaces.
Developers create Custom Pages with client-side and server-side code. On the client side, developers write Custom Pages in JavaScript with their preferred frameworks and libraries. On the server side, developers can leverage the power of Vault Java SDK to retrieve and manage Vault data. Integrations can also dynamically send users to Custom Pages within an integration flow.
To create a Custom Page, developers need to:
- Develop client and server code: Develop client code with JavaScript and optional server code with Java.
- Deploy code to Vault: Deploy server code using Vault Java SDK Maven plugin
and deploy client code using Vault API. - Configure the Custom Page in Vault: To create a Custom Page, configure a
Pagecomponent. This links the client code and server code in Vault. Custom Pages are secured with permission sets. Your code will run when a user loads the Custom Page. You can also configure aTabor aPagelinkcomponent to display a Custom Page in Vault.
Learn more about Custom Pages.
Component Definition Query
Section link for Component Definition QueryThe Component Definition Query API enables developers to build simple and scalable configuration tools using Vault API. Queries can be constructed to filter and extract component definitions at high speeds, allowing developers to store the configuration in external source code repositories.
This new API supports queries on Vault component records (vault_component__v) and retrieving their MDL (mdl_definition__v) and JSON definitions (json_definition__v). Developers can also query inbound VPK components (vault_package_component__v) for the definitions of inbound package component steps, allowing developers to understand which changes were executed as part of the package.
Component Definition Query:
/api/{version}/query/componentsWord Formatted Outputs
Section link for Word Formatted OutputsWord Formatted Outputs is a new feature that allows admins to design formatted outputs using a Microsoft Word file instead of an Adobe XFA PDF file as the input file. Learn more about the user and Admin-facing functionality of this feature in the Vault Help release notes
This feature has added the input_file_type and output_format attributes to the Formattedoutput component type’s MDL. Existing Formattedoutput components will be migrated to the new model upon release. Vault still accepts any VPKs and MDL components using the old model and converts them to the new model upon deployment.
Global Changes
Section link for Global ChangesGlobal changes are features that affect multiple product areas or affect Vault holistically. For example, new functionality accessible through both Vault API and Vault Java SDK.
Roll-up Fields
Section link for Roll-up FieldsRoll-up fields offer a powerful way to aggregate values from child records associated with a parent object via a parent-child object relationship, such as calculated expenses in an expense report. Roll-up fields deliver these calculated values over time without manual effort. Learn more about this feature’s user and Admin-facing functionality in the Vault Help release notes
Previously, this functionality was only available with custom SDK code. If your organization currently utilizes custom SDK code which mimics Roll-up field functionality, we encourage you to take advantage of Roll-up fields instead and deprecate your SDK code solution. Updates to Roll-up fields on parent records are considered a change on the record. However, Roll-up field updates do not invoke Vault Java SDK triggers.
In MDL, Roll-up fields now include several new attributes: rollup('true'), rollup_relationship_name, rollup_source_field, rollup_function, and rollup_filter_criteria.
Vault API
Section link for Vault APIYou can set Roll-up fields using Record Migration Mode, but they otherwise behave as read-only. When you configure a Roll-up field, Vault calculates its value when an event occurs on the child records associated with it.
Developers can initiate a recalculation for Roll-up fields on a single object and check the status of a recalculation using Vault API. When performing a full recalculation on an object, Vault recalculates all Roll-up fields on the object asynchronously.
/api/{version}/vobjects/{object_name}/actions/recalculaterollupsRetrieve Roll-up Field Recalculation Status:
/api/{version}/vobjects/{object_name}/actions/recalculaterollupsVault Java SDK
Section link for Vault Java SDKThis release brings the following changes to use the Vault Java SDK for Roll-up fields:
- The
ObjectFieldMetadataTypeEnum now includesROLLUPas an option to represent a Roll-up object field. - The
ObjectRollupFieldTypecaptures the supported return types for a Roll-up field:CURRENCY,DATE,DATETIME,NUMBER,PERCENT. - The
ObjectRollupFieldFunctionTypeEnum captures the supported return types for a Roll-up field:COUNT,MAX,MIN,SUM. - The
ObjectRollupFieldExpressionMetadatainterface extendsExpressionMetadataand returns any configured filter expressions. - The
ObjectRollupFieldMetadatainterface provides access to metadata on a given Roll-up field.
Enhanced Picklist Administration
Section link for Enhanced Picklist AdministrationAs part of this feature, we are introducing additional attributes to the Picklist component type’s MDL. The new system_managed attribute will indicate that users cannot:
- Change the name of the Picklist
- Add new values
- Edit the public keys
- Delete picklist
However, users may be able to change the labels of the picklist values, activate or inactivate them, and change the sequencing depending on the nature of restrictions placed on system and standard picklists.
As part of this feature, picklist values will now be returned via picklist APIs and SDKs sorted ascendingly based on their designated order (MDL order attribute). Picklist values that possess the same order value will be sorted in the order they were configured.
Picklist Dependencies
Section link for Picklist DependenciesPrior to this release, dependencies between picklist values could only be specified on the fields that leverage picklist. Because these dependencies exist on the field (not picklist), there could be differing dependencies between two fields that leverage the same picklist. As part of this release, standard picklists can now have dependencies defined on the picklist, as opposed to the field. Learn more about the user and Admin-facing functionality of this feature in the Vault Help release notes
Picklists that have dependencies defined will present a new controlling_picklist MDL attribute that details the picklist upon which the current one is dependent. In addition to the controlling picklist attribute on the picklist, the Picklistentry subcomponents will contain a new controlling_entries MDL multi-value attribute that details which values on the controlling picklist the dependent picklist’s value is dependent upon.
Vault API
Section link for Vault APIThe Retrieve All Picklists endpoint has been enhanced to indicate a picklist is system-managed:
/api/{version}/metadata/objects/picklistsThe Retrieve Picklist Values endpoint has been enhanced to provide any defined system-managed dependencies:
/api/{version}/objects/picklists/:\{picklist_name\}Vault Java SDK
Section link for Vault Java SDK- The
PicklistInterface is enhanced to return system-managed information. - A new
PicklistValueMetadataCollectionRequest.BuilderInterface is created to retrieve picklist value metadata. - A new
PicklistValueMetadataCollectionResponseInterface is created to provide results from an executedPicklistValueMetadataCollectionrequest. - A new
PicklistDependencyMetadataCollectionRequest.BuilderInterface is created to retrieve picklist dependency information. - A new
PicklistDependencyMetadataCollectionResponseInterface will be created to provide results from an executedPicklistDependencyMetadataCollectionRequest. - A new
PicklistDependencyInterface is created to return picklist dependency information.
Vault API v25.1
Section link for Vault API v25.1Vault API features added in 25R1 only affect API v25.1, unless otherwise noted.
New Platform Endpoints
Section link for New Platform EndpointsSDK Debug Log API
Section link for SDK Debug Log APIThese new endpoints allow developers to manage the SDK Debug Logs via Vault API, which can be used by external tools or to download the files without accessing the UI.
/api/{version}/logs/code/debug/api/{version}/logs/code/debug/{id\}/api/{version}/logs/code/debug/{id}/files/api/{version}/logs/code/debug//api/{version}/logs/code/debug/{id}/actions/reset/api/{version}/logs/code/debug/{id\}Existing Platform Endpoints
Section link for Existing Platform EndpointsDocument Template Conversion Enhancements
Section link for Document Template Conversion EnhancementsVault API now supports converting a basic document template into a controlled document template by specifying the template_doc_id__v, which automatically changes the value of the is_controlled__v attribute to true. These changes apply to the following existing endpoints:
Update Single Document Template:
/api/{version}/objects/documents/templates/{template_name}Update Multiple Document Templates:
/api/{version}/objects/documents/templatesOptimizing Validate Session User API
Section link for Optimizing Validate Session User APITo optimize the performance of the Validate Session User API, starting in v25.1 the response only includes attributes stored in Vault. For example, the endpoint no longer returns the domain name and domain status. Previous versions of the API are unaffected by this change, but developers are encouraged to use the Session Keep-Alive API to keep sessions active and to upgrade to v25.1 to optimize performance when session user information is required.
Document Migration Mode Support for Document Relationships
Section link for Document Migration Mode Support for Document RelationshipsDocument Migration Mode now supports Document Relationships when using Vault Loader (UI and CLI) and Vault API. This feature enhances Vault performance when migrating document relationships in Veeva Promomats.
Migration Package Deployment Enhancements
Section link for Migration Package Deployment EnhancementsThe Retrieve Package Deploy Results API now includes a URL to download a ZIP file containing all deployment success and failure logs without needing to access Vault UI.
Additionally, deployment logs are created as record attachment versions on the Vault Package (vault_package__v) object. Previously, each log file was a separate attachment. From this release, there is a single attachment, with each new log added a new version.
Audit Grouping ID in Object Audit API
Section link for Audit Grouping ID in Object Audit APIThis feature adds the grouping_id to the Object Audit API. Vault populates the grouping_id, which indicates that the audit entries with the same ID are grouped logically.
Application-Specific Endpoints
Section link for Application-Specific EndpointsVault PromoMats: Deprecating Create Document Update Job API for Standard Metrics
Section link for Vault PromoMats: Deprecating Create Document Update Job API for Standard MetricsAs of this release, we deprecated the Standard Metrics: Create Document Update Job endpoint in all Vault API versions.
Vault Clinical Operations: Global Procedure Definitions
Section link for Vault Clinical Operations: Global Procedure DefinitionsThis feature streamlines procedure management in Vault by allowing for a Vault-level library of global Procedure Definitions that can be used to create Procedure Templates. Learn more about the user and Admin-facing functionality of this feature in the Vault Help release notes
With this feature, a Populate Procedure Definitions endpoint is now available to create Procedure Definitions for a specific study.
/api/{version}/app/clinical/ctms/populate-procedure-definitionsVault Clinical Operations: Merge Global Directory
Section link for Vault Clinical Operations: Merge Global DirectoryWith this feature, a new endpoint is now available for Clinical Operations Vaults to request the merge of two records on the following Global Directory objects: Person, Contact Information, Organization, and Location. Before records are successfully merged, Vault API performs validation to protect the Global Directory's data integrity. Merging Global Directory data allows for correcting duplicate records that may exist due to migrations, integrations, or day-to-day activities.
Initiate Clinical Record Merge:
/api/{version}/app/clinical/objects/{object_name}/actions/mergeVault Safety Inbox Item Import for Product Quality Complaints
Section link for Vault Safety Inbox Item Import for Product Quality ComplaintsTo support the intake of Inbox Items for Product Quality Complaints, the Intake JSON endpoint now supports the following fields on the Case Adverse Event (case_adverse_event__v) object:
- Type (
type__v) - Affected Product (
affected_product__v)
OmniConnect JS API
Section link for OmniConnect JS APITelephony Support: Click to Dial
Section link for Telephony Support: Click to DialIn MedInquiry Vaults with telephony functionality, users can now dial phone numbers from the Case and Case Contact pages. To support this in Vaults with custom telephony integrations, we’ve added the following methods to the Omniconnect JS API v25.1:
onDial: Allows the integration to register a function to do the dialingdial: Accepts a phone number and calls the function assigned in registerDialonDialError: Accepts a message string that users see in the Vault MedInquiry UI when a call fails to connect
This feature also updates the existing onConnected method to accept isOutbound: true as part of the metadata object.
Order of Operation Support for Parentheses in FIND
Section link for Order of Operation Support for Parentheses in FINDStarting in v25.1, the VQL FIND() clause respects parentheses and operator precedence. This means that operations enclosed within parentheses are evaluated first, and logical conjunctions (AND) take precedence over logical disjunctions (OR).
For example, in FIND ('diabetes' SCOPE ALL AND ('insulin' SCOPE CONTENT OR 'endocrinology' SCOPE PROPERTIES)), VQL evaluates the operation in parentheses first.
TRIM() Picklist Namespace
Section link for TRIM() Picklist NamespaceWith this release, you can use the new TRIM() VQL function with Picklist fields in the SELECT statement. This function removes the trailing namespace suffix from a picklist value name, such as __sys, __v, or __c. This transforms the query response for picklist names from picklist_value__c to picklist_value.
Filter by Reference Lookup Field in an Inner Join Subquery
Section link for Filter by Reference Lookup Field in an Inner Join SubqueryVault now supports reference lookups (joins using dot notation) in the WHERE clause of an inner join subquery. Developers can leverage this feature to retrieve values from an additional level of separation from the main query.
Example:
SELECT id
FROM component__c
WHERE id IN (SELECT parent_component__c FROM sub_components__cr WHERE sub_component_category__cr.name__v = 'VQL')Vault Java SDK
Section link for Vault Java SDKWorkflow Task Action Services SDK
Section link for Workflow Task Action Services SDKThis feature provides Vault Java SDK services to manage workflow tasks. This will enable developers to automate parts of a workflow execution. With the new services and interfaces, developers will be able to access:
- Retrieve Available Workflow Tasks
- Assign Workflow Task
- Cancel Workflow Task
- Reassign Workflow Task
- Unassign Workflow Task
- Update Workflow Task Due Date
Learn more in the SDK Documentation.
Notification SDK: Send Translated Emails to Persons
Section link for Notification SDK: Send Translated Emails to PersonsDevelopers can now send translated emails to Persons using the Vault Java SDK’s NotificationService. To accomplish this, we’ve deprecated the two existing methods for setting notification recipients and replaced them with two new methods. The new methods will accept a List<String> instead of a Set<String> and will handle duplicate detection automatically:
setRecipientsByPersons(List<String>): Sends translated emails to Persons based on their Language field value; consistent with existing behavior to send notifications to Users- Deprecated:
setRecipientsByPersonIds(Set<String>)
- Deprecated:
setRecipientsByUsers(List<String>): Sends translated emails to Users based on their Language field value. No behavior change besidesList<String>instead of aSet<String>- Deprecated:
setRecipientsByUserIds(Set<String>)
- Deprecated:
Object Metadata SDK: Object Prefix
Section link for Object Metadata SDK: Object PrefixDevelopers can now retrieve object metadata by the object prefix using the .withObjectPrefix() method. This is useful when trying to determine the metadata for an object based on the object record ID only, as the first three characters of a record ID correspond to the object prefix.
ObjectMetadataRequest objectMetadataRequest =
objectMetadataService.newObjectRequestBuilder()
.withObjectPrefix("00P")
.build();Custom Web API: Set Errors
Section link for Custom Web API: Set ErrorsFrom this release, developers can set the errors node of the Custom Web API’s response using the webApiContext.newWebApiFailureResponseBuilder(). This allows developers to create response patterns consistent with system and standard Vault APIs.
Query Describe for SDK
Section link for Query Describe for SDKSDK developers now have access to Query Describe metadata when using Query Service
Retrieve Picklist with Specified Language
Section link for Retrieve Picklist with Specified LanguageThe PicklistRequest.Builder is enhanced so that developers can pass a language when constructing their picklist request builder. With this feature, it is now possible to retrieve picklist labels in a specified language, instead of the Vault’s base language or the user’s language.
Email to Vault: Option to Always Run as Email Processor User
Section link for Email to Vault: Option to Always Run as Email Processor UserFor inbound email addresses that allow Persons or Anyone as a sender, Vault Admins now have the option to always use the specified Email Processor User when running the email processor even if the sender’s email address belongs to a Vault User.
To support this, we’ve added the new run_as_processor_user(boolean) attribute to the Inboundemailaddress component.
Summary Email Enhancements and User-Driven Notifications
Section link for Summary Email Enhancements and User-Driven NotificationsVault now includes several enhancements to help reduce notification overload for users by using Summary Email notifications as a standard more frequently. Learn more about the user and Admin-facing functionality of this feature in the Vault Help release notes
As part of this feature, the Notificationtemplate component MDL now defaults the email_preferences attribute to summary if no value is specified.
Enhanced Formatting Options for Overlay Templates
Section link for Enhanced Formatting Options for Overlay TemplatesAdmins can now customize page format, adjust font styling, select text alignment, and add logos when creating basic overlay templates that will apply to viewable renditions upon download. Prior to 25R1, Admins needed to leverage XFA templates to apply customizations like these to their overlay templates.
To support this, the MDL for the Overlaytemplate component type has additional attributes that store the values for the enhanced options in the component:
schema_version(read-only)header_richtextsignature_block_richtextfooter_richtext
All existing VPK Packages and MDL will be backward compatible. However, if users view the component in the UI, they will see the new editor window, and upon save, the Overlaytemplate component attributes will be stored in the new attributes. Creating new XFA templates is not supported.
Enhanced Formatting Options for Signature Page Templates
Section link for Enhanced Formatting Options for Signature Page TemplatesThis feature enables enhanced formatting options, such as the addition of logos or text styling, allowing developers to create signature page templates without Adobe XFA technology.
To support this feature, the Signaturepage component has the following new attributes that store the HTML for the appropriate parts of the signature page:
header_richtextsignature_block_richtextfooter_richtext
We’ve also added a new system-managed attribute schema_version to MDL to identify whether a Signaturepage uses the existing or new enhanced formatting options.
Upon release, existing basic templates will have their Rich Text attributes populated with data translated from existing values in header_01, header_02, signature_block_01, signature_block_02, footer_01, and footer_02, as applicable.
When schema_version is 0, existing attributes header_01, header_02, signature_block_01, signature_block_02, footer_01, and footer_02 will be used when generating signature pages using that template. Otherwise, Rich Text attributes will be used.
Any VPKs and MDL using the old header, signature block, and footer attributes will still be accepted. When schema_version is 0, richtext fields will be auto-populated with data translated from those fields upon execution. The same applies if schema_version is not 0 as long as no value is provided in the corresponding Rich Text attribute.
Application-Specific MDL
Section link for Application-Specific MDLVeeva Quality: Deployment Enhancements for Quality Teams
Section link for Veeva Quality: Deployment Enhancements for Quality TeamsA circular dependency between Quality Teams and formatted outputs when deploying configuration using a VPK has been resolved by introducing a new component and subcomponent: Qualityteamlifecycleassociation and Qualityteamrolelifecycleassociation. Existing Quality Teams will be migrated to the new components automatically upon release.
Veeva Quality: Create Related Record: Copy Related Object Data
Section link for Veeva Quality: Create Related Record: Copy Related Object DataIn Quality Vaults, Related Record Configurations now include a new section that defines reference records to be copied when the Create Related Record action executes, greatly reducing time spent doing manual data entry.
To support this feature, the Relatedrecordsetup MDL component type now includes the copy_attachments attribute and the new Relatedrecordreferencemapping subcomponent type.
Veeva QMS: Reason for Change: Support for Custom Objects
Section link for Veeva QMS: Reason for Change: Support for Custom ObjectsAdmins can now configure the Reason for Change feature for custom objects. To support this feature, the Qualityreasonforchange component MDL has the following new attributes:
capture_field(Subcomponent)capture_type_field(Subcomponent)record_trigger(Component Reference)
Veeva QMS: Quality Event Suggestions
Section link for Veeva QMS: Quality Event SuggestionsTo support this feature, the Qualityrecordcheck component’s display_fields attribute is now conditional. This means that if the Qualityrecordcheck is for Quality Event Suggestions, display_fields aren’t required, but they will remain required for recurrence checks and duplicate checks.
In addition, two additional subcomponents have been introduced to capture the field and related record suggestions configuration: Qualityfieldsuggestion and Qualityrelatedrecordsuggestion.