Rules engine through API

Moved to API reference Rules

You can use the rules engine to reduce the number of travel rule transactions landing in your Inbox where it needs manual review. This gives your compliance time more time to focus on the cases where there might be some risk that has been detected. It will also make the response times much faster for everyone, both sender and receiver of travel rule messages.

Ideally, more than 98 percent of all your transactions should automatically get a decision by your rules.

Setting rules

vaspDIDstringThe DID of your VASP to which you want to apply the rules
ruleSetset of rules, one per direction
ordernumberThe Notabene Rue engine works with a waterfall logic where the order of the rules dictates the order and preference that the system applies rules. This means that the first rule you have in place will take priority over any other rules you have in place.
actionRulestring"APPROVE", "REJECT", "SEND_TO_INBOX"
ruleCheckstring"VASP", "JURISDICTION", "RISK_SCORE", "SANCTION_LIST_CHECK"
ruleValuestringValue of the chosen rule - For VASP and JURISDICTION, it is possible to send multiple values, separated by a comma
sourcestringIf the ruleCheck is RISK_SCORE or SANCTION_LIST_CHECK, this is where you fill in the name of your service provider.

In the request, you must specify both sets of rules (independent rules sets, one for each direction, incoming or outgoing), like this:

{
"vaspDID": "{{vaspDID}}",
"ruleSet": {
    "incoming": [
        {
            "order": 0,
            "actionRule": "REJECT",
            "ruleCheck": "JURISDICTION",
            "ruleValue": "AF,AS,AO,AI,BY,VG,KY,CF,CI,CU,KP,DM,CD,ER,ET,FJ,GW,GU,HT,IR,IQ,LR,LY,ML,MM,PW,PA,RU,RW,WS,SC,SL,SO,SS,SD,SY,TH,TT,US,VI,VU,VE,YE,ZW"
        },
        {
            "order": 1,
            "actionRule": "APPROVE",
            "ruleCheck": "VASP",
            "ruleValue": "did:ethr:0xc9dc97121e4d0ab0ec2b569c3a16858f5e309ef0"
        },
        {
            "order": 2,
            "actionRule": "SEND_TO_INBOX",
            "ruleCheck": "RISK_SCORE",
            "ruleValue": "highRisk",
            "source": "CHAINALYSIS"
        },
        {
            "order": 3,
            "actionRule": "SEND_TO_INBOX",
            "ruleCheck": "SANCTION_LIST_CHECK",
            "ruleValue": "medium",
            "source": "COMPLY_ADVANTAGE"
        },
    ],
    "outgoing": []
}}

⚠️

Adding one more rule

It is not possible to append a rule to what has been already set as every call will overwrite your current configuration. Both sets of rules (incoming and outgoing) must be always specified.


Available parameters

Source

SANCTION_LIST_CHECKRISK_SCORE
COMPLY_ADVANTAGECHAINALYSIS
REFINITIVELLIPTIC
TRM_SANCTIONS_SCREENINGTRM
COINFIRM
MERKLE_SCIENCE

ruleValue for SANCTION_LIST_CHECK

COMPLY_ADVANTAGEREFINITIVTRM_SANCTIONS_SCREENING
highEXACTtrue
mediumMEDIUMfalse
lowWEAK
unknownNO_MATCH

ruleValue for RISK_SCORE

CHAINALYSISELLIPTICTRMCOINFIRMMERKLE_SCIENCE
highRisk10SEVEREhighRiskNoRiskDetected
mediumRisk9HIGHmediumRiskInfo
lowRisk8MEDIUMlowRiskCaution
7LOWMedium
....nullHigh
0Critical

Fetching rules

If you wish to see which rules have been set, you can use the following call:

