Skip to main content
Version: 3.4.1

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;
}
FieldTypePossible values
idStringMessage ID
typeEnum
  • SWF
  • PAYMENT_TRANSFER
  • ISO_20022
subtypeString103
contentStringOriginal payment message or null
contentFormatEnum
  • FUF
  • NATIVE
  • SWIFT_MT
  • SWIFT_MX
  • SWIFT_NPP
  • SWIFT_ADK
paymentObjectCan be null
payment.directionEnum
  • INCOMING
  • OUTGOING
payment.senderObjectCan be null
payment.sender.nameStringSender name
payment.sender.type EntityType Object
  • INDIVIDUAL
  • ORGANIZATION
  • NAME
payment.sender.bicStringBIC ID
payment.sender.accountNumberStringSender's account
payment.sender.otherIdentificationsMap<String, String>Map of other sender's ID (type or value)
payment.sender.addressStringSender's address
payment.sender.countryStringSender's country
payment.receiverObjectCan be null
payment.receiver.nameStringReceiver's name
payment.receiver.typeEntityType Object
  • INDIVIDUAL
  • ORGANIZATION
  • NAME
payment.receiver.bicStringBIC ID
payment.receiver.accountNumberStringReceiver's account
payment.receiver.otherIdentificationsMap<String, String>Map of other receiver's ID (type or value)
payment.receiver.addressStringReceiver's address
payment.receiver.countryStringReceiver's country
payment.amountDoubleFor example, 200.25
payment.currencyStringFor example, USD
customAttributesMap<String, String>Custom 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;
}
FieldTypePossible values
idStringUnique hit ID
tagContentStringTag value
tagNameStringTag name
tagTypeEnum
hitTextStringCan be null
hitStartIndexIntegerNot used
hitEndIndexIntegerNot used

Payment input object

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

FieldTypePossible values
paymentInput.idStringContains an ID value if the hit was on an ID.
paymentInput.typeEnum
  • INDIVIDUAL
  • ORGANIZATION
  • COUNTRY
  • LOCATION
  • VESSEL
  • AIRCRAFT
  • ID
  • NAME
paymentInput.subType of IDEnum
  • UUID
  • IBAN
  • BIC
  • ISIN
  • OTHER
paymentInput.nameStringScreened name
paymentInput.dobStringScreened date of birth
paymentInput.addressStringScreened address
paymentInput.countryStringScreened country
paymentInput.cityStringScreened city
paymentInput.stateStringScreened state
paymentInput.zipStringScreened postal code
paymentInput.codeMapMap<String, String>Map of collected IDs
paymentInput.locationsObjectAdditional set of location data; can be null
paymentInput.locations.addressStringAddress
paymentInput.locations.countryStringCountry
paymentInput.locations.cityStringCity
paymentInput.locations.stateStringState
paymentInput.locations.typeStringA free formatted value, for example, residence or business

Derived object

A derived object refers to data collected after processing.

FieldTypePossible values
derived.idStringNER-detected value
derived.idSourceEnum
  • NER
  • LOOKUP
  • SCREENED
derived.nameStringNER-detected value
derived.nameConfirmedStringAlways false
derived.nameScoreDoubleNER score for the name detected in free text
derived.nameSourceEnum
  • NER
  • LOOKUP
  • SCREENED
derived.countryStringCan come from parsing ID or lookup
derived.countryConfirmedStringSet to true if lookup can confirm the country
derived.countrySourceEnum
  • NER
  • LOOKUP
  • SCREENED
derived.addressStringNER-detected value
derived.addressConfirmedStringSet to true if lookup can confirm the address
derived.addressSourceEnum
  • NER
  • LOOKUP
  • SCREENED
derived.zipStringNot used
derived.zipConfirmedStringAlways false
derived.zipSourceEnumNot used
derived.typeEnum
  • INDIVIDUAL
  • ORGANIZATION
  • COUNTRY
  • LOCATION
  • VESSEL
  • AIRCRAFT
  • ID
  • NAME
  • NONENTITY
  • ACCOUNT
derived.subTypeString
  • UUID
  • IBAN
  • BIC
  • ISIN
  • OTHER
derived.typeConfirmedStringAlways false
derived.typeScoreDoubleNER score for the detected type
derived.typeSourceEnum
  • 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;
}
FieldTypePossible values
idString
typeEntityType Object
  • INDIVIDUAL
  • ORGANIZATION
  • COUNTRY
  • LOCATION
  • VESSEL
  • AIRCRAFT
  • ID
  • NAME
  • NONENTITY
  • ACCOUNT
nameStringSanctioned name or location
aliasesAliasInfo ObjectAKA names
aliases.nameStringAlias name
aliases.typeEnum
  • STRONG
  • WEAK
  • NOT_AVAILABLE
