Skip to main content
Version: 4.0.3

Rule business object and data model

Business object

The rule file written in the Drools language uses a business object that contains all input and processed data values required for adjudication and decision-making. You can find this object in the message_wrapper column in Control Tower output for every request.

See sample business object in JSON
{
"message": {
"id": "5384557",
"type": "PAYMENT_TRANSFER",
"subtype": null,
"content": null,
"contentFormat": null,
"payment": null,
"customAttributes": null
},
"hits": [
{
"hit": {
"id": "687139127",
"tagContent": "rubber meets the road Mueller-Bode customer journey",
"tagName": null,
"tagType": "FREETEXT",
"hitType": null,
"hitStartIndex": null,
"hitEndIndex": null,
"hitText": null,
"paymentInput": {
"id": null,
"type": null,
"subType": null,
"name": null,
"dob": null,
"address": null,
"locations": null,
"country": "",
"city": null,
"state": null,
"zip": null,
"codeMap": null
},
"derived": {
"id": null,
"idSource": null,
"name": "rubber meets the road",
"nameConfirmed": null,
"nameScore": 0.9959743469953537,
"nameSource": "NER",
"country": null,
"countryConfirmed": null,
"countrySource": null,
"address": null,
"addressConfirmed": null,
"addressSource": null,
"addressScore": 0.0,
"zip": null,
"zipConfirmed": null,
"zipSource": null,
"type": "NONENTITY",
"subType": null,
"typeConfirmed": null,
"typeSource": "NER"
}
},
"wle": {
"id": null,
"name": "RUBBER AB Science S.A. ",
"primaryName": "RUBBER AB Science S.A. ",
"aliases": [],
"address": "",
"locations": [],
"country": "PT",
"city": null,
"state": null,
"zip": null,
"type": "ORGANIZATION",
"dob": "",
"listType": "WORLD_COMPLIANCE",
"source": "SANCTIONS",
"sourceEntryId": null,
"sourceKeywords": null,
"codeMap": null,
"customAttributes": null
},
"idMatch": {
"match": null,
"input": "",
"inputProcessed": null,
"wle": "",
"wleProcessed": null,
"source": null
},
"typeMatch": {
"inputType": "NONENTITY",
"wleType": "ORGANIZATION",
"inputTypeConfidenceScore": 0.9959743469953537,
"match": false,
"input": "rubber meets the road",
"inputProcessed": null,
"wle": "RUBBER AB Science S.A. ",
"wleProcessed": null,
"source": "NER"
},
"nameMatch": {
"score": 0.4643,
"blackListed": false,
"blackListedWordStr": "",
"blacklistedSource": "NONE",
"nameMatcherSource": "wf-name-matcher",
"matchedWLEEntity": "WLE_NAME",
"inputHasLegalEnding": false,
"wleHasLegalEnding": true,
"legalEndingsAreDifferent": false,
"match": false,
"input": "rubber meets the road",
"inputProcessed": "rubber meets road",
"wle": "RUBBER AB Science S.A. ",
"wleProcessed": "rubber ab science",
"source": "NER"
},
"countryMatch": {
"blackListed": false,
"blackListedStr": "",
"blacklistedSource": "NONE",
"match": null,
"input": "",
"inputProcessed": "",
"wle": "PT",
"wleProcessed": "PT",
"source": "NER"
},
"addressMatch": {
"matcherSource": "STRING",
"comparisonOutput": null,
"score": 0.0,
"match": false,
"input": null,
"inputProcessed": null,
"wle": null,
"wleProcessed": null,
"source": null
},
"dobMatch": {
"match": null,
"input": "",
"inputProcessed": null,
"wle": "",
"wleProcessed": null,
"source": null
}
}
]
}

Each section of the JSON is represented in the Drools file as factors or global objects and is used to formulate rules.

Data model for rule context

The following data model is available during rule evaluation.

Message

PaymentMessage message

Sample:

"message": {
"id": "35166_resolve",
"type": "PAYMENT_TRANSFER",
"subtype": null,
"content": null,
"contentFormat": null,
"payment": null,
"customAttributes": null
}

Object definition:

public class PaymentMessage {
private String id;
private MessageType type;
private String subtype;
private String content;
private ContentFormat contentFormat;
private PaymentInfo payment;
private Map<String, String> customAttributes;
}
FieldTypeAlways expectedPossible values
idStringYesMessage ID
typeEnumNo
  • SWF
  • PAYMENT_TRANSFER
  • ISO_20022
subtypeStringNo103
contentStringNoOriginal payment message or null
contentFormatEnumNo
  • FUF
  • NATIVE
  • SWIFT_MT
  • SWIFT_MX
  • SWIFT_NPP
  • SWIFT_ADK
paymentObjectNoCan be null
payment.directionEnumNo
  • INCOMING
  • OUTGOING
payment.senderObjectNoCan be null
payment.sender.nameStringNoSender name
payment.sender.type EntityType ObjectNo
  • INDIVIDUAL
  • ORGANIZATION
  • NAME
payment.sender.bicStringNoBIC ID
payment.sender.accountNumberStringNoSender's account
payment.sender.otherIdentificationsMap<String, String>NoMap of other sender's ID (type or value)
payment.sender.addressStringNoSender's address
payment.sender.countryStringNoSender's country
payment.receiverObjectNoCan be null
payment.receiver.nameStringNoReceiver's name
payment.receiver.typeEntityType ObjectNo
  • INDIVIDUAL
  • ORGANIZATION
  • NAME
payment.receiver.bicStringNoBIC ID
payment.receiver.accountNumberStringNoReceiver's account
payment.receiver.otherIdentificationsMap<String, String>NoMap of other receiver's ID (type or value)
payment.receiver.addressStringNoReceiver's address
payment.receiver.countryStringNoReceiver's country
payment.amountDoubleNoFor example, 200.25
payment.currencyStringNoFor example, USD
customAttributesMap<String, String>NoCustom values that can be used in rules

Hit wrapper

A hit wrapper collects all hit information in one object:

public class HitWrapper {
private PaymentMessageHit hit;
private PaymentWatchListEntity wle;
private IdMatch idMatch;
private TypeMatch typeMatch;
private NameMatch nameMatch;
private CountryMatch countryMatch;
private AddressMatch addressMatch;
private DOBMatch dobMatch;
private SecurityLookupData securityLookupData;
}

Hit

A hit is a complex object that contains:

  • General hit information

  • Input information: screened entity data

  • Derived information: data received from Named Entity Recognition (NER) and LOOKUP

PaymentMessageHit hit

Sample:

"hit": {
"id": "123",
"tagContent": "/SE1350000000054910000011 \nWXYZSESS",
"tagName": "50A",
"tagType": "FREETEXT",
"hitText": "Key",
"hitStartIndex": null,
"hitEndIndex": null,
"paymentInput": {
"type": null,
"subType": null,
"name": null,
"dob": "01/01/2020",
"address": null,
"country": "Sweden",
"city": null,
"state": null,
"zip": null,
"codeMap": {
"IBAN": "SE1350000000054910000011",
"BIC": "WXYZSESS"
}
},
"derived": {
"id": "WXYZSESS",
"idSource": "NER",
"name": "Joe Doors",
"nameConfirmed": null,
"nameScore": null,
"nameSource": "LOOKUP",
"country": null,
"countryConfirmed": null,
"countrySource": null,
"address": null,
"addressConfirmed": null,
"addressSource": null,
"zip": null,
"zipConfirmed": null,
"zipSource": null,
"type": "ID",
"subType": "BIC",
"typeConfirmed": null,
"typeScore": null,
"typeSource": null
}
}

Object definition:

public class PaymentMessageHit {
private String id;
private String tagContent;
private String tagName;
private TagType tagType;
private String hitType;
private Integer hitStartIndex;
private Integer hitEndIndex;
private String hitText;
private PaymentInputEntity paymentInput;
private PaymentDerivedData derived;
}
FieldTypeAlways expectedPossible values
idStringYesUnique hit ID
tagContentStringYesTag value
tagNameStringNoTag name
tagTypeEnumYes
  • NAME
  • NAMEADDRESS
  • ADDRESS
  • FREETEXT