https://api.notabene.dev/rules/get
[
    {
        "id": "977806c5-3bc3-4c64-a2f5-2d1a2b20c628",
        "vaspDID": "did:ethr:0xd4bd902ec78578f33a20ff601504d2ab324cfab9",
        "direction": "incoming",
        "order": 1,
        "actionRule": "REJECT",
        "ruleCheck": "JURISDICTION",
        "ruleValue": "AF,AS,AO,AI,BY,VG,KY,CF,CI,CU,KP,DM,CD,ER,ET,FJ,GW,GU,HT,IR,IQ,LR,LY,ML,MM,PW,PA,RU,RW,WS,SC,SL,SO,SS,SD,SY,TH,TT,US,VI,VU,VE,YE,ZW",
        "source": null,
        "createdAt": "2022-07-27T07:36:35.817Z",
        "createdBy": "did:ethr:0xefbb14b73473ccfd610543af4b1c8fda027c57bf",
        "jurisdictions": [
            "AF",
            "AS",
            "AO",
            "AI",
            "BY",
            "VG",
            "KY",
            "CF",
            "CI",
            "CU",
            "KP",
            "DM",
            "CD",
            "ER",
            "ET",
            "FJ",
            "GW",
            "GU",
            "HT",
            "IR",
            "IQ",
            "LR",
            "LY",
            "ML",
            "MM",
            "PW",
            "PA",
            "RU",
            "RW",
            "WS",
            "SC",
            "SL",
            "SO",
            "SS",
            "SD",
            "SY",
            "TH",
            "TT",
            "US",
            "VI",
            "VU",
            "VE",
            "YE",
            "ZW"
        ]
    },
    {
        "id": "33f5f5a4-6659-427d-8b9e-8e6a7fffdf55",
        "vaspDID": "did:ethr:0xd4bd902ec78578f33a20ff601504d2ab324cfab9",
        "direction": "incoming",
        "order": 2,
        "actionRule": "APPROVE",
        "ruleCheck": "VASP",
        "ruleValue": "HelloCrypto, Notabene VASP CA",
        "source": null,
        "createdAt": "2022-07-27T07:36:35.817Z",
        "createdBy": "did:ethr:0xefbb14b73473ccfd610543af4b1c8fda027c57bf",
        "vasps": [
            {},
            {}
        ]
    }
]

Template rules

If you are looking for a foundation to build your own rules on, you can have a look at the example below suggestion below or this API request:

📘

Sample rules

FIrst rule - blacklisted jurisdictions
Second rule - blacklisted VASPs
Third/Fourth rule - send to manual review if blockchain analytics detects risk
Fifth/SIxth rule- send to manual review if sanctions screening detects risk

Seventh rule - whitelisted jurisdictions
Eigth rule - whitelisted VASPs

{
    "vaspDID": "{{vaspDID}}",
    "ruleSet": {
        "incoming": [
        {
            "order": 0,
            "actionRule": "REJECT",
            "ruleCheck": "JURISDICTION",
            "ruleValue": "KP,IR",
            "source": "string"
        },
        {
            "order": 1,
            "actionRule": "REJECT",
            "ruleCheck": "VASP",
            "ruleValue": "did:ethr:0x468f7efd398fc4557410d944c0e581e115d09e33",
            "source": "null"
        },
        {
            "order": 2,
            "actionRule": "SEND_TO_INBOX",
            "ruleCheck": "RISK_SCORE",
            "ruleValue": "mediumRisk",
            "source": "CHAINALYSIS"
        },
        {
            "order": 3,
            "actionRule": "SEND_TO_INBOX",
            "ruleCheck": "RISK_SCORE",
            "ruleValue": "highRisk",
            "source": "CHAINALYSIS"
        },
        {
            "order": 4,
            "actionRule": "SEND_TO_INBOX",
            "ruleCheck": "SANCTION_LIST_CHECK",
            "ruleValue": "high",
            "source": "COMPLY_ADVANTAGE"
        },
        {
            "order": 5,
            "actionRule": "SEND_TO_INBOX",
            "ruleCheck": "SANCTION_LIST_CHECK",
            "ruleValue": "medium",
            "source": "COMPLY_ADVANTAGE"
        },
        {
            "order": 6,
            "actionRule": "APPROVE",
            "ruleCheck": "JURISDICTION",
            "ruleValue": "US,SG,CH,HK,KR,NL,JP,CA,MY,DE,AU,GB,ZA,IN,AR,AT,BE,BR,CN,DK,FI,FR,GR,IS,IE,IL,IT,MX,NZ,NO,PT,RU,SA,ES,SE,LU,LI,BG,HR,CY,CZ,EE,HU,LV,LT,MT,PL,RO,SK,SI",
            "source": "null"
        },
        {
            "order": 7,
            "actionRule": "APPROVE",
            "ruleCheck": "VASP",
            "ruleValue": "did:ethr:0x940a4b2a0932733b842e4aa906761bb3d3bd8148",
            "source": "null"
        }
        ],
    "outgoing": []
}}

If you want to know more about how to create amazing rules, have a look at this article


Not ready to respond (applicable to incoming transactions only)

{
    "vaspDID": "{{vaspDID}}",
    "ruleSet": {
        "incoming": [
        {
            "order": 0,
            "actionRule": "NOT_READY",
            "ruleCheck": "ALL",
            "ruleValue": "ALL"
        }],
        "outgoing": []
    }
}

Basic rules (example for one direction)

{
    "vaspDID": "{{vaspDID}}",
    "ruleSet": {
        "incoming": [
        {
            "order": 0,
            "actionRule": "APPROVE",
            "ruleCheck": "ALL",
            "ruleValue": "ALL"
        }],
        "outgoing": []
    }
}

Remove rules (example for both directions)

{
    "vaspDID": "{{vaspDID}}",
    "ruleSet": {
        "incoming": [],
        "outgoing": []
    }
}