addressStringWLE address
countryStringWLE country
cityStringWLE city
stateStringWLE state
zipStringWLE postal code
dobStringWLE date of birth
codeMapMap<String, String>WLE list of IDs
customAttributesMap<String, String>WLE list of custom values that can be used for adjudication
sourceStringWLE sanctioned source like OFAC
listTypeStringWLE listing type
sourceEntryIdStringWLE unique entry ID
sourceKeywordsStringWLE keywords
locationsList<Object>WLE additional list of location information; can be null
locations.addressStringAddress
locations.countryStringCountry
locations.cityStringCity
locations.stateStringState
locations.typeStringA 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;
}
FieldTypePossible values
matchBoolean
  • true
  • false
  • null
inputStringMatched screened value
wleStringMatched WLE value
inputProcessedStringProcessed screened value
wleProcessedStringProcessed WLE value
sourceSourceType
  • 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
}
FieldTypePossible values
matchBoolean
  • true
  • false
  • null
inputStringOriginal screened value
wleStringOriginal best matching WLE value
inputProcessedStringProcessed screened value
wleProcessedStringProcessed best matching WLE value
sourceSourceType
  • NER
  • LOOKUP
  • SCREENED
inputTypeEntityType
  • INDIVIDUAL
  • ORGANIZATION
  • COUNTRY
  • LOCATION
  • VESSEL
  • AIRCRAFT
  • ID
  • NAME
  • NONENTITY
  • ACCOUNT
inputTypeConfidenceScoreDoubleA value between 0 and 1 (probability) reflecting how confident the model is about the predicted type of the input entity
wleTypeEntityType
  • INDIVIDUAL
  • ORGANIZATION
  • COUNTRY
  • LOCATION
  • VESSEL
  • AIRCRAFT
  • ID
  • NAME
  • NONENTITY
  • ACCOUNT
otherInputTypesList of EntityTypePossible 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;
}
FieldTypePossible values
matchBoolean
  • true
  • false
  • null
inputStringScreened value
wleStringWLE value
scoreDoubleMatching score between 0 and 1
blacklistedBoolean
  • true
  • false if a blacklisted keyword is found
blackListedWordStrStringBlacklisted keyword value
blacklistedSourceBlacklistedSource Enum
  • ENTITY
  • CONTENT
  • COUNTRY
  • NONE
inputProcessedStringProcessed input name
wleProcessedStringProcessed WLE name
sourceSourceType Enum
  • NER
  • LOOKUP
  • SCREENED
inputHasLegalEndingBoolean
  • true
  • false
  • null
wleHasLegalEndingBoolean
  • true
  • false
  • null
legalEndingsAreDifferentBoolean
  • true
  • false
  • null
nameMatcherSourceStringwf-name-matcher
matchedWLEEntityMatchedWLEEntity Enum
  • PRIMARY_NAME
  • WLE_NAME
  • ALIAS

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;
}
FieldTypePossible values
matchBoolean
  • true
  • false
  • null
inputStringScreened value
wleStringWLE value
blacklistedBooleantrue if a blacklisted country is found; otherwise, false
blacklistedSourceBlacklistedSource Enum
  • ENTITY
  • CONTENT
  • COUNTRY
  • NONE
blackListedStrStringBlacklisted country value
inputProcessedStringScreened ISO2 country (can be multiple pipe-separated values)
wleProcessedStringWLE ISO2 country (can be multiple pipe-separated values)
sourceSourceType Enum
  • 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;
}
FieldTypePossible values
matcherSourceAddressCompareSource Enum
  • AVSERVICE
  • GEOCODER
  • STRING

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

FieldTypeValues in DRL
comparisonOutput.house_number_matchBoolean
  • true
  • false
  • null
comparisonOutput.city_matchBoolean
  • true
  • false
  • null
comparisonOutput.state_matchBoolean
  • true
  • false
  • null
comparisonOutput.country_matchBoolean
  • true
  • false
  • null
comparisonOutput.postal_code_matchBoolean
  • true
  • false
  • null
comparisonOutput.road_matchBoolean
  • true
  • false
  • null
matchBooleantrue if a full match; otherwise, false
inputStringMatched input value
inputProcessedStringProcessed matched input value
wleStringProcessed matched WLE value
wleProcessedStringProcessed matched WLE value
sourceSourceType
  • NER
  • LOOKUP
  • SCREENED
scoreDoubleValue 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;
}
FieldTypePossible values
matchBoolean
  • true
  • false
  • null
inputStringScreened value
wleStringWLE value
inputProcessedStringNormalized screened date to mm/dd/yyyy format
wleProcessedStringNormalized WLE date to mm/dd/yyyy format
sourceSourceType Enum
  • 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;
}
FieldTypePossible values
executedBoolean
  • true
  • false
countryStringUSA
shareHolderHighRiskIndicatorBoolean
  • true
  • false
highRiskIndicatorBoolean
  • true
  • false
totalShareholderOwnershipDouble49.5 (in %)
idStringKW0EQ0601694
securityTypeStringISIN