hitTextStringNoCan be null
hitStartIndexIntegerNoNot used
hitEndIndexIntegerNoNot used

Payment input object

A payment input object refers to screened input data (can be null).

FieldTypeAlways expectedPossible values
paymentInput.idStringNoContains an ID value if the hit was on an ID.
paymentInput.typeEnumNo
  • INDIVIDUAL
  • ORGANIZATION
  • COUNTRY
  • LOCATION
  • VESSEL
  • AIRCRAFT
  • ID
  • NAME
paymentInput.subType of IDEnumNo
  • UUID
  • IBAN
  • BIC
  • ISIN
  • OTHER
paymentInput.nameStringNoScreened name
paymentInput.dobStringNoScreened date of birth
paymentInput.addressStringNoScreened address
paymentInput.countryStringNoScreened country
paymentInput.cityStringNoScreened city
paymentInput.stateStringNoScreened state
paymentInput.zipStringNoScreened postal code
paymentInput.codeMapMap<String, String>NoMap of collected IDs
paymentInput.locationsObjectNoAdditional set of location data; can be null
paymentInput.locations.addressStringNoAddress
paymentInput.locations.countryStringNoCountry
paymentInput.locations.cityStringNoCity
paymentInput.locations.stateStringNoState
paymentInput.locations.typeStringNoA free formatted value, for example, residence or business

Derived object

A derived object refers to data collected after processing.

FieldTypeAlways expectedPossible values
derived.idStringNoNER-detected value
derived.idSourceEnumNo
  • NER
  • LOOKUP
  • SCREENED
derived.nameStringNoNER-detected value
derived.nameConfirmedStringNoAlways false
derived.nameScoreDoubleNoNER score for the name detected in free text
derived.nameSourceEnumNo
  • NER
  • LOOKUP
  • SCREENED
derived.countryStringNoCan come from parsing ID or lookup
derived.countryConfirmedStringNoSet to true if lookup can confirm the country
derived.countrySourceEnumNo
  • NER
  • LOOKUP
  • SCREENED
derived.addressStringNoNER-detected value
derived.addressConfirmedStringNoSet to true if lookup can confirm the address
derived.addressSourceEnumNo
  • NER
  • LOOKUP
  • SCREENED
derived.zipStringNoNot used
derived.zipConfirmedStringNoAlways false
derived.zipSourceEnumNoNot used
derived.typeEnumYes
  • INDIVIDUAL
  • ORGANIZATION
  • COUNTRY
  • LOCATION
  • VESSEL
  • AIRCRAFT
  • ID
  • NAME
  • NONENTITY
  • ACCOUNT
derived.subTypeStringNo
  • UUID
  • IBAN
  • BIC
  • ISIN
  • OTHER
derived.typeConfirmedStringNoAlways false
derived.typeScoreDoubleYesNER score for the detected type
derived.typeSourceEnumYes
  • NER
  • LOOKUP
  • SCREENED

WLE

A watchlist entity (WLE) refers to the sanctioned entity information.

PaymentWatchListEntity wle

Sample:

 "wle": {
"id": null,
"name": "Sanction Name Investment LLC",
"primaryName": "CONSOLIDATED INVESTMENTS LLC",
"aliases": null,
"address": "6820 S. Harl Ave., Tempe, Ariz., 85283, U.S.",
"locations": null,
"country": "US",
"city": null,
"state": null,
"zip": null,
"type": "ORGANIZATION",
"dob": null,
"listType": null,
"source": null,
"sourceEntryId": "id_1",
"sourceKeywords": null,
"codeMap": null,
"customAttributes": null
},

Object definition:

public class PaymentWatchListEntity {
private String id;
private String name;
private String primaryName;
private List<AliasInfo> aliases;
private String address;
private List<Location> locations;
private String country;
private String city;
private String state;
private String zip;
private EntityType type;
private String dob;
private String listType;
private String source;
private String sourceEntryId;
private String sourceKeywords;
private Map<String, String> codeMap;
private Map<String, String> customAttributes;
}
FieldTypeAlways expectedPossible values
idStringYes
typeEntityType ObjectYes
  • INDIVIDUAL
  • ORGANIZATION
  • COUNTRY
  • LOCATION
  • VESSEL
  • AIRCRAFT
  • ID
  • NAME
  • NONENTITY
  • ACCOUNT
