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.

Issue Multi-Root Insurance Policy Action

Create a new multi-root insurance policy along with its associated child policies asynchronously.

This action is available in API version 66.0 and later.

Supported REST HTTP Methods

URI
/services/data/v68.0/actions/standard/issueMultiRootInsurancePolicy
Formats
JSON, XML
HTTP Methods
POST
Authentication
Authorization: Bearertoken

Inputs

Input Details
issueMultiRootPolicyInputRep
Type

Apex-defined

Description
Required. An Apex ConnectApi.IssueMultiRootPolicyInputRep record that contains the details to create a new multi-root insurance policy along with its child policies. To calculate billing, specify billingRecord details if Career Billing is enabled in your org.

Outputs

Output Details
jobIdentifier
Type

string

Description
A unique system-generated ID for the asynchronous job that processes the issuance of a new multi-root insurance policy.

Example

POST

This sample request is for the Issue Multi-Root Insurance Policy action.

1{
2  "inputs": [
3    {
4      "issueMultiRootPolicyInputRep": {
5        "contextId": "c98a08a0a9725b7a7d42c35d02e49d80c77a5aae4ea687b0bf09a7997d2af3d3",
6        "insurancePolicy": {
7          "policyName": "Test Auto Ins policy Via REST",
8          "policyNumber": "PLC5678987",
9          "effectiveFromDate": "2024-01-01",
10          "effectiveToDate": "2024-12-31",
11          "referencePolicyNumber": "1011"
12        },
13        "transactionRecord": {
14          "name": "Sold Policy Transaction"
15        },
16        "billingRecord": {
17           "billDayOfMonth": 15,
18            "billToContact": "003xx000000001aEAA"
19        },
20        "additionalInput": [
21          {
22            "instanceKey": "AutoBundle2",
23            "additionalFieldsList": [
24              {
25                "key": "AssetDescription__c",
26                "value": "Test_AssetDescription__c"
27              },
28              {
29                "key": "SourceSystem",
30                "value": "Test_SourceSystem"
31              }
32            ]
33          },
34          {
35            "instanceKey": "AutoDriver",
36            "additionalFieldsList": [
37              {
38                "key": "ParticipantName",
39                "value": "Test_ParticipantName"
40              },
41              {
42                "key": "Participant_Hometown__c",
43                "value": "Test_Participant_Hometown__c"
44              }
45            ]
46          },
47          {
48            "instanceKey": "AutoRoot",
49            "additionalFieldsList": [
50              {
51                "key": "Primary_Policy_Holder__c",
52                "value": "Test_Primary_Policy_Holder__c"
53              },
54              {
55                "key": "PolicyDescription",
56                "value": "Test_PolicyDescription"
57              }
58            ]
59          },
60          {
61            "instanceKey": "AutoBundle2_AutoComp1",
62            "additionalFieldsList": [
63              {
64                "key": "Coverage_Description__c",
65                "value": "Test_Coverage_Description__c"
66              },
67              {
68                "key": "Description",
69                "value": "Test_Description"
70              }
71            ]
72          }
73        ]
74      }
75    }
76  ]
77}

This is a sample code to call the Issue Multi-Root Insurance Policy action from Apex.

