Policies
Your policies are the rules your institution sets for its transfers, and your node evaluates every transfer against them to give a verdict: approve, flag or reject. Notabene runs the evaluation, but the rules, and so the decision, are yours.
What each verdict does
| Verdict | In the API | What happens |
|---|---|---|
| Approve | Authorize | Your side is authorized once your requirements are met. There is no call to make. |
| Flag | Flag | The transfer waits for a person on your team, who approves or rejects it, in the dashboard under Inbox › Transactions or through the API. Withdrawals shows both calls. |
| Reject | Reject | Your side rejects the transfer. |
| Verdict | In the API | What happens |
|---|---|---|
| Approve | Authorize | Your side is authorized once your requirements are met. There is no call to make. |
| Flag | Flag | The transfer waits for a person on your team, who approves or rejects it, in the dashboard under Inbox › Transactions or through the API. Withdrawals shows both calls. |
| Reject | Reject | Your side rejects the transfer. |
Three calls decide a transfer by hand, and they are easy to confuse:
| To | Call | When |
|---|---|---|
| Approve a transfer your policies flagged | POST/, with a reason | It overrides the flag, and every open requirement your institution set then reads Skipped. |
| Accept a transfer that asks for your authorization | POST/ | On requirements.authorization_requested.v3. |
| Reject a transfer | POST/ | In place of either of the two above. |
| To | Call | When |
|---|---|---|
| Approve a transfer your policies flagged | POST /api/v1/transfers/{id}/force-authorize, with a reason | It overrides the flag, and every open requirement your institution set then reads Skipped. |
| Accept a transfer that asks for your authorization | POST /api/v1/transfers/{id}/authorize | On requirements.authorization_requested.v3. |
| Reject a transfer | POST /api/v1/transfers/{id}/reject | In place of either of the two above. |
The verdict is private, so the other institutions on the transfer see only your status, as Transfers explains. Your audit trail records the verdict as transaction.compliance.evaluated with its decision, and keeps a flag even after a person resolves it.
How a verdict is reached
Every policy that applies to the transfer, such as one for a jurisdiction, a counterparty institution or an amount, gives a verdict. The strictest one wins, reject over flag over approve, and where none applies, a default decides:
- The default for its group, such as counterparty institutions.
- If that group has none, your general default, so that every transfer gets a verdict.
A new account’s general default is Flag, so every transfer waits for review until you change it in the dashboard, under Authorization Rules › Policies. You set a default for each group too: your customers, your own self-hosted wallet addresses, counterparty institutions, counterparty customers and counterparty wallets. Each group’s default is Flag, Reject or no policy.
Policies use the trust status you give a jurisdiction, an asset, a chain or an institution, and the results of the screening providers you connect, as Integrations explains.
Read your policies
curl https://sandbox.notabene.id/api/v1/policy-configs \ --header 'Authorization: Bearer YOUR_ACCESS_TOKEN'const response = await fetch('https://sandbox.notabene.id/api/v1/policy-configs', { method: 'GET', headers: { Authorization: 'Bearer YOUR_ACCESS_TOKEN', }, }); const answer = response.status === 204 ? null : await response.json();import requests response = requests.get( 'https://sandbox.notabene.id/api/v1/policy-configs', headers={'Authorization': 'Bearer YOUR_ACCESS_TOKEN'}, ) answer = None if response.status_code == 204 else response.json()
[
{
"policy_name": "AmountThreshold",
"kind": "Standard",
"type": "Transaction",
"is_enabled": true,
"config": {
"basis": "",
"approve_below": 0,
"flag_above": 10000,
"reject_above": 100000
}
},
{
"policy_name": "GeneralDefault",
"kind": "Standard",
"type": "Transaction",
"is_enabled": true,
"config": {
"verdict": "Flag"
}
}
]curl https://sandbox.notabene.id/api/v1/policy-configs \
--header 'Authorization: Bearer YOUR_ACCESS_TOKEN'const response = await fetch('https://sandbox.notabene.id/api/v1/policy-configs', {
method: 'GET',
headers: {
Authorization: 'Bearer YOUR_ACCESS_TOKEN',
},
});
const answer = response.status === 204 ? null : await response.json();import requests
response = requests.get(
'https://sandbox.notabene.id/api/v1/policy-configs',
headers={'Authorization': 'Bearer YOUR_ACCESS_TOKEN'},
)
answer = None if response.status_code == 204 else response.json()[
{
"policy_name": "AmountThreshold",
"kind": "Standard",
"type": "Transaction",
"is_enabled": true,
"config": {
"basis": "",
"approve_below": 0,
"flag_above": 10000,
"reject_above": 100000
}
},
{
"policy_name": "GeneralDefault",
"kind": "Standard",
"type": "Transaction",
"is_enabled": true,
"config": {
"verdict": "Flag"
}
}
]Each policy carries its policy_name, whether it is_enabled, and its settings in config. Here a transfer above 10,000 is flagged, one above 100,000 is rejected, and one that no policy has an opinion on is flagged too.
Requirements
Separately from your policies, your requirements decide what must happen before your side can be authorized. You choose them as a preset in the dashboard, under Authorization Rules › Requirements.
| Preset | Requirements | Your side |
|---|---|---|
| Straight-through processing | Send, transmit and receive the Travel Rule data. | Is authorized as soon as your side is complete, without waiting for the counterparty. |
| Counterparty coordination | The same three, plus the counterparty’s confirmation of the address and its authorization. | Also waits for the counterparty, for up to 1 minute by default. |
| Preset | Requirements | Your side |
|---|---|---|
| Straight-through processing | Send, transmit and receive the Travel Rule data. | Is authorized as soon as your side is complete, without waiting for the counterparty. |
| Counterparty coordination | The same three, plus the counterparty’s confirmation of the address and its authorization. | Also waits for the counterparty, for up to 1 minute by default. |
Every requirement has a time-out after which it is skipped, so no transfer waits forever on a counterparty that does not answer, and every skip is recorded. You can add beneficiary name matching to either preset, and your team then confirms the name on each deposit.
What Notabene does and what you decide
| Stage | Notabene | Your institution |
|---|---|---|
| Before the transfer | Says whether the Travel Rule applies and which data it requires, as Data collection explains. | Collects that data from its customer. |
| The transfer | Finds the counterparty institution from the address. | Creates the transfer, or names the institution itself. |
| The decision | Runs your policies, and the screening providers you connect. | Sets the policies, and approves or rejects the transfers they flag. |
| The data | Sends and receives the Travel Rule data, and notifies your backend with webhooks. | Confirms that a deposit address belongs to its customer. |
| The funds | Records the transaction hash on the transfer. | Sends the funds and gives Notabene the transaction hash. |
| Your customers | Does not screen your own customers against sanctions lists. | Screens its own customers. |
| Stage | Notabene | Your institution |
|---|---|---|
| Before the transfer | Says whether the Travel Rule applies and which data it requires, as Data collection explains. | Collects that data from its customer. |
| The transfer | Finds the counterparty institution from the address. | Creates the transfer, or names the institution itself. |
| The decision | Runs your policies, and the screening providers you connect. | Sets the policies, and approves or rejects the transfers they flag. |
| The data | Sends and receives the Travel Rule data, and notifies your backend with webhooks. | Confirms that a deposit address belongs to its customer. |
| The funds | Records the transaction hash on the transfer. | Sends the funds and gives Notabene the transaction hash. |
| Your customers | Does not screen your own customers against sanctions lists. | Screens its own customers. |
Only your policies can flag a transfer, and neither your team nor your backend can add a flag by hand. Every step is recorded in your audit trail, which Security and status explains.
Updated about 3 hours ago