nameStringYesSanctioned name or location
aliasesAliasInfo ObjectNoAKA names
aliases.nameStringNoAlias name
aliases.typeEnumNo
  • STRONG
  • WEAK
  • NOT_AVAILABLE
addressStringNoWLE address
countryStringNoWLE country
cityStringNoWLE city
stateStringNoWLE state
zipStringNoWLE postal code
dobStringNoWLE date of birth
codeMapMap<String, String>NoWLE list of IDs
customAttributesMap<String, String>NoWLE list of custom values that can be used for adjudication
sourceStringNoWLE sanctioned source like OFAC
listTypeStringNoWLE listing type
sourceEntryIdStringNoWLE unique entry ID
sourceKeywordsStringNoWLE keywords
locationsList<Object>NoWLE additional list of location information; can be null
locations.addressStringNoAddress
locations.countryStringNoCountry
locations.cityStringNoCity
locations.stateStringNoState
locations.typeStringNoA free formatted value, for example, residence or business

Thresholds

You can define thresholds during the AI Agent configuration. They are also available in the model:

  • dateMatchingThreshold: integer value in days

  • nameMatchingThreshold: double value

Decision factors

idMatch

IdMatch idMatch

Sample:

"idMatch": {
"match": false,
"input": "WXYZSESS",
"wle": "",
"source": "NER",
"inputProcessed": null,
"wleProcessed": null
}

Object definition:

public class IdMatch {
private Boolean match;
private String input;
private String inputProcessed;
private String wle;
private String wleProcessed;
private SourceType source;
}
FieldTypeAlways expectedPossible values
matchBooleanNo
  • true
  • false
  • null
inputStringNoMatched screened value
wleStringNoMatched WLE value
inputProcessedStringNoProcessed screened value
wleProcessedStringNoProcessed WLE value
sourceSourceTypeNo
  • NER
  • LOOKUP
  • SCREENED

typeMatch

TypeMatch typeMatch

Sample:

"typeMatch": {
"match": false,
"input": "John Doe",
"wle": "Johnson LLC",
"source": "NER",
"inputProcessed": null,
"wleProcessed": null,
"inputType": "INDIVIDUAL",
"inputTypeConfidenceScore":0.9,
"wleType": "ORGANIZATION"
}

Object definition:

public class TypeMatch {
private Boolean match;
private String input;
private String inputProcessed;
private String wle;
private String wleProcessed;
private SourceType source;
private EntityType inputType;
private EntityType wleType;
private Double inputTypeConfidenceScore;
private List<EntityType> otherInputTypes
}
FieldTypeAlways expectedPossible values
matchBooleanYes
  • true
  • false
  • null
inputStringYesOriginal screened value
wleStringYesOriginal best matching WLE value
inputProcessedStringYesProcessed screened value
wleProcessedStringYesProcessed best matching WLE value
sourceSourceTypeYes
  • NER
  • LOOKUP
  • SCREENED
inputTypeEntityTypeYes
  • INDIVIDUAL
  • ORGANIZATION
  • COUNTRY
  • LOCATION
  • VESSEL
  • AIRCRAFT
  • ID
  • NAME
  • NONENTITY
  • ACCOUNT
inputTypeConfidenceScoreDoubleYesA value between 0 and 1 (probability) reflecting how confident the model is about the predicted type of the input entity
wleTypeEntityTypeYes
  • INDIVIDUAL
  • ORGANIZATION
  • COUNTRY
  • LOCATION
  • VESSEL
  • AIRCRAFT
  • ID
  • NAME
  • NONENTITY
  • ACCOUNT
otherInputTypesList of EntityTypeNoPossible additional input type: VESSEL (MARIA can be a person or a vessel name)

nameMatch

NameMatch nameMatch

Sample:

