# Send assets without PII

This workflow covers outgoing transfers where you don't need to submit PII (Personally Identifiable Information). You create the Travel Rule message with counterparty information first, then submit the transfer intent with the `suggestedIntentId` the message returns.

Creating the message first is the only supported entry path. Ripple Custody doesn't create a Notabene transfer from a transfer intent on its own.

## Prerequisites

- [Travel Rule setup](/pt-br/products/custody/v1.34/resources/guides/travel-rule-setup) complete
- Wallet addresses registered with Notabene (Ripple Custody does this automatically when you connect your Notabene account and when you create new wallets)


## Process flow

```mermaid
sequenceDiagram
    participant Customer
    participant Custody
    participant Notabene
    participant Blockchain

    Customer->>Custody: 1. Create Travel Rule message
    Custody->>Notabene: Forward to Notabene
    Notabene-->>Custody: Return transfer details
    Custody-->>Customer: Return suggestedIntentId, complianceTravelRuleId

    Customer->>Custody: 2. Get transfer status
    Custody-->>Customer: Return isTravelRule, presentationDefinitionUrl, status

    Customer->>Custody: 3. Create Transfer Order Intent (using suggestedIntentId)

    Custody->>Custody: 4. Screen risk (if configured)
    alt Screening failed
        Custody->>Custody: AUTO_REJECTED (no Travel Rule check)
    else Screening passed or not configured
        Custody->>Notabene: 5. Travel Rule check
    end

    Custody->>Custody: 6. Compliance decision

    alt AUTO_APPROVED
        Custody->>Blockchain: 7. Execute transaction
        Custody->>Notabene: Notify settlement
    else AUTO_REJECTED
        Custody->>Notabene: Notify rejection
    end
```

## Step 1: Create Travel Rule message

Create a Travel Rule message with counterparty information:

```bash
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`.

**Request body**:

| Field | Type | Description |
|  --- | --- | --- |
| `originator` | object | Originator identifier (contains `@id` - DID or identifier for the party) |
| `beneficiary` | object | Beneficiary identifier (contains `@id` - DID or identifier for the party) |
| `asset` | string | Asset identifier (e.g., `bip122:000000000019d6689c085ae165831e93/slip44:0`). See [Notabene asset registry](https://devx.notabene.id/docs/supported-assets) for supported formats. |
| `amount` | string | Transfer amount |
| `ref` | string | Reference identifier for the transfer |
| `agents` | array | Agents involved in the transfer. Each agent has `@id`, `for`, and `role` (values: `VASP`, `Custodian`, `SettlementAddress`, `SourceAddress`, `Gateway`, `Unknown`) |


**Response**:

| Field | Type | Description |
|  --- | --- | --- |
| `createTransfer201Response.transfer` | object | Transfer details from Notabene |
| `suggestedIntentId` | string (uuid) | The intent ID to use when creating the transfer intent |
| `complianceTravelRuleId` | string (uuid) | The ID of this Travel Rule record in Ripple Custody. Use it as `{travelRuleId}` in the status and PII endpoints. |


## Step 2: Check whether Notabene requires PII

Get the transfer to confirm that the Travel Rule message exists and to check whether Notabene requires PII for it:

```bash
GET /v1/domains/{domainId}/compliance/travel-rule/providers/NOTABENE/messages/{travelRuleId}
```

Use the `complianceTravelRuleId` from Step 1 as `{travelRuleId}`.

**Key response fields**:

| Field | Type | Description |
|  --- | --- | --- |
| `transfer.isTravelRule` | boolean | Whether the transfer requires Travel Rule compliance. |
| `transfer.presentationDefinitionUrl` | string | URL of the presentation definition that lists the PII the counterparty requires. |
| `transfer.status` | string | Notabene transfer status. |


When `transfer.isTravelRule` is `false`, Notabene doesn't require Travel Rule data for this transfer and you can continue with Step 3. If the response shows that Notabene requires PII, follow [Send assets with PII](/pt-br/products/custody/v1.34/api/accounting/travel-rule/outgoing-with-pii) instead.

## Step 3: Create Transfer Order intent

Create the Transfer Order intent using the `suggestedIntentId` returned in Step 1.

**Transfer Order intent payload**:

| Field | Type | Required | Description |
|  --- | --- | --- | --- |
| `payload.accountId` | string (uuid) | Yes | Source account ID |
| `payload.ledgerId` | string | No | Ledger identifier |
| `payload.parameters.operation` | object | Yes | Transfer operation details including `destination`, `amount`, and `type` |
| `payload.type` | string | Yes | Must be `v0_CreateTransferOrder` |


Critical
Use the `suggestedIntentId` from Step 1 when creating the intent. This links the compliance check to your transaction.

## Step 4: Risk screening

If transaction screening is configured (Chainalysis or Elliptic), Ripple Custody screens the transaction first.

- **If screening fails** (high risk score): The transaction is immediately rejected. No Travel Rule check occurs.
- **If screening passes**: The workflow proceeds to the Travel Rule check.


## Step 5: Travel Rule check

Notabene verifies counterparty information.

## Step 6: Compliance decision

Ripple Custody evaluates the results:

| Screening Result | Travel Rule Result | Decision |
|  --- | --- | --- |
| Approved | Approved | `AUTO_APPROVED` |
| Rejected | — | `AUTO_REJECTED` (Travel Rule skipped) |
| Approved | Rejected | `AUTO_REJECTED` |
| Inconclusive | Inconclusive | `NEED_EXPLICIT_DECISION` |


If the decision is `NEED_EXPLICIT_DECISION`, manual review is required in Ripple Custody.

If only one check is configured (screening only or Travel Rule only), the decision is based on that single check.

## Step 7: Execution and settlement

- If `AUTO_APPROVED`: Transaction executes on blockchain, then Notabene is notified of settlement.
- If `AUTO_REJECTED`: Intent closes, then Notabene is notified of rejection.
- If the intent expires before execution (30 days by default): Ripple Custody automatically rejects the Travel Rule transfer on Notabene.


## Verify transfer status

Poll the Travel Rule transfer status to confirm successful execution:

```bash
GET /v1/domains/{domainId}/compliance/travel-rule/providers/NOTABENE/messages/{travelRuleId}
```

**Key response fields**:

| Field | Type | Description |
|  --- | --- | --- |
| `transfer.status` | string | Notabene transfer status (e.g., `SETTLED`, `REJECTED`) |
| `transfer.direction` | string | `OUTGOING` for this workflow |


## Next steps

- [Send with PII](/pt-br/products/custody/v1.34/api/accounting/travel-rule/outgoing-with-pii) — When PII is required
- [Receive assets](/pt-br/products/custody/v1.34/api/accounting/travel-rule/incoming) — Handle incoming Travel Rule transfers