Insurance Services
General Insurance Services
Policy API for Specific Scenarios
Underwriting
Sidebar On this page

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.
tip

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

uw_rule

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")
}
uw_rule_UWLevel
  • 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")
}
uw_rule_params

The message content for this rule requires variables. The message code is set with parameters as shown below:

uw_rule_params_messagecode uw_rule_tracking

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

#MethodPathDescription
1POST/proposal/underwriting/auto/saveSave 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.
2POST/proposal/underwriting/manual/saveCreate 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.
3POST/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.
4POST/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.
5POST/proposal/v1/underwriting/queryByPageQuery 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}}"
}
FieldDescription
PolicyIdProposal ID (signed format, obtained from upstream steps)
ProcessTypeProcess type: NB (New Business), ENDO (Endorsement)
UwResultCodeUW result: 1 = Rule triggered, 2 = No rule triggered
UwLevelCodeUnderwriting level
UwTimeUnderwriting 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"
}
FieldDescription
PolicyIdProposal ID (signed format)
AutoUwIdAssociated auto underwriting record ID
ProcessTypeProcess type: NB (New Business), ENDO (Endorsement)
UwStatusUnderwriting status
UwLevelCode / MaxUwLevelCodeCurrent UW level / Maximum UW level
CurrentUwLevelCodeCurrent approver’s UW level
CurUwOrgCodeCurrent underwriter’s organization code
CurrentUwUserStaffCodeCurrent underwriter staff code
ToUwUserStaffCodeNext-level underwriter staff code
StartUserStaffCodeStaff code of the user who initiated the UW process
StartUserTypeType of the user who initiated the UW process
StartTimeUnderwriting start time
UwNoteUnderwriting comments
UwTypeUnderwriting 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}}"
}
FieldDescription
PolicyIdProposal ID (signed format)
CurUwOrgCodeCurrent approver’s organization code
CurrentUwLevelCodeCurrent approver’s UW level
CurrentUserMaxUwLevelCodeCurrent approver’s maximum UW level
CurrentUwUserStaffCodeCurrent approver staff code
ToUwUserStaffCodeNext approver staff code
UwConclusionCodeUnderwriting conclusion
UwDecisionTypeApproval decision (approve, reject, escalate, etc.)
UwNoteApproval comments
UwRemarkApproval remarks
UwStatusApproval status
UwTimeApproval 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"
}
FieldDescription
ManualUwIdManual underwriting record ID
PolicyIdProposal ID (signed format)
AutoUwIdAssociated auto underwriting record ID
ProcessTypeProcess type: NB (New Business), ENDO (Endorsement)
UwStatusUpdated underwriting status
UwConclusionCodeUnderwriting conclusion
UwDecisionTypeFinal approval decision
UwLevelCode / MaxUwLevelCode / CurrentUwLevelCodeUW level / Maximum UW level / Current approver’s UW level
CurUwOrgCodeCurrent underwriter’s organization code
CurrentUwUserStaffCodeCurrent underwriter staff code
StartUserStaffCodeStaff code of the user who initiated the UW process
StartUserTypeType of the user who initiated the UW process
StartTimeUnderwriting start time
CompleteTimeUnderwriting completion time
UwNote / UwRemarkUnderwriting comments / remarks
UwTypeUnderwriting 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")
}
uw rule with params

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:

ScenarioAutoUnderwritingResult.UwResultCodePolicy.AutoUwResultCode
No underwriting triggered21
Underwriting triggered12

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?

  1. 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",
  2. If user changes any other policy Info along with POI change, what kind of error outcomes may trigger ?

  3. 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 ?

  4. 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:

  1. The system uses the old POI data as the unified processing benchmark.
  2. Other changes such as adding new risks or coverages are written based on the old benchmark.
  3. The POI date is updated simultaneously.
  4. 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:

  1. Original policy effective date: August 1
  2. 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.
  3. 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.

  1. 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.
  2. The previous approach has resulted in a large amount of inconsistent data over time.
  3. 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.

Feedback
Was this page helpful?
|
Provide feedback