Overview
Underwriting is an important process for insurance. Normally, it can be further categorized into two scenarios:
- Auto Underwriting
It is triggered by pre-defined auto underwriting rules.
At the platform level, we offer auto underwriting APIs based on rule configuration as well as several APIs to record and fetch auto underwriting history.
- Manual Underwriting
It requires manual processes and information updates.
At the platform level, we provide several APIs to record and fetch manual underwriting decisions and history.
Rule Configuration
What I Can Extend
- Configure and add new underwriting rules via rule configuration.
- Underwriting rules can specify the underwriting level and provide underwriting messages.
Please map the target rules to the rule groups, and the groups to events. The default event is UnderwritingRuleCheck for both new business and endorsement and user doesn’t need to specify it. If user want to extend, user can create a new event and pass the event code as the request parameter.
Configuration Rule and Message
For example, consider the cases of AutoTest_Preset_Rule_003 and AutoTest_Preset_Rule_004 :
- AutoTest_Preset_Rule_003
if(CustomerName.val =="AutoTest"){
// return uwResultWithUwLevel("MO-PA-Validation-B3103","U1", ["AutoTest","UWResult"] as Object[])
return uwResultWithUwLevel("MO-PA-UW-BPRESETUWCODE001","U1")
}
- AutoTest_Preset_Rule_004
if(RiskName.val =="AutoTest"){
return uwResult("MO-PA-UW-BPRESETUWCODE002",[RiskName.val,DateOfBirth.val] as Object[]).addProperty("Test001", "The Uw added Property")
}
The message content for this rule requires variables. The message code is set with parameters as shown below:
For more details on how to configure rules, see Rule Configuration Guide.
Key API
Automatically
API Path
- {{server}}/proposal/core/proposal/v1/autoUnderwriting
- {{server}}/endo/core/endo/v1/autoUnderwritingEx
Field Description
A related data table of AutoUwResultCode is AutoUnderwritingResult.
- 1 Pass
- 2 Not Pass
Manually
API Path
- {{server}}/proposal/core/proposal/v1/underwritingDecision
- {{server}}/endo/core/endo/v1/underwritingDecision
Field Description
Proposal Underwriting Decision Request Body
{
"@type":"ManualUnderwriting-ManualUnderwriting",
"PolicyId": "{{PolicyId}}",
"CurrentUwUserStaffCode": "888888",
"UwStatus": "3",
"UwTime": "{{NowDate}}",
"UwDecisionType": "1",
"UwNote": "No Comment",
"UwRemark": "No Comment",
"CurrentUwLevelCode": "1",
"ToUwUserStaffCode": "1",
"CurUwOrgCode": "1",
"UwLevelCode": "1",
"StartUserType": "2",
"StartUserStaffCode": "2",
"StartTime": "{{NowDate}}",
"CompleteTime": "{{NowDate}}"
}Endo Underwriting Decision Request Body
{
"DecisionInfo": {
"CurrentUwUserStaffCode": "888888",
"UwStatus": "3",
"UwTime": "{{NowDate}}",
"UwDecisionType": "1",
"UwNote": "No Comment",
"UwRemark": "No Comment",
"CurrentUwLevelCode": "1",
"ToUwUserStaffCode": "1",
"CurUwOrgCode": "1",
"UwLevelCode": "1",
"StartUserType": "2",
"StartUserStaffCode": "2",
"StartTime": "{{NowDate}}",
"CompleteTime": "{{NowDate}}"
},
"@type":"ManualUnderwriting-ManualUnderwriting",
"PolicyId": {{PolicyId}},
"EndoId": {{EndoId}}
}A related data table of UwStatus is UnderwritingStatus.
- 3 Underwriting pass
- 6 Underwriting fail
A related data table of UwDecisionType is ManualUnderwritingResult.
- 1 Underwriting pass
- 2 Send to higher level
- 3 Send back for modification
- 4 Decline for issuance
A related data table of CurUwLevelCode and MaxUwLevelCode is UnderwritingLevel. You can define the level as required.
Underwriting History APIs
The platform also provides APIs to directly manage underwriting history records. These APIs give you fine-grained control over auto/manual underwriting records and their approval tracks.
API List
| # | Method | Path | Description |
|---|---|---|---|
| 1 | POST | /proposal/underwriting/auto/save | Save or update an auto underwriting record. Use this to persist the auto UW result (pass/fail, triggered rules, UW level) for audit or downstream processing. |
| 2 | POST | /proposal/underwriting/manual/save | Create or update a manual underwriting record. First call creates the record (returns ManualUwId), subsequent calls with the same ManualUwId update it. This API supersedes /manual/update — you can use save alone for both create and update. |
| 3 | POST | /proposal/underwriting/manual/save/track?manualUwId={id} | Append an approval track to a manual underwriting record. Each call represents one approval step (approve, escalate, reject) in the multi-level underwriting chain. |
| 4 | POST | /proposal/underwriting/manual/update | (Legacy) Update an existing manual underwriting record. Retained for backward compatibility — prefer using /manual/save which handles both create and update. |
| 5 | POST | /proposal/v1/underwriting/queryByPage | Query underwriting history by proposal number with pagination. Used for UW list pages, audit trails, and checking the overall UW status of a proposal. |
Save Auto Underwriting Record
POST /proposal/underwriting/auto/save
Saves an auto underwriting result. Typically the auto underwriting check API (/proposal/core/proposal/v1/autoUnderwriting) saves the record automatically. Use this API when you need to create a record manually.
{
"PolicyId": "{{PolicyId}}",
"ProcessType": "NB",
"UwResultCode": "1",
"UwLevelCode": "U1",
"UwTime": "{{NowDateTime}}"
}| Field | Description |
|---|---|
| PolicyId | Proposal ID (signed format, obtained from upstream steps) |
| ProcessType | Process type: NB (New Business), ENDO (Endorsement) |
| UwResultCode | UW result: 1 = Rule triggered, 2 = No rule triggered |
| UwLevelCode | Underwriting level |
| UwTime | Underwriting time |
Response returns the generated AutoUwId.
Save Manual Underwriting Record
POST /proposal/underwriting/manual/save
Creates a manual underwriting record when auto underwriting does not pass and human review is required.
{
"PolicyId": "{{PolicyId}}",
"AutoUwId": "{{AutoUwId}}",
"ProcessType": "NB",
"UwStatus": "1",
"UwLevelCode": "U1",
"MaxUwLevelCode": "U3",
"CurrentUwLevelCode": "U1",
"CurUwOrgCode": "ORG001",
"CurrentUwUserStaffCode": "Staff001",
"ToUwUserStaffCode": "Staff002",
"StartUserStaffCode": "Staff001",
"StartUserType": "1",
"StartTime": "{{NowDateTime}}",
"UwNote": "Initiate manual underwriting",
"UwType": "1"
}| Field | Description |
|---|---|
| PolicyId | Proposal ID (signed format) |
| AutoUwId | Associated auto underwriting record ID |
| ProcessType | Process type: NB (New Business), ENDO (Endorsement) |
| UwStatus | Underwriting status |
| UwLevelCode / MaxUwLevelCode | Current UW level / Maximum UW level |
| CurrentUwLevelCode | Current approver’s UW level |
| CurUwOrgCode | Current underwriter’s organization code |
| CurrentUwUserStaffCode | Current underwriter staff code |
| ToUwUserStaffCode | Next-level underwriter staff code |
| StartUserStaffCode | Staff code of the user who initiated the UW process |
| StartUserType | Type of the user who initiated the UW process |
| StartTime | Underwriting start time |
| UwNote | Underwriting comments |
| UwType | Underwriting type |
Response returns the generated ManualUwId.
Save Manual Underwriting Track
POST /proposal/underwriting/manual/save/track?manualUwId={ManualUwId}
Records each approval step in the manual underwriting process. Call this API each time an underwriter makes a decision (approve, escalate, reject, etc.). The manualUwId query parameter is required and links the track to its parent manual underwriting record.
{
"PolicyId": "{{PolicyId}}",
"CurUwOrgCode": "ORG001",
"CurrentUwLevelCode": "U1",
"CurrentUserMaxUwLevelCode": "U3",
"CurrentUwUserStaffCode": "Staff001",
"ToUwUserStaffCode": "Staff002",
"UwConclusionCode": "1",
"UwDecisionType": "1",
"UwNote": "Approved by UW Level 1",
"UwRemark": "Risk acceptable",
"UwStatus": "1",
"UwTime": "{{NowDateTime}}"
}| Field | Description |
|---|---|
| PolicyId | Proposal ID (signed format) |
| CurUwOrgCode | Current approver’s organization code |
| CurrentUwLevelCode | Current approver’s UW level |
| CurrentUserMaxUwLevelCode | Current approver’s maximum UW level |
| CurrentUwUserStaffCode | Current approver staff code |
| ToUwUserStaffCode | Next approver staff code |
| UwConclusionCode | Underwriting conclusion |
| UwDecisionType | Approval decision (approve, reject, escalate, etc.) |
| UwNote | Approval comments |
| UwRemark | Approval remarks |
| UwStatus | Approval status |
| UwTime | Approval time |
Response returns the generated TrackerId.
Update Manual Underwriting Record
POST /proposal/underwriting/manual/update
Updates the overall status of a manual underwriting record. Use this when the manual underwriting process is completed (all approvals done or final rejection).
{
"ManualUwId": "{{ManualUwId}}",
"PolicyId": "{{PolicyId}}",
"AutoUwId": "{{AutoUwId}}",
"ProcessType": "NB",
"UwStatus": "2",
"UwConclusionCode": "1",
"UwDecisionType": "1",
"UwLevelCode": "U2",
"MaxUwLevelCode": "U3",
"CurrentUwLevelCode": "U2",
"CurUwOrgCode": "ORG001",
"CurrentUwUserStaffCode": "Staff002",
"StartUserStaffCode": "Staff001",
"StartUserType": "1",
"StartTime": "{{NowDateTime}}",
"CompleteTime": "{{NowDateTime}}",
"UwNote": "Manual UW approved at final level",
"UwRemark": "All checks passed",
"UwType": "1"
}| Field | Description |
|---|---|
| ManualUwId | Manual underwriting record ID |
| PolicyId | Proposal ID (signed format) |
| AutoUwId | Associated auto underwriting record ID |
| ProcessType | Process type: NB (New Business), ENDO (Endorsement) |
| UwStatus | Updated underwriting status |
| UwConclusionCode | Underwriting conclusion |
| UwDecisionType | Final approval decision |
| UwLevelCode / MaxUwLevelCode / CurrentUwLevelCode | UW level / Maximum UW level / Current approver’s UW level |
| CurUwOrgCode | Current underwriter’s organization code |
| CurrentUwUserStaffCode | Current underwriter staff code |
| StartUserStaffCode | Staff code of the user who initiated the UW process |
| StartUserType | Type of the user who initiated the UW process |
| StartTime | Underwriting start time |
| CompleteTime | Underwriting completion time |
| UwNote / UwRemark | Underwriting comments / remarks |
| UwType | Underwriting type |
Query Underwriting by Page
POST /proposal/v1/underwriting/queryByPage
Queries underwriting history records by proposal number with pagination support.
{
"ProposalNo": "{{ProposalNo}}",
"PolicyNo": "",
"EndoNo": "",
"PageIndex": 1,
"PageSize": 10
}Typical Scenario for Bypassing the Underwriting Rule
After a rule is manually passed by an underwriter during the underwriting process, it should not be prompted for review again in later stages unless the determining factors are changed.
Here are the steps to illustrate this scenario:
-
Step 1: Call the underwriting API (generate autouwid 1) with rule parameter A.
Expected: The underwriting rule prompt in the response. -
Step 2: Call the underwriting API (generate autouwid 2) with rule parameter A.
Expected: The underwriting rule prompt in the response. -
Step 3: Load the auto underwriting message.
-
Step 4: Update the latest underwriting message for manual underwriting pass based on autouwid.
-
Step 5: Update the manual underwriting result.
-
Step 6: Call the underwriting API with rule parameter A.
Expected: The underwriting rule should NOT prompt in the response. -
Step 7: Call the underwriting API with rule parameter B.
Expected: The underwriting rule should prompt in the response again.
Sample underwriting rule configured with parameters
Take the rule AutoTest_Preset_Rule_004 in the tenant as an example.
if(RiskName.val =="AutoTest"){
return uwResult("MO-PA-UW-BPRESETUWCODE002",[RiskName.val,DateOfBirth.val] as Object[]).addProperty("Test001", "The Uw added Property")
}
API List
- {{server}}/proposal/core/proposal/v1/createEx
- {{server}}/proposal/core/proposal/v1/calculate
- {{server}}/proposal/core/proposal/v1/updateEx
- {{server}}/proposal/core/proposal/v1/autoUnderWriting?eventCode={{eventCode}}
- {{server}}/proposal/core/proposal/v1/autoUnderWriting?eventCode={{eventCode}}
- {{server}}/pa/autoUnderWriting/v1/auto/loadListByPolicyId?policyId={{policyId}}
- {{server}}/proposal/core/proposal/v1/autoUnderWritingDecision
- {{server}}/pa/autoUnderWriting/v1/auto/updateAutoUnderwriting
- {{server}}/proposal/core/proposal/v1/load?policyId={{policyId}}
- {{server}}/proposal/core/proposal/v1/updateEx
- {{server}}/proposal/core/proposal/v1/autoUnderWriting?eventCode={{eventCode}}
- {{server}}/pa/autoUnderWriting/v1/auto/loadListByPolicyId?policyId={{policyId}}
Step 1: Call the underwriting API (generate autouwid 1) with rule parameter A.
-
API -{{server}}/proposal/core/proposal/v1/autoUnderWriting?eventCode={{eventCode}}
-
Sample Request
{
"AdjustedPremium": 5.58,
"AnnualPremium": 630,
"BeforeVatPremium": 5.17,
"BusinessCateCode": "1",
"BusinessObjectId": 3517051304219,
"Commission": 0.52,
"CommissionRate": 0.1,
"DuePremium": 5.58,
"EffectiveDate": "2022-04-22",
"ExpiryDate": "2022-04-24T23:59:59",
"FirstDataEntryDate": "2024-02-04T10:53:48",
"GrossPremium": 5.58,
"IsPremiumCalcSuccess": "Y",
"IsRenewable": "Y",
"IsTakeUpPolicy": "N",
"OrgCode": "-1",
"POIRate": 1,
"PolicyElementId": 894429002,
"PolicyId": 894429002,
"PolicyLobList": [
{
"AdjustedPremium": 5.58,
"BeforeVatPremium": 5.17,
"BusinessObjectId": 351861068,
"DuePremium": 5.58,
"GrossPremium": 5.58,
"ParentElementType": "POLICY",
"ParentPolicyElementId": 894429002,
"PolicyElementId": 894429006,
"PolicyId": 894429002,
"PolicyRiskList": [
{
"AdjustedPremium": 5.58,
"Age": 33,
"BeforeVatPremium": 5.17,
"BusinessObjectId": 351861075,
"CustomerName": "Customer",
"DateOfBirth": "1988-10-01",
"DetachedProductId": 351925022,
"DuePremium": 5.58,
"GenderCode": "F",
"GrossPremium": 5.58,
"IdNo": "IdNo",
"IdType": "1",
"ParentElementType": "POLICY_LOB",
"ParentPolicyElementId": 894429006,
"PolicyCoverageList": [
{
"AdjustedPremium": 5.32,
"AnnualPremium": 600,
"BeforeVatPremium": 4.93,
"BusinessObjectId": 351861078,
"CoverageName": "Accident Death & Dismemberment",
"DuePremium": 5.32,
"GrossPremium": 5.32,
"IsFinalLevelCt": "Y",
"ParentElementType": "INSURED",
"ParentPolicyElementId": 894429008,
"PolicyElementId": 894429010,
"PolicyId": 894429002,
"PolicyStatus": 2,
"ProductElementCode": "C100416",
"ProductElementId": 351926024,
"SequenceNumber": 1,
"SumInsured": 300000,
"Vat": 0.39
},
{
"AdjustedPremium": 0.09,
"AnnualPremium": 10,
"BeforeVatPremium": 0.08,
"BusinessObjectId": 351861078,
"CoverageName": "Baggage Delay",
"DuePremium": 0.09,
"GrossPremium": 0.09,
"IsFinalLevelCt": "Y",
"ParentElementType": "INSURED",
"ParentPolicyElementId": 894429008,
"PolicyElementId": 894429011,
"PolicyId": 894429002,
"PolicyStatus": 2,
"ProductElementCode": "C100692",
"ProductElementId": 351926030,
"SequenceNumber": 2,
"SumInsured": 300000,
"Vat": 0.01
},
{
"AdjustedPremium": 0.17,
"AnnualPremium": 20,
"BeforeVatPremium": 0.16,
"BusinessObjectId": 351861078,
"CoverageName": "Travel Delay",
"DuePremium": 0.17,
"GrossPremium": 0.17,
"IsFinalLevelCt": "Y",
"ParentElementType": "INSURED",
"ParentPolicyElementId": 894429008,
"PolicyElementId": 894429012,
"PolicyId": 894429002,
"PolicyStatus": 2,
"ProductElementCode": "C100715",
"ProductElementId": 351926027,
"SequenceNumber": 3,
"SumInsured": 300000,
"Vat": 0.01
}
],
"PolicyElementId": 894429008,
"PolicyId": 894429002,
"PolicyStatus": 2,
"ProductElementCode": "R10007",
"ProductElementId": 351926021,
"RiskName": "AutoTest",
"SequenceNumber": 1,
"SumInsured": 900000,
"TempData": {},
"Vat": 0.41
}
],
"PolicyStatus": 2,
"ProductCode": "TBTI",
"ProductElementCode": "TBTI",
"ProductElementId": 351925023,
"ProductId": 351925022,
"ProductLobId": 351925023,
"SequenceNumber": 1,
"SumInsured": 900000,
"TechProductCode": "TR_POC",
"TechProductId": 3516410623456,
"TotalInsuredCount": 1,
"Vat": 0.41
}
],
"PolicyStatus": 1,
"PolicyType": "1",
"PremCalcFactorHash": "20240204_105355_201,VS6XeIghdqeYZ2ub6a+giP4wC5sShjpdZzCXn2pRPC4=",
"PremCalcResultHash": "20240204_105355_204,y9A9Niy0kjI8l/XlbJKNAGRRNH31KS6wREeZx/T26Hc=",
"ProductCode": "TBTI",
"ProductId": 351925022,
"ProductVersion": "1.0",
"ProposalDate": "2022-04-22",
"ProposalNo": "PABTBTI0000001788",
"ProposalStatus": "1",
"SchemaVersion": 2,
"SumInsured": 900000,
"TechProductCode": "TR_POC",
"TechProductId": 3516410623456,
"Vat": 0.41,
"VatRate": 0.08,
"VersionSeq": 2
}- Sample Response with underwriting rule result
{
"MessageList": [
{
"Code": "MO-PA-UW-BPRESETUWCODE001",
"Message": "Preset UW Code 001",
"RuleName": "AutoTest_Preset_Rule_003",
"UwLevelCode": "U1"
},
{
"Code": "MO-PA-UW-BPRESETUWCODE002",
"Message": "Preset UW Code 002 with param1-AutoTest and param2-1988-10-01T00:00.",
"Params": [
"AutoTest",
"1988-10-01"
],
"RuleName": "AutoTest_Preset_Rule_004",
"Test001": "The Uw added Property"
}
],
"Model": {
"AdjustedPremium": 5.58,
"AnnualPremium": 630,
"AutoUwResultCode": "2",
"BeforeVatPremium": 5.17,
"BusinessCateCode": "1",
"BusinessObjectId": 3517051304219,
"Commission": 0.52,
"CommissionRate": 0.1,
"DuePremium": 5.58,
"EffectiveDate": "2022-04-22",
"ExpiryDate": "2022-04-24T23:59:59",
"FirstDataEntryDate": "2024-02-04T10:53:48",
"GrossPremium": 5.58,
"IsPremiumCalcSuccess": "Y",
"IsRenewable": "Y",
"IsTakeUpPolicy": "N",
"MaxUwLevelCode": "0",
"OrgCode": "-1",
"POIRate": 1,
"PolicyElementId": 894429002,
"PolicyId": 894429002,
"PolicyLobList": [
{
"AdjustedPremium": 5.58,
"BeforeVatPremium": 5.17,
"BusinessObjectId": 351861068,
"DuePremium": 5.58,
"GrossPremium": 5.58,
"ParentElementType": "POLICY",
"ParentPolicyElementId": 894429002,
"PolicyElementId": 894429006,
"PolicyId": 894429002,
"PolicyRiskList": [
{
"AdjustedPremium": 5.58,
"Age": 33,
"BeforeVatPremium": 5.17,
"BusinessObjectId": 351861075,
"CustomerName": "Customer",
"DateOfBirth": "1988-10-01",
"DetachedProductId": 351925022,
"DuePremium": 5.58,
"GenderCode": "F",
"GrossPremium": 5.58,
"IdNo": "IdNo",
"IdType": "1",
"ParentElementType": "POLICY_LOB",
"ParentPolicyElementId": 894429006,
"PolicyCoverageList": [
{
"AdjustedPremium": 5.32,
"AnnualPremium": 600,
"BeforeVatPremium": 4.93,
"BusinessObjectId": 351861078,
"CoverageName": "Accident Death & Dismemberment",
"DuePremium": 5.32,
"GrossPremium": 5.32,
"IsFinalLevelCt": "Y",
"ParentElementType": "INSURED",
"ParentPolicyElementId": 894429008,
"PolicyElementId": 894429010,
"PolicyId": 894429002,
"PolicyStatus": 2,
"ProductElementCode": "C100416",
"ProductElementId": 351926024,
"SequenceNumber": 1,
"SumInsured": 300000,
"Vat": 0.39
},
{
"AdjustedPremium": 0.09,
"AnnualPremium": 10,
"BeforeVatPremium": 0.08,
"BusinessObjectId": 351861078,
"CoverageName": "Baggage Delay",
"DuePremium": 0.09,
"GrossPremium": 0.09,
"IsFinalLevelCt": "Y",
"ParentElementType": "INSURED",
"ParentPolicyElementId": 894429008,
"PolicyElementId": 894429011,
"PolicyId": 894429002,
"PolicyStatus": 2,
"ProductElementCode": "C100692",
"ProductElementId": 351926030,
"SequenceNumber": 2,
"SumInsured": 300000,
"Vat": 0.01
},
{
"AdjustedPremium": 0.17,
"AnnualPremium": 20,
"BeforeVatPremium": 0.16,
"BusinessObjectId": 351861078,
"CoverageName": "Travel Delay",
"DuePremium": 0.17,
"GrossPremium": 0.17,
"IsFinalLevelCt": "Y",
"ParentElementType": "INSURED",
"ParentPolicyElementId": 894429008,
"PolicyElementId": 894429012,
"PolicyId": 894429002,
"PolicyStatus": 2,
"ProductElementCode": "C100715",
"ProductElementId": 351926027,
"SequenceNumber": 3,
"SumInsured": 300000,
"Vat": 0.01
}
],
"PolicyElementId": 894429008,
"PolicyId": 894429002,
"PolicyStatus": 2,
"ProductElementCode": "R10007",
"ProductElementId": 351926021,
"RiskName": "AutoTest",
"SequenceNumber": 1,
"SumInsured": 900000,
"TempData": {},
"Vat": 0.41
}
],
"PolicyStatus": 2,
"ProductCode": "TBTI",
"ProductElementCode": "TBTI",
"ProductElementId": 351925023,
"ProductId": 351925022,
"ProductLobId": 351925023,
"SequenceNumber": 1,
"SumInsured": 900000,
"TechProductCode": "TR_POC",
"TechProductId": 3516410623456,
"TotalInsuredCount": 1,
"Vat": 0.41
}
],
"PolicyStatus": 1,
"PolicyType": "1",
"PremCalcFactorHash": "20240204_105355_201,VS6XeIghdqeYZ2ub6a+giP4wC5sShjpdZzCXn2pRPC4=",
"PremCalcResultHash": "20240204_105355_204,y9A9Niy0kjI8l/XlbJKNAGRRNH31KS6wREeZx/T26Hc=",
"ProductCode": "TBTI",
"ProductId": 351925022,
"ProductVersion": "1.0",
"ProposalDate": "2022-04-22",
"ProposalNo": "PABTBTI0000001788",
"ProposalStatus": "1",
"SchemaVersion": 2,
"SumInsured": 900000,
"TechProductCode": "TR_POC",
"TechProductId": 3516410623456,
"Vat": 0.41,
"VatRate": 0.08,
"VersionSeq": 3
},
"Status": "Fail"
}Step 2: Call the underwriting API (generate autouwid 2) with rule parameter A.
-
API -{{server}}/proposal/core/proposal/v1/autoUnderWriting?eventCode={{eventCode}}
-
Sample Request
Response of the load API.-
Sample Response with underwriting rule result.
-
Params are the RiskName and DateOfBirth in rule.
-
Test001 is the addProperty in rule.
{
"MessageList": [
{
"Code": "MO-PA-UW-BPRESETUWCODE001",
"Message": "Preset UW Code 001",
"RuleName": "AutoTest_Preset_Rule_003",
"UwLevelCode": "U1"
},
{
"Code": "MO-PA-UW-BPRESETUWCODE002",
"Message": "Preset UW Code 002 with param1-AutoTest and param2-1988-10-01T00:00.",
"Params": [
"AutoTest",
"1988-10-01"
],
"RuleName": "AutoTest_Preset_Rule_004",
"Test001": "The Uw added Property"
}
],
"Model": {
"AdjustedPremium": 5.58,
"AnnualPremium": 630,
"AutoUwResultCode": "2",
"BeforeVatPremium": 5.17,
"BusinessCateCode": "1",
"BusinessObjectId": 3517051304219,
"Commission": 0.52,
"CommissionRate": 0.1,
"DuePremium": 5.58,
"EffectiveDate": "2022-04-22",
"ExpiryDate": "2022-04-24T23:59:59",
"FirstDataEntryDate": "2024-02-04T10:53:48",
"GrossPremium": 5.58,
"IsPremiumCalcSuccess": "Y",
"IsRenewable": "Y",
"IsTakeUpPolicy": "N",
"MaxUwLevelCode": "0",
"OrgCode": "-1",
"POIRate": 1,
"PolicyElementId": 894429002,
"PolicyId": 894429002,
"PolicyLobList": [
{
"AdjustedPremium": 5.58,
"BeforeVatPremium": 5.17,
"BusinessObjectId": 351861068,
"DuePremium": 5.58,
"GrossPremium": 5.58,
"ParentElementType": "POLICY",
"ParentPolicyElementId": 894429002,
"PolicyElementId": 894429006,
"PolicyId": 894429002,
"PolicyRiskList": [
{
"AdjustedPremium": 5.58,
"Age": 33,
"BeforeVatPremium": 5.17,
"BusinessObjectId": 351861075,
"CustomerName": "Customer",
"DateOfBirth": "1988-10-01",
"DetachedProductId": 351925022,
"DuePremium": 5.58,
"GenderCode": "F",
"GrossPremium": 5.58,
"IdNo": "IdNo",
"IdType": "1",
"ParentElementType": "POLICY_LOB",
"ParentPolicyElementId": 894429006,
"PolicyCoverageList": [
{
"AdjustedPremium": 5.32,
"AnnualPremium": 600,
"BeforeVatPremium": 4.93,
"BusinessObjectId": 351861078,
"CoverageName": "Accident Death & Dismemberment",
"DuePremium": 5.32,
"GrossPremium": 5.32,
"IsFinalLevelCt": "Y",
"ParentElementType": "INSURED",
"ParentPolicyElementId": 894429008,
"PolicyElementId": 894429010,
"PolicyId": 894429002,
"PolicyStatus": 2,
"ProductElementCode": "C100416",
"ProductElementId": 351926024,
"SequenceNumber": 1,
"SumInsured": 300000,
"Vat": 0.39
},
{
"AdjustedPremium": 0.09,
"AnnualPremium": 10,
"BeforeVatPremium": 0.08,
"BusinessObjectId": 351861078,
"CoverageName": "Baggage Delay",
"DuePremium": 0.09,
"GrossPremium": 0.09,
"IsFinalLevelCt": "Y",
"ParentElementType": "INSURED",
"ParentPolicyElementId": 894429008,
"PolicyElementId": 894429011,
"PolicyId": 894429002,
"PolicyStatus": 2,
"ProductElementCode": "C100692",
"ProductElementId": 351926030,
"SequenceNumber": 2,
"SumInsured": 300000,
"Vat": 0.01
},
{
"AdjustedPremium": 0.17,
"AnnualPremium": 20,
"BeforeVatPremium": 0.16,
"BusinessObjectId": 351861078,
"CoverageName": "Travel Delay",
"DuePremium": 0.17,
"GrossPremium": 0.17,
"IsFinalLevelCt": "Y",
"ParentElementType": "INSURED",
"ParentPolicyElementId": 894429008,
"PolicyElementId": 894429012,
"PolicyId": 894429002,
"PolicyStatus": 2,
"ProductElementCode": "C100715",
"ProductElementId": 351926027,
"SequenceNumber": 3,
"SumInsured": 300000,
"Vat": 0.01
}
],
"PolicyElementId": 894429008,
"PolicyId": 894429002,
"PolicyStatus": 2,
"ProductElementCode": "R10007",
"ProductElementId": 351926021,
"RiskName": "AutoTest",
"SequenceNumber": 1,
"SumInsured": 900000,
"TempData": {},
"Vat": 0.41
}
],
"PolicyStatus": 2,
"ProductCode": "TBTI",
"ProductElementCode": "TBTI",
"ProductElementId": 351925023,
"ProductId": 351925022,
"ProductLobId": 351925023,
"SequenceNumber": 1,
"SumInsured": 900000,
"TechProductCode": "TR_POC",
"TechProductId": 3516410623456,
"TotalInsuredCount": 1,
"Vat": 0.41
}
],
"PolicyStatus": 1,
"PolicyType": "1",
"PremCalcFactorHash": "20240204_105355_201,VS6XeIghdqeYZ2ub6a+giP4wC5sShjpdZzCXn2pRPC4=",
"PremCalcResultHash": "20240204_105355_204,y9A9Niy0kjI8l/XlbJKNAGRRNH31KS6wREeZx/T26Hc=",
"ProductCode": "TBTI",
"ProductId": 351925022,
"ProductVersion": "1.0",
"ProposalDate": "2022-04-22",
"ProposalNo": "PABTBTI0000001788",
"ProposalStatus": "1",
"SchemaVersion": 2,
"SumInsured": 900000,
"TechProductCode": "TR_POC",
"TechProductId": 3516410623456,
"Vat": 0.41,
"VatRate": 0.08,
"VersionSeq": 4
},
"Status": "Fail"
}Step 3: Load the auto underwriting message.
-
GET API -{{server}}/pa/autoUnderWriting/v1/auto/loadListByPolicyId?policyId={{policyId}}
-
Sample Request
none -
Sample Response with 2 underwriting rule result history
[
{
"AutoUwId": 894429017,
"PolicyId": 894429002,
"ProcessType": "1",
"UnderwritingMessageList": [
{
"MessageCode": "MO-PA-UW-BPRESETUWCODE001",
"MessageDetail": "Preset UW Code 001",
"PolicyId": 894429002,
"RuleName": "AutoTest_Preset_Rule_003",
"UwLevelCode": "U1",
"UwRuleMessageId": 894429018
},
{
"MessageCode": "MO-PA-UW-BPRESETUWCODE002",
"MessageDetail": "Preset UW Code 002 with param1-AutoTest and param2-1988-10-01T00:00.",
"MessageParams": "[\"AutoTest\",\"1988-10-01T00:00\"]",
"PolicyId": 894429002,
"RuleName": "AutoTest_Preset_Rule_004",
"Test001": "The Uw added Property",
"UwRuleMessageId": 894429019
}
],
"UwLevelCode": "U1",
"UwResultCode": "1",
"UwTime": "2024-02-04T10:57:28"
},
{
"AutoUwId": 894429021,
"PolicyId": 894429002,
"ProcessType": "1",
"UnderwritingMessageList": [
{
"MessageCode": "MO-PA-UW-BPRESETUWCODE001",
"MessageDetail": "Preset UW Code 001",
"PolicyId": 894429002,
"RuleName": "AutoTest_Preset_Rule_003",
"UwLevelCode": "U1",
"UwRuleMessageId": 894429022
},
{
"MessageCode": "MO-PA-UW-BPRESETUWCODE002",
"MessageDetail": "Preset UW Code 002 with param1-AutoTest and param2-1988-10-01T00:00.",
"MessageParams": "[\"AutoTest\",\"1988-10-01T00:00\"]",
"PolicyId": 894429002,
"RuleName": "AutoTest_Preset_Rule_004",
"Test001": "The Uw added Property",
"UwRuleMessageId": 894429023
}
],
"UwLevelCode": "U1",
"UwResultCode": "1",
"UwTime": "2024-02-04T11:09:43"
}
]Step 4: Update the latest underwriting message for manual underwriting pass based on autouwid.
-
API -{{server}}/pa/autoUnderWriting/v1/auto/updateAutoUnderwriting
-
Sample Request
Update the IsManualUwPass of MO-PA-UW-BPRESETUWCODE002 to be Y. Then it will be ignored if the MessageParams are not changed.
{
"AutoUwId": 894429021, // gotten from load response
"PolicyId": 894429002,
"ProcessType": "1",
"UnderwritingMessageList": [
{
"MessageCode": "MO-PA-UW-BPRESETUWCODE001",
"MessageDetail": "Preset UW Code 001",
"PolicyId": 894429002,
"RuleName": "AutoTest_Preset_Rule_003",
"UwLevelCode": "U1",
"UwRuleMessageId": 894429022
},
{
"MessageCode": "MO-PA-UW-BPRESETUWCODE002",
"MessageDetail": "Preset UW Code 002 with param1-AutoTest and param2-1988-10-01T00:00.",
"MessageParams": "[\"AutoTest\",\"1988-10-01T00:00\"]",
"PolicyId": 894429002,
"RuleName": "AutoTest_Preset_Rule_004",
"Test001": "The Uw added Property",
"UwRuleMessageId": 894429023,
"IsManualUwPass":"Y",
"ManualUwPassDate":"2024-03-27T15:16:23",
"ManualUwPassStaffCode":"ManualUwPassStaffCode"
}
],
"UwLevelCode": "U1",
"UwResultCode": "1",
"UwTime": "2024-02-04T11:09:43"
}- Sample Response with underwriting rule history updated with manual success
{
"AutoUwId": 894429021,
"PolicyId": 894429002,
"ProcessType": "1",
"UnderwritingMessageList": [
{
"MessageCode": "MO-PA-UW-BPRESETUWCODE001",
"MessageDetail": "Preset UW Code 001",
"PolicyId": 894429002,
"RuleName": "AutoTest_Preset_Rule_003",
"UwLevelCode": "U1",
"UwRuleMessageId": 894429022
},
{
"IsManualUwPass": "Y",
"ManualUwPassDate":"2024-03-27T15:16:23",,
"ManualUwPassStaffCode":"ManualUwPassStaffCode",
"MessageCode": "MO-PA-UW-BPRESETUWCODE002",
"MessageDetail": "Preset UW Code 002 with param1-AutoTest and param2-1988-10-01T00:00.",
"MessageParams": "[\"AutoTest\",\"1988-10-01T00:00\"]",
"PolicyId": 894429002,
"RuleName": "AutoTest_Preset_Rule_004",
"Test001": "The Uw added Property",
"UwRuleMessageId": 894429023
}
],
"UwLevelCode": "U1",
"UwResultCode": "1",
"UwTime": "2024-02-04T11:09:43"
}Step 5: Update the manual underwriting result.
-
API -{{server}}/proposal/core/proposal/v1/autoUnderWritingDecision
-
Sample Request
{
"PolicyId": "{{policyId}}",
"AutoUwId": {{autoUwId}},
"CurrentUwUserStaffCode": "12367", //Input
"UwStatus": "1", //refer to codetable-UWSTATUS
"UwTime": "{{NowDate}}",
"UwDecisionType": "1", //refer to codetable-UWDECISION
"UwNote": "1",
"UwRemark": "1",
"CurrentUwLevelCode": "1", //Input
"ToUwUserStaffCode": "1", //Input
"CurUwOrgCode": "1", //Input
"UwLevelCode": "9", //refer to codetable-UWLevel
"StartUserType": "2",
"StartUserStaffCode": "2",
"StartTime": "2024-01-01T09:00:00",
"CompleteTime": "2024-01-01T09:00:00"
}- Sample Response with manual underwriting history updated
{
"ManualUwResult": [
{
"@pk": 894428032,
"@type": "ManualUnderwriting-ManualUnderwriting",
"BusinessObjectId": 370103671,
"AutoUwId": 894429021,
"CompleteTime": "2024-01-01T09:00:00",
"CurrentUwLevelCode": "1",
"CurrentUwUserStaffCode": "12367",
"ManualUnderwritingTrackList": [
{
"@pk": 894428033,
"@type": "ManualUnderwritingTrack-ManualUnderwritingTrack",
"BusinessObjectId": 370103227,
"CurUwOrgCode": "1",
"CurrentUwLevelCode": "1",
"CurrentUwUserStaffCode": "12367",
"PolicyId": 894429002,
"ToUwUserStaffCode": "1",
"TrackerId": 894428033,
"UwDecisionType": "1",
"UwNote": "1",
"UwRemark": "1",
"UwStatus": "1",
"UwTime": "2024-02-04"
}
],
"ManualUwId": 894428032,
"PolicyId": 894429002,
"StartTime": "2024-01-01T09:00:00",
"StartUserStaffCode": "2",
"StartUserType": "2",
"ToUwUserStaffCode": "1",
"UwDecisionType": "1",
"UwLevelCode": "9",
"UwNote": "1",
"UwRemark": "1",
"UwStatus": "1"
}
]
}Step 6: Call the underwriting API with rule parameter A.
-
API -{{server}}/proposal/core/proposal/v1/autoUnderWriting?eventCode={{eventCode}}
-
Sample Request
Response of load- Sample Response without underwriting rule result
The message code MO-PA-UW-BPRESETUWCODE002 is not triggered as it has been set to be ignored, and the parameters (DOB and RiskName) remain unchanged.
{
"MessageList": [
{
"Code": "MO-PA-UW-BPRESETUWCODE001",
"Message": "Preset UW Code 001",
"RuleName": "AutoTest_Preset_Rule_003",
"UwLevelCode": "U1"
}
],
"Model": {
"AdjustedPremium": 5.58,
"AnnualPremium": 630,
"AutoUwResultCode": "2",
"BeforeVatPremium": 5.17,
"BusinessCateCode": "1",
"BusinessObjectId": 3517051304219,
"Commission": 0.52,
"CommissionRate": 0.1,
"DuePremium": 5.58,
"EffectiveDate": "2022-04-22",
"ExpiryDate": "2022-04-24T23:59:59",
"FirstDataEntryDate": "2024-02-04T10:53:48",
"GrossPremium": 5.58,
"IsPremiumCalcSuccess": "Y",
"IsRenewable": "Y",
"IsTakeUpPolicy": "N",
"MaxUwLevelCode": "0",
"OrgCode": "-1",
"POIRate": 1,
"PolicyElementId": 894429002,
"PolicyId": 894429002,
"PolicyLobList": [
{
"AdjustedPremium": 5.58,
"BeforeVatPremium": 5.17,
"BusinessObjectId": 351861068,
"DuePremium": 5.58,
"GrossPremium": 5.58,
"ParentElementType": "POLICY",
"ParentPolicyElementId": 894429002,
"PolicyElementId": 894429006,
"PolicyId": 894429002,
"PolicyRiskList": [
{
"AdjustedPremium": 5.58,
"Age": 33,
"BeforeVatPremium": 5.17,
"BusinessObjectId": 351861075,
"CustomerName": "Customer",
"DateOfBirth": "1998-10-01",
"DetachedProductId": 351925022,
"DuePremium": 5.58,
"GenderCode": "F",
"GrossPremium": 5.58,
"IdNo": "IdNo",
"IdType": "1",
"ParentElementType": "POLICY_LOB",
"ParentPolicyElementId": 894429006,
"PolicyCoverageList": [
............................
],
"PolicyElementId": 894429008,
"PolicyId": 894429002,
"PolicyStatus": 2,
"ProductElementCode": "R10007",
"ProductElementId": 351926021,
"RiskName": "AutoTest",
"SequenceNumber": 1,
"SumInsured": 900000,
"TempData": {},
"Vat": 0.41
}
],
"PolicyStatus": 2,
"ProductCode": "TBTI",
"ProductElementCode": "TBTI",
"ProductElementId": 351925023,
"ProductId": 351925022,
"ProductLobId": 351925023,
"SequenceNumber": 1,
"SumInsured": 900000,
"TechProductCode": "TR_POC",
"TechProductId": 3516410623456,
"TotalInsuredCount": 1,
"Vat": 0.41
}
],
"PolicyStatus": 1,
"PolicyType": "1",
"PremCalcFactorHash": "20240204_105355_201,VS6XeIghdqeYZ2ub6a+giP4wC5sShjpdZzCXn2pRPC4=",
"PremCalcResultHash": "20240204_105355_204,y9A9Niy0kjI8l/XlbJKNAGRRNH31KS6wREeZx/T26Hc=",
"ProductCode": "TBTI",
"ProductId": 351925022,
"ProductVersion": "1.0",
"ProposalDate": "2022-04-22",
"ProposalNo": "PABTBTI0000001788",
"ProposalStatus": "1",
"SchemaVersion": 2,
"SumInsured": 900000,
"TechProductCode": "TR_POC",
"TechProductId": 3516410623456,
"Vat": 0.41,
"VatRate": 0.08,
"VersionSeq": 7
},
"Status": "Fail"
}Step 7: Call the underwriting API with rule parameter B.
-
API -{{server}}/proposal/core/proposal/v1/autoUnderWriting?eventCode={{eventCode}}
-
Sample Request
Respsonse of save API
- Sample Response with underwriting rule result again
{
"MessageList": [
{
"Code": "MO-PA-UW-BPRESETUWCODE001",
"Message": "Preset UW Code 001",
"RuleName": "AutoTest_Preset_Rule_003",
"UwLevelCode": "U1"
},
{
"Code": "MO-PA-UW-BPRESETUWCODE002",
"Message": "Preset UW Code 002 with param1-AutoTest and param2-1998-10-01T00:00.",
"Params": [
"AutoTest",
"1998-10-01"
],
"RuleName": "AutoTest_Preset_Rule_004",
"Test001": "The Uw added Property"
}
],
"Model": {
"AdjustedPremium": 5.58,
"AnnualPremium": 630,
"AutoUwResultCode": "2",
"BeforeVatPremium": 5.17,
"BusinessCateCode": "1",
"BusinessObjectId": 3517051304219,
"Commission": 0.52,
"CommissionRate": 0.1,
"DuePremium": 5.58,
"EffectiveDate": "2022-04-22",
"ExpiryDate": "2022-04-24T23:59:59",
"FirstDataEntryDate": "2024-02-04T10:53:48",
"GrossPremium": 5.58,
"IsPremiumCalcSuccess": "Y",
"IsRenewable": "Y",
"IsTakeUpPolicy": "N",
"MaxUwLevelCode": "0",
"OrgCode": "-1",
"POIRate": 1,
"PolicyElementId": 894429002,
"PolicyId": 894429002,
"PolicyLobList": [
{
"AdjustedPremium": 5.58,
"BeforeVatPremium": 5.17,
"BusinessObjectId": 351861068,
"DuePremium": 5.58,
"GrossPremium": 5.58,
"ParentElementType": "POLICY",
"ParentPolicyElementId": 894429002,
"PolicyElementId": 894429006,
"PolicyId": 894429002,
"PolicyRiskList": [
{
"AdjustedPremium": 5.58,
"Age": 33,
"BeforeVatPremium": 5.17,
"BusinessObjectId": 351861075,
"CustomerName": "Customer",
"DateOfBirth": "1998-10-01",
"DetachedProductId": 351925022,
"DuePremium": 5.58,
"GenderCode": "F",
"GrossPremium": 5.58,
"IdNo": "IdNo",
"IdType": "1",
"ParentElementType": "POLICY_LOB",
"ParentPolicyElementId": 894429006,
"PolicyCoverageList": [
........
],
"PolicyElementId": 894429008,
"PolicyId": 894429002,
"PolicyStatus": 2,
"ProductElementCode": "R10007",
"ProductElementId": 351926021,
"RiskName": "AutoTest",
"SequenceNumber": 1,
"SumInsured": 900000,
"TempData": {},
"Vat": 0.41
}
],
"PolicyStatus": 2,
"ProductCode": "TBTI",
"ProductElementCode": "TBTI",
"ProductElementId": 351925023,
"ProductId": 351925022,
"ProductLobId": 351925023,
"SequenceNumber": 1,
"SumInsured": 900000,
"TechProductCode": "TR_POC",
"TechProductId": 3516410623456,
"TotalInsuredCount": 1,
"Vat": 0.41
}
],
"PolicyStatus": 1,
"PolicyType": "1",
"PremCalcFactorHash": "20240204_105355_201,VS6XeIghdqeYZ2ub6a+giP4wC5sShjpdZzCXn2pRPC4=",
"PremCalcResultHash": "20240204_105355_204,y9A9Niy0kjI8l/XlbJKNAGRRNH31KS6wREeZx/T26Hc=",
"ProductCode": "TBTI",
"ProductId": 351925022,
"ProductVersion": "1.0",
"ProposalDate": "2022-04-22",
"ProposalNo": "PABTBTI0000001788",
"ProposalStatus": "1",
"SchemaVersion": 2,
"SumInsured": 900000,
"TechProductCode": "TR_POC",
"TechProductId": 3516410623456,
"Vat": 0.41,
"VatRate": 0.08,
"VersionSeq": 6
},
"Status": "Fail"
}Step 8: Load manual underwriting result.
-
API -GET {{server}}/pa/autoUnderWriting/v1/manual/loadListByPolicyId?policyId={{policyId}}
-
Sample Request
NA
- Sample Response with underwriting rule result again
[
{
"CompleteTime": "2024-01-01T09:00:00",
"CurrentUwLevelCode": "1",
"CurrentUwUserStaffCode": "12367",
"ManualUnderwritingTrackList": [
{
"CurUwOrgCode": "1",
"CurrentUwLevelCode": "1",
"CurrentUwUserStaffCode": "12367",
"PolicyId": "24273212899,1C3DB7F4C406EC619400A5912A4296BD",
"ToUwUserStaffCode": "1",
"TrackerId": 24273232804,
"UwDecisionType": "1",
"UwNote": "1",
"UwRemark": "1",
"UwStatus": "1",
"UwTime": "2024-03-12"
}
],
"ManualUwId": 24273232803,
"PolicyId": "24273212899,1C3DB7F4C406EC619400A5912A4296BD",
"StartTime": "2024-01-01T09:00:00",
"StartUserStaffCode": "2",
"StartUserType": "2",
"ToUwUserStaffCode": "1",
"UwDecisionType": "1",
"UwLevelCode": "9",
"UwNote": "1",
"UwRemark": "1",
"UwStatus": "1"
}
]FAQ
Auto Underwriting API - Unable to Determine Pass/Fail Result
When using the /proposal/core/proposal/v1/autoUnderwriting API for underwriting rule validation, clients are unable to correctly determine the underwriting result (Pass/Fail) from the response fields.
- AutoUnderwritingResult.UwResultCode value does not match the actual underwriting result
- Policy.AutoUwResultCode field was not returned when underwriting failed
Solution (Version 26.01)
Added Policy.AutoUwResultCode return field at Policy level for business logic determination. For now, we regard the following return data as correct. Result Determination Logic:
| Scenario | AutoUnderwritingResult.UwResultCode | Policy.AutoUwResultCode |
|---|---|---|
| No underwriting triggered | 2 | 1 |
| Underwriting triggered | 1 | 2 |
API Example:
POST /api/platform/proposal/core/proposal/v1/autoUnderwriting
No underwriting triggered
{
"@type": "Policy-POLICY",
"AdjustedPremium": 24.16,
"AutoUnderwritingResult": {
"@type": "AutoUnderwriting-AutoUnderwriting",
"BusinessObjectId": 370103370,
"ProcessType": "1",
"UwResultCode": "2",
"UwTime": "2026-05-15T16:17:35"
},
"AutoUwResultCode": "1",
"BeforeVatPremium": 24.16,
"BusinessCateCode": "1",
...
}Underwriting triggered
{
"AutoUnderwritingResult": {
"@type": "AutoUnderwriting-AutoUnderwriting",
"BusinessObjectId": 370103370,
"ProcessType": "1",
"UnderwritingMessageList": [
{
"@type": "AutoUnderwritingMessage-AutoUnderwritingMessage",
"BusinessObjectId": 370103607,
"MessageCode": "the sum insured of C101392-War is300000, then the uwLevel is 2. ",
"MessageDetail": "the sum insured of C101392-War is300000, then the uwLevel is 2. ",
"RuleName": "UWLevel-Coverage"
}
],
"UwResultCode": "1",
"UwTime": "2026-05-15T16:24:08"
},
"AutoUwResultCode": "2",
...
}Version 26.02
(To be updated: New version will include enhanced result determination logic, coming soon)
Questions regarding why POI Move must be the first endorsement?
-
Is only Effective Date change not supported ? If we provide below example dates, then platform error is triggered (…VelaEndoDataValidateService.checkPolicyEffectiveDateNotChangedForNonPOIMoveEndorsement(VelaEndoDataValidateService.java)
"EndoEffectiveDate": "2026-06-17T00:00:00","EndoType": "20","NewPolEffDate": "2026-06-17","OldPolEffDate": "2026-06-15","NewPolExpDate": "2026-06-30","OldPolExpDate": "2026-06-30","EndoSubType": "202", -
If user changes any other policy Info along with POI change, what kind of error outcomes may trigger ?
-
If POI change is not 1st Endorsement and previous endo is non-financial one, what kind of fallout scenarios are not supported by platform ? Is this constraint planned to be removed in upcoming releases ?
-
Before this release, POI change was possible via BIE with tenant level handling and few platform level constraints (for e.g, Endo Eff Date has to be within old POI), why that was completely barred now and result into platform error if user attempts so ?
Here are the detailed responses to your four questions.
The POI effective date is the core benchmark for all policy data, and all endorsements are generated based on it. To put it simply: the effective date is the foundation, and endorsements are buildings built on top of this foundation.
- Adjust the foundation first, then construct the building: This is safe, as all subsequent changes are based on a valid benchmark.
- Construct the building first, then adjust the foundation: All existing data has to be rebuilt, which will easily lead to various exceptions.
This is why the platform mandates that POI Move must be the first endorsement, to avoid cascading issues caused by altering the core benchmark.
A1: The system does not support modifying only the policy effective date. For this scenario, we recommend performing the changes in two steps: first adjust the effective date via a POI Move endorsement, then revise the policy expiry date via a POI Shorten endorsement.
A2: I have not conducted dedicated tests for this scenario. Below is an explanation based on the system logic: Each type of endorsement retrieves the latest policy data as the benchmark before applying business changes. Different endorsements have independent rules for reading historical data and linkage processing. Combining multiple changes will disrupt the execution sequence. If POI and other policy information are updated within a single transaction, the following issues will arise:
- The system uses the old POI data as the unified processing benchmark.
- Other changes such as adding new risks or coverages are written based on the old benchmark.
- The POI date is updated simultaneously.
- As a result, the date references in newly added business data remain linked to the old POI, which is inconsistent with the actual policy status. This is a logical analysis. There may also dedicated validations at the API level.
A3: The platform requires POI changes to be processed as the first endorsement, and there is no plan to remove this constraint. This restriction applies regardless of the type of prior endorsements. It is designed to prevent problems arising from rebuilding historical endorsement data after the core benchmark is changed. Here is an example:
- Original policy effective date: August 1
- A non-financial endorsement (e.g. address change) is processed first. All data snapshots and validation rules are generated based on the original effective date.
- A POI Move is then performed to change the effective date to July 1, altering the core benchmark of the policy. This will trigger a series of problems:
- Changing the benchmark date after other endorsements will disrupt the criteria for daily pro-rata calculation, retroactivity and data rollback. Even if the policy term and premium amount remain the same, existing data will become invalid, and the system has to recalculate and rebuild all relevant data to guarantee data integrity. Previously approved validations may fail when re-run. When POI Move is processed as the first endorsement, all subsequent operations, snapshots and validation rules are generated against the new effective date. The overall logic stays consistent, and no extra data reconstruction is needed.
- Outdated snapshots will cause data inconsistencies in downstream systems like claims and billing.
A4: This constraint is implemented to protect tenants from incorrect data caused by operational errors.
- The policy effective date is a critical anchor for all data. Any changes to it will impact the version chain, premium pricing, system snapshots and all related modules.
- The previous approach has resulted in a large amount of inconsistent data over time.
- Please use dedicated endorsements for different business scenarios. These dedicated endorsements have built-in independent logic for reading historical data and linkage processing to ensure data accuracy.