Note: This release is in preview. Features described here don’t become generally available until the latest general availability date that Salesforce announces for this release. Before then, and where features are noted as beta, pilot, or developer preview, we can’t guarantee general availability within any particular time frame or at all. Make your purchase decisions only on the basis of generally available products and features.
MultiRootEndorsePolicy(EndorsePolicyInput, policyId)
Resource for the Insurance Multi Root Endorsement Policy Connect API POST
Method.
API Version
66.0
Requires Chatter
No
Signature
public static ConnectApi.PolicyAsyncRepresentation MultiRootEndorsePolicy(ConnectApi.EndorsePolicyInputRepresentation EndorsePolicyInput, String policyId)
Parameters
- EndorsePolicyInput
- Type: ConnectApi.EndorsePolicyInputRepresentation
- Details to endorse the multi-root insurance policy along with its child policies.
- policyId
- Type: String
- ID of the insurance policy that must be endorsed along with its child policies.
Return Value
Example
This is a sample code that calls the Multi-Root Policy Endorsement API from Apex.
1
2public with sharing class MultiRootPolicyEndorsement implements System.Callable {
3
4 public Object call(String action, Map<String, Object> args) {
5 // Retrieve the input and output maps from the arguments
6 Map<String, Object> inputMap = (Map<String, Object>) args.get('input');
7 Map<String, Object> outputMap = (Map<String, Object>) args.get('output');
8
9 // Check the action type
10 if (action == 'multiRootEndorsePolicy') {
11 System.debug('Start of connect API call to multi-root endorse policy');
12
13 // Get input parameters from the input map
14 String contextId = (String) inputMap.get('contextId');
15 String policyId = (String) inputMap.get('policyId');
16 String policyName = (String) inputMap.get('policyName');
17 String policyNumber = (String) inputMap.get('policyNumber');
18 String effectiveDate = (String) inputMap.get('effectiveDate');
19 String transactionName = (String) inputMap.get('transactionName');
20 Map<String, Object> additionalFields = (Map<String, Object>) inputMap.get('additionalFields');
21
22 System.debug('Context ID: ' + contextId);
23 System.debug('Policy ID: ' + policyId);
24 System.debug('Policy Name: ' + policyName);
25 System.debug('Policy Number: ' + policyNumber);
26 System.debug('Effective Date: ' + effectiveDate);
27 System.debug('Transaction Name: ' + transactionName);
28 System.debug('Additional Fields: ' + additionalFields);
29
30 // Initialize the job identifier
31 String jobIdentifier = null;
32
33 // Validate required parameters
34 if (String.isBlank(contextId)) {
35 System.debug('ERROR: Context ID is required');
36 outputMap.put('error', 'Context ID is required');
37 return null;
38 }
39
40 try {
41
42 // Step 1: Create Multi-Root Policy Endorsement input using the provided context ID
43 ConnectApi.EndorsePolicyInputRepresentation policyInput =
44 new ConnectApi.EndorsePolicyInputRepresentation();
45
46 // Populate fields for InsurancePolicyInputRepresentation
47 ConnectApi.InsurancePolicyInputRepresentation insurancePolicy =
48 new ConnectApi.InsurancePolicyInputRepresentation();
49
50 // Set policy basic fields (all optional except contextId)
51 if (!String.isBlank(policyName)) {
52 insurancePolicy.policyName = policyName;
53 }
54 if (!String.isBlank(policyNumber)) {
55 insurancePolicy.policyNumber = policyNumber;
56 }
57
58 policyInput.insurancePolicy = insurancePolicy;
59
60 // Populate transaction record (optional)
61 if (!String.isBlank(transactionName)) {
62 ConnectApi.InsurancePolicyTransactionInputRepresentation transactionRecord =
63 new ConnectApi.InsurancePolicyTransactionInputRepresentation();
64 transactionRecord.name = transactionName;
65 policyInput.transactionRecord = transactionRecord;
66 }
67
68 // Use the provided context ID (REQUIRED)
69 policyInput.contextId = contextId;
70
71 // Use the provided Effective Date (REQUIRED)
72 policyInput.effectiveDate = effectiveDate;
73
74 // Populate additional fields for child policies
75 if (additionalFields != null && !additionalFields.isEmpty()) {
76 System.debug('Processing additional fields for child policies');
77 policyInput.additionalFields = buildAdditionalFieldsList(additionalFields);
78 }
79
80 // Step 2: Execute Multi-Root Policy Endorsement with the provided context ID
81 System.debug('Executing Multi-Root Policy Endorsement with context ID: ' + contextId + ' policy ID:' + policyId);
82
83 Id idPolicyId = Id.valueOf(policyId);
84
85 // Call the Connect API - Multi-Root Endorsement is ASYNCHRONOUS and returns a job identifier
86 ConnectApi.PolicyAsyncRepresentation endorseResult =
87 ConnectApi.InsurancePolicyAdminFamily.multiRootEndorsePolicy(policyInput, idPolicyId);
88
89 // Get the job identifier
90 jobIdentifier = endorseResult.jobIdentifier;
91
92 // Log success
93 System.debug('Multi-root policy endorsement job started successfully. Job ID: ' + jobIdentifier);
94 System.debug('Context: ' + contextId);
95 if (!String.isBlank(policyName)) {
96 System.debug('Policy Name: ' + policyName);
97 }
98
99 // Put the job identifier in the output map
100 outputMap.put('jobIdentifier', jobIdentifier);
101 outputMap.put('endorsementResult', endorseResult);
102
103 } catch (Exception e) {
104 System.debug('Error while executing multi-root policy endorsement: ' + e.getMessage());
105 System.debug('Stack Trace: ' + e.getStackTraceString());
106 outputMap.put('error', e.getMessage());
107 }
108
109 // Return the job identifier
110 return jobIdentifier;
111 }
112
113 // If the action is not recognized, return null
114 return null;
115 }
116
117
118
119 /**
120 * Build additional fields list for multi-root policies
121 * Converts from Map structure to List<ConnectApi.AdditionalFieldsMapValue>
122 *
123 * Input structure:
124 * {
125 * "additionalFieldsList": [
126 * {
127 * "additionalFieldsMapValue": {
128 * "instanceKey": "AutoSilver",
129 * "fields": { "PolicyName": "James Auto Policy"}
130 * }
131 * }
132 * ]
133 * }
134 */
135 private static List<ConnectApi.AdditionalFieldsMapValue> buildAdditionalFieldsList(Map<String, Object> additionalFieldsInput) {
136 List<ConnectApi.AdditionalFieldsMapValue> fieldsList = new List<ConnectApi.AdditionalFieldsMapValue>();
137
138 // Get the additionalFieldsList array
139 List<Object> additionalFieldsList = (List<Object>) additionalFieldsInput.get('additionalFieldsList');
140
141 if (additionalFieldsList != null && !additionalFieldsList.isEmpty()) {
142 for (Object item : additionalFieldsList) {
143 Map<String, Object> itemMap = (Map<String, Object>) item;
144 Object mapValue = itemMap.get('additionalFieldsMapValue');
145
146 if (mapValue != null) {
147 // Create ConnectApi.AdditionalFieldsMapValue instance
148 ConnectApi.AdditionalFieldsMapValue fieldMapValue = new ConnectApi.AdditionalFieldsMapValue();
149
150 // Set the additionalFieldsMapValue property
151 // This property accepts Object type which will be the Map containing instanceKey and fields
152 fieldMapValue.additionalFieldsMapValue = mapValue;
153
154 fieldsList.add(fieldMapValue);
155 }
156 }
157 }
158
159 return fieldsList;
160 }
161}
162
163/*
164 * USAGE EXAMPLE:
165 * Multi-Root Policy Endorsement with Additional Fields
166 */
167
168// Create instance of the callable class
169MultiRootPolicyEndorsement callable = new MultiRootPolicyEndorsement();
170
171// Prepare the input arguments with additional fields
172Map<String, Object> input = new Map<String, Object>();
173input.put('contextId', '0000000i18tq18g002917629263342460535451b25974898aae9a44aab48ef3c'); // REQUIRED - Replace with your context ID
174input.put('policyId', '0YTSM0000001MrJ4AU'); // REQUIRED - Replace with your policy ID
175input.put('policyName', 'James Multi-Root Policy');
176input.put('policyNumber', 'James Multi-Root Policy');
177input.put('referencePolicyNumber', 'James1234');
178input.put('effectiveDate', '2025-08-30'); // REQUIRED
179input.put('transactionName', 'Endorsed Policy Transaction');
180
181// Build additional fields for child policies
182// Structure matches the JSON payload exactly
183Map<String, Object> additionalFields = new Map<String, Object>();
184List<Object> additionalFieldsList = new List<Object>();
185
186// Child Policy 1: Auto Insurance
187Map<String, Object> autoPolicy = new Map<String, Object>();
188Map<String, Object> autoMapValue = new Map<String, Object>();
189autoMapValue.put('instanceKey', 'AutoSilver');
190Map<String, Object> autoFields = new Map<String, Object>();
191autoFields.put('PolicyName', 'James Auto Policy');
192autoFields.put('Name', 'James Auto Policy');
193autoMapValue.put('fields', autoFields);
194autoPolicy.put('additionalFieldsMapValue', autoMapValue);
195additionalFieldsList.add(autoPolicy);
196
197// Child Policy 2: Health Insurance
198Map<String, Object> healthPolicy = new Map<String, Object>();
199Map<String, Object> healthMapValue = new Map<String, Object>();
200healthMapValue.put('instanceKey', 'FamilyHealth');
201
202Map<String, Object> healthFields = new Map<String, Object>();
203healthFields.put('PolicyName', 'James Medical Policy');
204healthFields.put('Name', 'James Medical Policy');
205healthMapValue.put('fields', healthFields);
206healthPolicy.put('additionalFieldsMapValue', healthMapValue);
207additionalFieldsList.add(healthPolicy);
208
209additionalFields.put('additionalFieldsList', additionalFieldsList);
210input.put('additionalFields', additionalFields);
211
212// Prepare the output map
213Map<String, Object> output = new Map<String, Object>();
214
215// Prepare the args map
216Map<String, Object> args = new Map<String, Object>();
217args.put('input', input);
218args.put('output', output);
219
220// Call the 'multiRootEndorsePolicy' action
221Object result = callable.call('multiRootEndorsePolicy', args);
222
223// Check results
224System.debug('Job Identifier: ' + result);
225if (output.containsKey('error')) {
226 System.debug('ERROR: ' + output.get('error'));
227} else if (output.containsKey('endorsementResult')) {
228 System.debug('SUCCESS: Multi-root policy endorsement job started with ID: ' + output.get('jobIdentifier'));
229 System.debug('This job will endorse the input policy and apply the changes using the context, with additional fields on parent and child policies.');
230 System.debug('Monitor this job ID for completion status.');
231}