1public with sharing class MultiRootPolicyIssuanceInvocable {
2    
3    /**
4     * Execute Multi-Root Policy Issuance with parameters map
5     * Usage: MultiRootPolicyIssuanceInvocable.executeMultiRootIssuance(paramsMap);
6     * 
7     * @param params Map of parameters:
8     *   - contextId (String, REQUIRED)
9     *   - policyName (String, optional)
10     *   - policyNumber (String, optional)
11     *   - referencePolicyNumber (String, optional)
12     *   - effectiveFromDate (String, optional)
13     *   - effectiveToDate (String, optional)
14     *   - transactionName (String, optional)
15     *   - additionalFields (Map<String, Map<String, String>>, optional)
16     */
17    public static void executeMultiRootIssuance(Map<String, Object> params) {
18        // Extract and validate contextId (REQUIRED)
19        String contextId = (String) params.get('contextId');
20        if (String.isBlank(contextId)) {
21            System.debug('ERROR: contextId is required');
22            return;
23        }
24        
25        // Multi-Root Issue Policy IA - Create the standard Invocable Action
26        Invocable.Action action = Invocable.Action.createStandardAction('issueMultiRootInsurancePolicy');
27        
28        // Instantiate the IA input object for Multi-Root Policy Issuance
29        // IMPORTANT: Use IssueMultiRootPolicyInputRep, NOT IssuePolicyIAInputRep
30        ConnectApi.IssueMultiRootPolicyInputRep policyInput = 
31            new ConnectApi.IssueMultiRootPolicyInputRep();
32        
33        // Set context ID (REQUIRED)
34        policyInput.contextId = contextId;
35        
36        // Extract optional parameters
37        String policyName = (String) params.get('policyName');
38        String policyNumber = (String) params.get('policyNumber');
39        String referencePolicyNumber = (String) params.get('referencePolicyNumber');
40        String effectiveFromDate = (String) params.get('effectiveFromDate');
41        String effectiveToDate = (String) params.get('effectiveToDate');
42        String transactionName = (String) params.get('transactionName');
43        Map<String, Map<String, String>> additionalFields = 
44            (Map<String, Map<String, String>>) params.get('additionalFields');
45        
46        // Populate Insurance Policy details (using IA classes) - all optional
47        if (!String.isBlank(policyName) || !String.isBlank(policyNumber) || 
48            !String.isBlank(referencePolicyNumber) || !String.isBlank(effectiveFromDate) || 
49            !String.isBlank(effectiveToDate)) {
50            
51            ConnectApi.InsPolicyIAInputRep insurancePolicy = 
52                new ConnectApi.InsPolicyIAInputRep();
53            
54            if (!String.isBlank(policyName)) {
55                insurancePolicy.policyName = policyName;
56            }
57            if (!String.isBlank(policyNumber)) {
58                insurancePolicy.policyNumber = policyNumber;
59            }
60            if (!String.isBlank(referencePolicyNumber)) {
61                insurancePolicy.referencePolicyNumber = referencePolicyNumber;
62            }
63            if (!String.isBlank(effectiveFromDate)) {
64                insurancePolicy.effectiveFromDate = effectiveFromDate;
65            }
66            if (!String.isBlank(effectiveToDate)) {
67                insurancePolicy.effectiveToDate = effectiveToDate;
68            }
69            
70            policyInput.insurancePolicy = insurancePolicy;
71        }
72        
73        // Populate Transaction record (using IA transaction representation) - optional
74        if (!String.isBlank(transactionName)) {
75            ConnectApi.InsPolicyTrxnIAInputRep transactionRecord = 
76                new ConnectApi.InsPolicyTrxnIAInputRep();
77            transactionRecord.name = transactionName;
78            policyInput.transactionRecord = transactionRecord;
79        }
80        
81        // Populate additional input for multi-root policies - optional
82        if (additionalFields != null && !additionalFields.isEmpty()) {
83            List<ConnectApi.InsPolicyAddlInputIARep> additionalInputList = new List<ConnectApi.InsPolicyAddlInputIARep>();
84            
85            for (String instanceKey : additionalFields.keySet()) {
86                ConnectApi.InsPolicyAddlInputIARep additionalInput = 
87                    new ConnectApi.InsPolicyAddlInputIARep();
88                
89                // Set instance key (e.g., "AutoSilver", "FamilyHealth")
90                additionalInput.instanceKey = instanceKey;
91                
92                // Build additional fields list for this instance
93                Map<String, String> fieldsMap = additionalFields.get(instanceKey);
94                if (fieldsMap != null && !fieldsMap.isEmpty()) {
95                    List<ConnectApi.AdditionalFieldIARep> fieldsList = new List<ConnectApi.AdditionalFieldIARep>();
96                    
97                    for (String fieldKey : fieldsMap.keySet()) {
98                        ConnectApi.AdditionalFieldIARep field = new ConnectApi.AdditionalFieldIARep();
99                        field.key = fieldKey;
100                        field.value = fieldsMap.get(fieldKey);
101                        fieldsList.add(field);
102                    }
103                    
104                    additionalInput.additionalFieldsList = fieldsList;
105                }
106                
107                additionalInputList.add(additionalInput);
108            }
109            
110            policyInput.additionalInput = additionalInputList;
111        }
112        
113        // Set invocation parameters
114        // IMPORTANT: Parameter name is issueMultiRootPolicyInputRep (camelCase)
115        action.setInvocationParameter('issueMultiRootPolicyInputRep', policyInput);
116        
117        System.debug('Starting Multi-Root Policy Issuance Invocable Action (issueMultiRootInsurancePolicy)...');
118        System.debug('Context ID: ' + contextId);
119        if (!String.isBlank(policyName)) {
120            System.debug('Policy Name: ' + policyName);
121        }
122        
123        try {
124            // Invoke the action
125            List<Invocable.Action.Result> results = action.invoke();
126            
127            System.debug('Multi-Root Policy Issuance IA result = ' + results);
128            
129            // Process results
130            for (Invocable.Action.Result result : results) {
131                if (result.isSuccess()) {
132                    System.debug('SUCCESS: Multi-Root Policy Issuance completed successfully!');
133                    Object outputValue = result.getOutputParameters().get('jobIdentifier');
134                    if (outputValue != null) {
135                        System.debug('Job Identifier: ' + outputValue);
136                    } else {
137                        System.debug('Multi-Root Policy Issuance job started - result: ' + result.getOutputParameters());
138                    }
139                } else {
140                    System.debug('ERROR: Multi-Root Policy Issuance failed');
141                    System.debug('Error Details: ' + result.getErrors());
142                }
143            }
144            
145        } catch (Exception e) {
146            System.debug('EXCEPTION in Multi-Root Policy Issuance Invocable Action: ' + e.getMessage());
147            System.debug('Stack Trace: ' + e.getStackTraceString());
148        }
149    }
150}
151
152
153/*
154 * USAGE EXAMPLE:
155 * Copy and paste this code into Developer Console Execute Anonymous Window
156 */
157Map<String, Object> params = new Map<String, Object>();
158params.put('contextId', <your-context-id-here>);
159params.put('policyName', 'James Multi-Root Policy');
160params.put('policyNumber', 'James Multi-Root Policy');
161params.put('referencePolicyNumber', 'James1234');
162params.put('effectiveFromDate', '2026-01-01');
163params.put('effectiveToDate', '2026-10-31');
164params.put('transactionName', 'Sold Policy Transaction');
165
166// Build additional fields configuration
167Map<String, Map<String, String>> additionalFields = new Map<String, Map<String, String>>();
168
169// Configuration for AutoSilver instance
170Map<String, String> autoFields = new Map<String, String>();
171autoFields.put('PolicyName', 'James Auto Policy');
172autoFields.put('Name', 'James Auto Policy');
173additionalFields.put(<your-instanceKey-goes-here>, autoFields);
174
175// Configuration for FamilyHealth instance
176Map<String, String> healthFields = new Map<String, String>();
177healthFields.put('PolicyName', 'James Medical Policy');
178healthFields.put('Name', 'James Medical Policy');
179additionalFields.put(<your-instanceKey-goes-here>, healthFields);
180
181params.put('additionalFields', additionalFields);
182
183MultiRootPolicyIssuanceInvocable.executeMultiRootIssuance(params);

This sample response is for the Issue Multi-Root Insurance Policy action.

1[
2  {
3    "actionName": "issueMultiRootInsurancePolicy",
4    "errors": null,
5    "invocationId": null,
6    "isSuccess": true,
7    "outcome": null,
8    "outputValues": {
9      "jobIdentifier": "55SG000000PgSH4A0"
10    },
11    "sortOrder": -1,
12    "version": 1
13  }
14]