# Travel Rule transactions

This page explains what happens to transfers that a [Travel Rule policy rule](/products/wallet/compliance/travel-rule/set-up-travel-rule#create-a-travel-rule-policy-rule) covers, and what your compliance team does in Notabene.

## Outbound transfers

1. **Policy checks.** The transfer passes its limit checks and any step-up approvals.
2. **Travel Rule message.** Ripple Custody (Wallet) creates a Travel Rule message in Notabene with the originator and beneficiary information. If Notabene decides that the Travel Rule doesn't apply, the transfer continues immediately. For example, the amount might be less than the threshold for your jurisdiction.
3. **Approval in Notabene.** Your compliance team reviews and sends the message from the Notabene dashboard. Ripple Custody (Wallet) doesn't send outbound messages automatically.
4. **Hold.** The transaction stays in `POLICY_CHECK_PENDING` until the message reaches the rule's [release level](/products/wallet/compliance/travel-rule/set-up-travel-rule#release-levels). In the console, the transaction shows status **Pending**, with **Policy checks pending** in the timeline.
![A 1 XRP payment to a counterparty address, pending with Policy checks pending in the timeline](/assets/travel-rule-transaction-pending.eb54ef4dfda4c137c79ccbf72a33d419ccd19726a5408450d2898e9ce768f237.9fccc40d.png)
5. **Release or rejection.** At the release level, the transaction moves to `POLICY_CHECK_PASSED` and continues to signing. After signing, Ripple Custody (Wallet) sends the transaction hash to Notabene. If the exchange fails, the transaction moves to `REJECTED`.


Transfers time out after 24 hours
If the message doesn't reach the release level in 24 hours, Ripple Custody (Wallet) cancels it in Notabene and rejects the transfer with `TRAVEL_RULE_TIMEOUT`. Make sure your compliance team sends messages from the Notabene dashboard well before the timeout.

The counterparty can reject the message **after** Ripple Custody (Wallet) releases the transfer, for example when the release level is **Message sent**. In that case, Ripple Custody (Wallet) doesn't reverse the on-chain transfer. Follow up with the counterparty in Notabene.

### Rejection reasons

A rejected transfer's reason text starts with a Travel Rule reason code, followed by a detail message. In the console, the transaction shows status **Violation**, and the **Problems** section shows the reason. In the API, the reason is in the transaction's `reasons` array.

![A rejected payment with status Violation and the problem TRAVEL_RULE_MISSING_DATA: destination has no custodian VASP DID, so it cannot be classified](/assets/travel-rule-rejected-missing-data.40705e74df6092592b53a326e6412a84d43409d79c39de953dfc6ba54812ac11.9fccc40d.png)

| Reason code | Cause | What to do |
|  --- | --- | --- |
| `TRAVEL_RULE_NOT_CONFIGURED` | Your organization has no working Notabene connection. | [Connect Notabene](/products/wallet/compliance/travel-rule/set-up-travel-rule#connect-your-notabene-account-via-the-console) and submit a new transaction. |
| `TRAVEL_RULE_MISSING_DATA` | The destination isn't a saved address, has no custodian details, or belongs to an individual counterparty. | [Prepare the address](/products/wallet/compliance/travel-rule/set-up-travel-rule#prepare-your-address-book-via-the-console) and submit a new transaction. |
| `TRAVEL_RULE_REJECTED_BY_COUNTERPARTY` | The beneficiary VASP rejected the transfer. | Check the reason in Notabene with the counterparty. |
| `TRAVEL_RULE_ADDRESS_NOT_RECOGNISED` | The beneficiary VASP declined the transfer, for example because it doesn't recognize the destination address. | Confirm the destination and custodian with the counterparty. |
| `TRAVEL_RULE_CANCELLED` | Someone canceled the message in Notabene. | If you still want to send the funds, submit a new transaction. |
| `TRAVEL_RULE_TIMEOUT` | The message didn't reach the release level in 24 hours. | Check the message in Notabene and submit a new transaction. |


You can't retry a rejected transaction. Fix the cause and submit a new transaction.

## Inbound Travel Rule messages

When a counterparty VASP sends a Travel Rule message to your VASP DID, Ripple Custody (Wallet) answers it automatically. You don't need an inbound rule for this.

- **The address is one of your wallets:** Ripple Custody (Wallet) confirms the address to the originator. Your compliance team then accepts or declines the message in the Notabene dashboard.
- **The address isn't one of your wallets:** Ripple Custody (Wallet) rejects the message with `TRAVEL_RULE_BENEFICIARY_ADDRESS_NOT_OURS`.


Ripple Custody (Wallet) never accepts an inbound message for you.

## Inbound deposits

If a wallet has an inbound Travel Rule rule, Ripple Custody (Wallet) checks every deposit the rule covers with Notabene:

| Result | What happens |
|  --- | --- |
| Your compliance team accepted the matching message | Ripple Custody (Wallet) credits the deposit normally. |
| No matching message exists | Ripple Custody (Wallet) freezes the deposit with reason `TRAVEL_RULE_MISSING_INBOUND_MESSAGE`. |
| A message exists, but your compliance team hasn't accepted it yet | Ripple Custody (Wallet) freezes the deposit with reason `TRAVEL_RULE_INBOUND_NOT_ACCEPTED`. |
| Ripple Custody (Wallet) couldn't check the deposit | Ripple Custody (Wallet) freezes the deposit with reason `TRAVEL_RULE_MISSING_DATA` or `TRAVEL_RULE_NOT_CONFIGURED`. |


Travel Rule freezes use freeze type `FREEZE_TYPE_TRAVEL_RULE`. The freeze reason also includes the Notabene status, for example `TRAVEL_RULE_MISSING_INBOUND_MESSAGE: INCOMPLETE`. In the console, the transaction shows a **Transaction frozen** banner with the reason and the time of the freeze.

![A 5 XRP deposit with the Transaction frozen banner and reason TRAVEL_RULE_MISSING_INBOUND_MESSAGE: INCOMPLETE](/assets/travel-rule-deposit-frozen.06f4d8f2b7dc7dbb94d4bfb197b0e0efbdecfffe581ffc05f5da97e46400421b.9fccc40d.png)

- **Automatic release.** When your compliance team later accepts the matching message in Notabene, Ripple Custody (Wallet) releases the deposit automatically. If the deposit is still frozen after your team accepts the message, unfreeze it manually.
- **Manual release.** Owners, administrators, and auditors can also unfreeze the deposit themselves. See [Unfreeze a transaction](/products/wallet/compliance/freeze-and-unfreeze-transactions#unfreeze-a-transaction-via-the-console).
- **Manual freezes stay.** If a user froze the deposit manually, an automatic Travel Rule release doesn't lift that freeze.


Inbound rule matchers apply to the **sender**. For example, an inbound rule with a `COUNTERPARTY_ID` matcher checks only deposits from that counterparty.

## Related documentation

- [Travel Rule overview](/products/wallet/compliance/travel-rule)
- [Set up Travel Rule](/products/wallet/compliance/travel-rule/set-up-travel-rule)
- [How transactions work](/products/wallet/transactions)