"nameMatch": {
"score": 0.5593499999999999,
"blackListed": false,
"blackListedWordStr": "",
"blacklistedSource": "NONE",
"nameMatcherSource": "wf-name-matcher",
"matchedWLEEntity": "PRIMARY_NAME",
"inputHasLegalEnding": true,
"wleHasLegalEnding": true,
"legalEndingsAreDifferent": true,
"match": false,
"input": "INVESTMENT HOLDINGS INC",
"inputProcessed": "investment holdings",
"wle": "CONSOLIDATED INVESTMENTS LLC",
"wleProcessed": "consolidated investments",
"source": "NER"
}

Object definition:

public class NameMatch {
private Boolean match;
private String input;
private String inputProcessed;
private String wle;
private String wleProcessed;
private SourceType source;
private Double score;
private Boolean blackListed;
private String blackListedWordStr;
private BlacklistedSource blacklistedSource;
private String nameMatcherSource;
private MatchedWLEEntity matchedWLEEntity;
private Boolean inputHasLegalEnding;
private Boolean wleHasLegalEnding;
private Boolean legalEndingsAreDifferent;
private Double screenedToWleNameScore;
private Double screenedToWleAliasScore;
private Double screenedToWlePrimaryNameScore;
private String processedWleName;
private String processedWlePrimaryName;
private String processedWleAlias;
}
FieldTypeAlways expectedPossible values
matchBooleanYes
  • true
  • false
  • null
inputStringYesScreened value
wleStringYesWLE value
scoreDoubleYesMatching score between 0 and 1
blacklistedBooleanNo
  • true
  • false if a blacklisted keyword is found
blackListedWordStrStringNoBlacklisted keyword value
blacklistedSourceBlacklistedSource EnumNo
  • ENTITY
  • CONTENT
  • COUNTRY
  • NONE
inputProcessedStringYesProcessed input name
wleProcessedStringYesProcessed WLE name
sourceSourceType EnumYes
  • NER
  • LOOKUP
  • SCREENED
inputHasLegalEndingBooleanNo
  • true
  • false
  • null
wleHasLegalEndingBooleanNo
  • true
  • false
  • null
legalEndingsAreDifferentBooleanNo
  • true
  • false
  • null
nameMatcherSourceStringYeswf-name-matcher
matchedWLEEntityMatchedWLEEntity EnumYes
  • PRIMARY_NAME
  • WLE_NAME
  • ALIAS
screenedToWleNameScoreDoubleNoMatching score between 0 and 1
screenedToWleAliasScoreDoubleNoMatching score between 0 and 1
screenedToWlePrimaryNameScoreDoubleNoMatching score between 0 and 1
processedWleNameStringNoProcessed WLE name
processedWlePrimaryNameStringNoProcessed primary name
processedWleAliasStringNoProcessed best matching alias name

countryMatch

CountryMatch countryMatch

Sample:

"countryMatch": {
"match": false,
"input": "Roslagsgatan 10 \n113 51 Stockholm, Sweden",
"wle": "123 Adams Street \n United States",
"blacklisted": false,
"source": "LOOKUP",
"inputProcessed": "SE",
"wleProcessed": "US",
},

Object definition:

public class CountryMatch {
private Boolean match;
private String input;
private String inputProcessed;
private String wle;
private String wleProcessed;
private SourceType source;
private Boolean blackListed;
private String blackListedStr;
private BlacklistedSource blacklistedSource;
}
FieldTypeAlways expectedPossible values
matchBooleanYes
  • true
  • false
  • null
inputStringNoScreened value
wleStringNoWLE value
blacklistedBooleanNotrue if a blacklisted country is found; otherwise, false
blacklistedSourceBlacklistedSource EnumNo
  • ENTITY
  • CONTENT
  • COUNTRY
  • NONE
blackListedStrStringNoBlacklisted country value
inputProcessedStringNoScreened ISO2 country (can be multiple pipe-separated values)
wleProcessedStringNoWLE ISO2 country (can be multiple pipe-separated values)
sourceSourceType EnumNo
  • NER
  • LOOKUP
  • SCREENED

addressMatch

AddressMatch addressMatch

Sample:

