# Travel Rule setup

This guide covers enabling Travel Rule compliance in Ripple Custody using Notabene.

Travel Rule (Notabene) and transaction screening (Chainalysis/Elliptic) can be used independently or together. For maximum compliance coverage, enable both—when both are enabled, transactions must pass both checks before execution.

## Prerequisites

Complete these steps before configuring the integration:

### Ripple Custody requirements

- Ripple Custody v1.30 or later
- Compliance domain configured (contact your partner engineer if not already set up)


### Register with Notabene

Register as a VASP with Notabene and complete their onboarding process:

1. **Create account** at [notabene.id](https://notabene.id) and complete KYB verification
2. **Set up your DIDdoc** for VASP discovery and PII encryption (see [Notabene's DID documentation](https://docs.notabene.id/docs/did-setup))
3. **Obtain API credentials** (`client_id` and `client_secret`) for both sandbox and production.


Notabene registration typically takes 1-2 weeks. Start this process early.

### Information to gather

Have the following ready before configuring the provider connection:

| Item | Description |
|  --- | --- |
| Notabene credentials | `client_id` and `client_secret` for sandbox and production |
| VASP DID | Your decentralized identifier (e.g., `did:web:your-domain.com`) |
| Audience | The Notabene API audience for your environment: `https://api.notabene.dev` (sandbox) or `https://api.notabene.id` (production) |


## Configure the integration

### 1. Connect your Notabene account

Create the Notabene provider connection yourself using the Ripple Custody API. You submit your credentials directly to your Ripple Custody deployment. You don't share them with Ripple.

```bash
POST /v1/domains/{domainId}/compliance/providers
```

**Request body**:

```json
{
  "provider": "NOTABENE",
  "credential": {
    "clientId": "<your Notabene client_id>",
    "clientSecret": "<your Notabene client_secret>",
    "entityDid": "did:web:your-domain.com",
    "audience": "https://api.notabene.dev"
  }
}
```

This example connects the Notabene sandbox (`https://api.notabene.dev`). Start with sandbox credentials, complete the [verification steps](#verify-setup), and connect with your production credentials and the production audience (`https://api.notabene.id`) when you're ready to go live.

Treat your Notabene `client_secret` like any other secret: submit it only through this API. Don't share it with anyone, including Ripple support or partner engineers, and don't send it over email or chat.

Confirm the connection is active:

```bash
GET /v1/domains/{domainId}/compliance/provider-connection
```

The connection status must be `CONNECTED`. If the connection is missing or paused, Ripple Custody skips Travel Rule checks and routes affected transfers to manual review.

### 2. Register wallet addresses

Counterparty VASPs confirm that a deposit address belongs to you before they send a Travel Rule message to it. Ripple Custody registers your wallet addresses with Notabene for you:

- When you first connect your Notabene account, Ripple Custody registers the addresses of all your existing wallets.
- When you create a new wallet, Ripple Custody registers its address as part of wallet creation.


You don't need to upload addresses yourself. To check what's registered, list the relationships for your domain as described at the end of this step.

If you need to register additional addresses, for example addresses that Ripple Custody doesn't manage, Notabene provides two ways to do this:

- **Upload addresses in Notabene.** Use the Notabene Dashboard or Notabene's address upload API to register single addresses or a CSV of addresses. See [Upload CSV or register single address](https://devx.notabene.id/docs/upload-addresses) in the Notabene documentation.
- **Create a relationship.** A Notabene relationship links two DIDs. To declare address ownership, `from` is the wallet address expressed as a `did:pkh` DID and `to` is your VASP DID. See [Confirm address](https://devx.notabene.id/docs/confirm-address) and [Relationships](https://devx.notabene.id/docs/relationships) in the Notabene documentation.


Ripple Custody proxies the Notabene relationship API so you can create relationships without calling Notabene directly:

```bash
POST /v1/domains/{domainId}/compliance/travel-rule/providers/NOTABENE/relationships
```

**Request body**:

| Field | Type | Required | Description |
|  --- | --- | --- | --- |
| `from` | string (DID) | No | DID of the source entity. Defaults to the `entityDid` from your provider connection. |
| `to` | string (DID) | Yes | DID of the target entity. |


Both fields are DIDs, not raw wallet addresses. To list the relationships registered for your domain, including the ownership proofs attached to each, call `GET /v1/domains/{domainId}/compliance/travel-rule/providers/NOTABENE/relationships`. You can filter by `from`, `to`, or `custodian` DID.

## Verify setup

After configuration, verify the integration:

1. **Create a Travel Rule message** using the API:

```
POST /v1/domains/{domainId}/compliance/travel-rule/providers/NOTABENE/messages
```
Notabene is the only supported Travel Rule provider, so the `provider` path segment is always `NOTABENE`. Confirm the response contains `suggestedIntentId` and `complianceTravelRuleId`.
2. **Submit PII** if required for the transfer.
3. **Create a transfer intent** using the `suggestedIntentId` from step 1. Always create the Travel Rule message before the intent. Ripple Custody doesn't create a Notabene transfer from a transfer intent on its own.
4. **Check the compliance decision** — verify the transaction is approved, rejected, or flagged as expected.
5. **Test incoming transfers** — send a test transaction to a registered address and confirm:
  - Funds are quarantined
  - Travel Rule check initiates
  - Funds release when approved


## Related documentation

- [Travel Rule compliance](/pt-br/products/custody/v1.40/compliance/travel-rule/concept) — Concepts and architecture.
- [Send assets without PII](/pt-br/products/custody/v1.40/compliance/travel-rule/outgoing-no-pii) — Outgoing transfers when PII is not required.
- [Send assets with PII](/pt-br/products/custody/v1.40/compliance/travel-rule/outgoing-with-pii) — Outgoing transfers when PII is required.
- [Receive assets with Travel Rule](/pt-br/products/custody/v1.40/compliance/travel-rule/incoming) — Incoming transfer handling.