> ## Documentation Index
> Fetch the complete documentation index at: https://developers.fireblocks.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Notabene

> Send Travel Rule data through Notabene with the Fireblocks API: register your PII encryption key, validate the transaction's Travel Rule data, encrypt the PII, and attach the Travel Rule message to the outgoing transaction.

Notabene screens your incoming and outgoing transactions for Travel Rule compliance, and exchanges originator and beneficiary data with the counterparty VASP. For outgoing transactions, you validate the Travel Rule data through the Fireblocks API, encrypt it with the Notabene PII SDK, and attach it to the transaction. Fireblocks doesn't store Travel Rule data permanently, and doesn't hold the decryption keys.

Notabene is a premium add-on. Fireblocks Support enables it on your workspace, and you connect it in the Console. It's available on Developer Sandbox, Testnet, and Mainnet workspaces. See [Travel Rule Overview](/docs/travel-rule-overview) for how Travel Rule fits into screening.

## What you can do through the API

| Task | Console | API |
| - | - | - |
| Connect Notabene | Yes | No |
| Build the Trigger (Screening Policy) and Outcome (Post-Screening Policy) | Yes | No |
| Validate and send Travel Rule data | No | Yes |
| Look up and manage VASP details | No | Yes |

## Before you start

You need a Notabene account. By default, your Notabene production environment connects to your Fireblocks production workspace, and your Notabene sandbox to your Fireblocks sandbox workspace. For any other pairing, contact Fireblocks Support.