addressMatch": {
"matcherSource": "AVSERVICE",
"comparisonOutput": {
"house_number_match": true,
"city_match": true,
"state_match": true,
"country_match": true,
"postal_code_match": null,
"road_match": true
},
"match": true,
"input": "6820 S Harl Ave, Tempe, AZ 85283, USA",
"inputProcessed": "6820 South Harl Avenue Tempe Arizona United States ",
"wle": "6820 S Harl Ave, Tempe, AZ 85283, USA",
"wleProcessed": "6820 South Harl Avenue Tempe Arizona United States ",
"source": "SCREENED"
}

Object definition:

public class AddressMatch extends ModelFeature {
private Boolean match;
private String input;
private String inputProcessed;
private String wle;
private String wleProcessed;
private SourceType source;
private AddressCompareSource matcherSource;
private ComparisonOutput comparisonOutput;
private double score;
}
FieldTypeAlways expectedPossible values
matcherSourceAddressCompareSource EnumYes
  • AVSERVICE
  • GEOCODER
  • STRING

ComparisonOutput contains details on which part of the address matched. Available in AVSERVICE only; can be null.

FieldTypeAlways expectedPossible values
comparisonOutput.house_number_matchBooleanNo
  • true
  • false
  • null
comparisonOutput.city_matchBooleanNo
  • true
  • false
  • null
comparisonOutput.state_matchBooleanNo
  • true
  • false
  • null
comparisonOutput.country_matchBooleanNo
  • true
  • false
  • null
comparisonOutput.postal_code_matchBooleanNo
  • true
  • false
  • null
comparisonOutput.road_matchBooleanNo
  • true
  • false
  • null
matchBooleanYestrue if a full match; otherwise, false
inputStringNoMatched input value
inputProcessedStringNoProcessed matched input value
wleStringNoProcessed matched WLE value
wleProcessedStringNoProcessed matched WLE value
sourceSourceTypeNo
  • NER
  • LOOKUP
  • SCREENED
scoreDoubleNoValue between 0.0 and 1.0

AVSERVICE indicates that the external address matching service was selected as the address matching source during the configuration. The addressMatch object is populated with values from the comparisonOutput object only when AVSERVICE is used, as shown in the table.

In addition to the match parameter that indicates whether the input address and the WLE address are an exact match, the score parameter is also available. It provides a fuzzy match score between the input address and the WLE address. For more information on how this score is calculated, refer to Perform address comparison.

dobMatch

DobMatch dobMatch

Sample:

"dobMatch": {
"match": false,
"input": "2000-01-01",
"wle": "Jul 23 1998",
"source": "SCREENED",
"inputProcessed": "01/01/2000",
"wleProcessed": "07/23/1988",
},

Object definition:

public class DOBMatch {
private Boolean match;
private String input;
private String inputProcessed;
private String wle;
private String wleProcessed;
private SourceType source;
}
FieldTypeAlways expectedPossible values
matchBooleanYes
  • true
  • false
  • null
inputStringNoScreened value
wleStringNoWLE value
inputProcessedStringNoNormalized screened date to mm/dd/yyyy format
wleProcessedStringNoNormalized WLE date to mm/dd/yyyy format
sourceSourceType EnumNo
  • NER
  • LOOKUP
  • SCREENED

Security lookup data

Security lookup data refers to company information lookup by a security ID.

SecurityLookupData object definition
public class SecurityLookupData {
private boolean executed;
private String country;
private String city;
private String address;
private String region;
private String state;
private String postalCode;
private boolean shareHolderHighRiskIndicator;
private boolean highRiskIndicator;
private double totalShareholderOwnership;
private String id;
private String securityType;
private String name;
}
FieldTypeAlways expectedPossible values
executedBooleanYes
  • true
  • false
countryStringNoUSA
shareHolderHighRiskIndicatorBooleanNo
  • true
  • false
highRiskIndicatorBooleanNo
  • true
  • false
totalShareholderOwnershipDoubleNo49.5 (in %)
idStringNoKW0EQ0601694
securityTypeStringNoISIN
nameStringNoHumansoft Holding Company K.S.C.P.
cityStringNoCity
addressStringNoAddress
regionStringNoRegion
stateStringNoState
postalCodeStringNoPostal code