1. **Get your VASP DID.** Your VASP's Decentralized Identifier (DID) identifies you in the Notabene network. Retrieve it with [Get VASP details](/api-reference/travel-rule/get-vasp-details), and use it when you connect Notabene in the Console.
2. **Create a PII encryption key.** Create an Ed25519 DID key with the Notabene CLI. Other VASPs use its public key to encrypt PII sent to you. See [Notabene's Fireblocks integration docs](https://devx.notabene.id/docs/using-notabene-and-fireblocks).
3. **Register the key on your VASP.** Add the key to your VASP details with [Add jsonDidKey to VASP details](/api-reference/travel-rule/add-jsondidkey-to-vasp-details) (`PUT /screening/travel_rule/vasp/update`).
4. **Assign your VASP DID to receiving vault accounts** with [Assign VASP to vault](/api-reference/travel-rule/assign-vasp-to-vault). Incoming transactions to a vault account without an assigned DID can't be screened.
5. **Connect Notabene in the Console** with your Notabene API key, secret, and VASP DID. You receive an email once the connection is approved. Default Trigger (Screening Policy) and Outcome (Post-Screening Policy) rules apply until you create your own.

In your Notabene dashboard, define which Notabene status a transaction must reach before Fireblocks treats screening as complete. To switch to new API keys, submit a ticket to Fireblocks Support with the new API key, secret, and VASP DID.

## Send an outgoing Travel Rule transaction

### Step 1: Validate the Travel Rule data

Call [`POST /screening/travel_rule/transaction/validate/full`](/api-reference/travel-rule/validate-full-travel-rule-transaction) with the transaction details and the originator and beneficiary data you have. The response tells you whether the transaction is above the Travel Rule threshold for the jurisdictions involved, whether the beneficiary VASP was identified, and which data is missing.

Set the `notation` query parameter explicitly. It defaults to `notabene`, and the default will change to `fireblocks`, which translates asset tickers and amounts automatically.

```json theme={"system"}
{
  "transactionAsset": "ETH",
  "transactionAmount": "10000000000000000000",
  "originatorVASPdid": "did:ethr:0x44957e75d6ce4a5bf37aae117da86422c848f7c2",
  "beneficiaryVASPdid": "did:ethr:0x47463999eb42dc2aaacb29624c512603221227a1",
  "transactionBlockchainInfo": {
    "destination": "0xDB6A31EC49D5FB35EF6BA6CE0A3B071C8BA7F7F0"
  },
  "originator": {},
  "beneficiary": {}
}
```

| Response field | Values |
| - | - |
| `isValid` | `true` when all required data is present. |
| `type` | `BELOW_THRESHOLD`, `TRAVELRULE`, or `NON_CUSTODIAL`. |
| `beneficiaryAddressType` | `HOSTED`, `UNHOSTED`, or `UNKNOWN`. |
| `addressSource` | How the beneficiary address was identified, for example `ADDRESS_GRAPH` or a blockchain analytics source. `UNKNOWN` if it wasn't. |
| `beneficiaryVASPdid`, `beneficiaryVASPname` | The identified beneficiary VASP. |
| `warnings` | Data about the beneficiary that is missing and needs to be collected from the sender. |

Use the full validation endpoint. The basic [Validate Travel Rule Transaction](/api-reference/travel-rule/validate-travel-rule-transaction) endpoint is being deprecated.

If `type` is `BELOW_THRESHOLD`, you don't need to collect Travel Rule data.

### Step 2: Identify the beneficiary VASP

If the beneficiary VASP wasn't identified automatically, search Notabene's directory with [`GET /screening/travel_rule/vasp`](/api-reference/travel-rule/get-all-vasps), for example `?search=Fireblocks`, and pass the VASP's DID as `beneficiaryVASPdid`.

### Step 3: Collect the missing data

Collect the fields listed in `warnings`, either with Notabene's widget or through Notabene's API. Then validate again until `isValid` is `true`. See [Notabene's validation documentation](https://devx.notabene.id/docs/validation-api).

### Step 4: Encrypt the PII

Encrypt the originator and beneficiary PII using the [Notabene PII SDK](https://devx.notabene.id/recipes/using-the-pii-sdk-and-fireblocks-api) before sending. You can use end-to-end encryption, which only the counterparty VASP can decrypt, or hybrid encryption, which Notabene can decrypt as well.

### Step 5: Create the transaction

Pass the encrypted Travel Rule message as `travelRuleMessage` in [`POST /transactions`](/api-reference/transactions/create-a-new-transaction):

```ts theme={"system"}
const { data } = await fireblocks.transactions.createTransaction({
  transactionRequest: {
    assetId: "ETH",
    amount: "10",
    source: { type: "VAULT_ACCOUNT", id: "0" },
    destination: {
      type: "ONE_TIME_ADDRESS",
      oneTimeAddress: { address: "0xDB6A31EC49D5FB35EF6BA6CE0A3B071C8BA7F7F0" },
    },
    travelRuleMessage: {
      originatorVASPdid: "did:ethr:0x44957e75d6ce4a5bf37aae117da86422c848f7c2",
      beneficiaryVASPdid: "did:ethr:0x47463999eb42dc2aaacb29624c512603221227a1",
      originator: encryptedOriginator,   // from the Notabene PII SDK
      beneficiary: encryptedBeneficiary, // from the Notabene PII SDK
    },
  },
});
```

An outgoing transaction without a `travelRuleMessage` bypasses Travel Rule screening.

## Receive an incoming transaction

For an incoming transaction, screening runs after the transaction receives its first blockchain confirmation. Checking earlier can mean Notabene doesn't yet recognize the transaction. Fireblocks sends Notabene the destination address, the amount, and the beneficiary VASP DID assigned to the receiving vault account. Notabene returns a Travel Rule verdict synchronously, as part of screening, and the Outcome (Post-Screening Policy) applies the action. Results arrive on the `transaction.status.updated` webhook event, and in the `tr` field of [`GET /screening/transaction/{txId}`](/api-reference/compliance/provides-all-the-compliance-details-for-the-given-screened-transaction).

If no Travel Rule message is attached to an incoming transaction, Fireblocks creates a blank one, so the transaction can still be screened. You don't need to create, wait for, or resolve anything: unlike [Sumsub](/docs/sumsub) and [GTR](/docs/gtr), Notabene doesn't use Travel Rule messages (TRMs) that you manage through the API.

## Screening statuses

Notabene returns a status, and your Outcome (Post-Screening Policy) applies an action based on it:

| Status | What it means |
| - | - |
| Completed | Screening finished successfully. |
| Pending | Still in progress. You can accept the transaction as it is, or wait up to four hours for a result before it is canceled automatically. |
| Rejected | The beneficiary VASP was not recognized, or declined the request. |
| Failed | Screening could not complete, for example because of incomplete Travel Rule data or a Notabene error. |
| Blocking time expired | The time configured for holding a transaction while waiting for a result ran out. |
| Canceled | Screening was canceled. For outgoing transactions, you can choose whether to proceed anyway. |

## Multiple legal entities

If you operate several legal entities, connect them as a Gateway VASP with subsidiary VASPs beneath it, so each vault account maps to the right entity:

1. Create the entities in Notabene.
2. Ask Notabene to establish the Gateway and subsidiary relationship.
3. Generate a shared encryption key.
4. Map each vault account to its VASP with [Assign VASP to vault](/api-reference/travel-rule/assign-vasp-to-vault).

Each vault account maps to exactly one VASP; each VASP can cover many vault accounts.

## Supported assets

Notabene supports most assets listed on CoinGecko; Fireblocks supports a subset of those. On Testnet, `BTC_TEST`, `ETH_TEST4`, and `XRP_TEST` are supported. To request more assets, contact Fireblocks Support.

Incoming transfers from Fireblocks P2P Network connections default to an "Unsupported Asset" status.

## Manage VASP details

| Task | Endpoint |
| - | - |
| Search the Notabene VASP directory | [`GET /screening/travel_rule/vasp`](/api-reference/travel-rule/get-all-vasps) |
| Get a VASP's details by DID | [Get VASP details](/api-reference/travel-rule/get-vasp-details) |
| Register your PII encryption key | [Add jsonDidKey to VASP details](/api-reference/travel-rule/add-jsondidkey-to-vasp-details) |
| Assign or remove a VASP DID for a vault account | [Assign VASP to vault](/api-reference/travel-rule/assign-vasp-to-vault) |
| Get the VASP DID assigned to a vault account | [Get assigned VASP to vault](/api-reference/travel-rule/get-assigned-vasp-to-vault) |

To read your Travel Rule Trigger (Screening Policy) and Outcome (Post-Screening Policy) rules, or update outage and delay behavior, see [Compliance Policies](/docs/compliance-policies).

## Testing

Use Notabene's test VASPs (RoboVASPs) to verify your integration before you rely on it in production. Notabene also provides a test environment and a Postman collection for the Fireblocks integration. See [Testing transactions](https://devx.notabene.id/docs/fireblocks-testing) and the [Fireblocks–Notabene Postman collection](https://www.postman.com/notabene/workspace/fireblocks-notabene-integration/overview).

Some Notabene documentation is password-protected. If you need access, contact your Customer Success Manager.

## Limitations

These routes are never sent to Notabene:

* Gas Station to vault account
* Vault account to exchange
* Vault account to vault account
* Non-custodial wallet to non-custodial wallet within the same workspace

For exchanges and on/off-ramps, see the [Exchanges](/docs/exchanges-travel-rule) and [On/Off-Ramps](/docs/on-off-ramps-travel-rule) guides.

## On the Help Center

To connect Notabene or build Travel Rule rules in the Console, see [Notabene](https://support.fireblocks.io/hc/en-us/articles/30614346879900-Notabene).
