Skip to content

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 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

BlockchainNotabeneCustodyCustomerBlockchainNotabeneCustodyCustomeralt[Screening failed][Screening passed or notconfigured]alt[AUTO_APPROVED][AUTO_REJECTED]1. Create Travel Rule messageForward to NotabeneReturn transfer detailsReturn suggestedIntentId, complianceTravelRuleId2. Get transfer statusReturn isTravelRule, presentationDefinitionUrl, status3. Create Transfer Order Intent (using suggestedIntentId)4. Screen risk (if configured)AUTO_REJECTED (no Travel Rule check)5. Travel Rule check6. Compliance decision7. Execute transactionNotify settlementNotify rejection
BlockchainNotabeneCustodyCustomerBlockchainNotabeneCustodyCustomeralt[Screening failed][Screening passed or notconfigured]alt[AUTO_APPROVED][AUTO_REJECTED]1. Create Travel Rule messageForward to NotabeneReturn transfer detailsReturn suggestedIntentId, complianceTravelRuleId2. Get transfer statusReturn isTravelRule, presentationDefinitionUrl, status3. Create Transfer Order Intent (using suggestedIntentId)4. Screen risk (if configured)AUTO_REJECTED (no Travel Rule check)5. Travel Rule check6. Compliance decision7. Execute transactionNotify settlementNotify rejection

Step 1: Create Travel Rule message

Create a Travel Rule message with counterparty information:

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:

FieldTypeDescription
originatorobjectOriginator identifier (contains @id - DID or identifier for the party)
beneficiaryobjectBeneficiary identifier (contains @id - DID or identifier for the party)
assetstringAsset identifier (e.g., bip122:000000000019d6689c085ae165831e93/slip44:0). See Notabene asset registry for supported formats.
amountstringTransfer amount
refstringReference identifier for the transfer
agentsarrayAgents involved in the transfer. Each agent has @id, for, and role (values: VASP, Custodian, SettlementAddress, SourceAddress, Gateway, Unknown)

Response:

FieldTypeDescription
createTransfer201Response.transferobjectTransfer details from Notabene
suggestedIntentIdstring (uuid)The intent ID to use when creating the transfer intent
complianceTravelRuleIdstring (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:

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

Use the complianceTravelRuleId from Step 1 as {travelRuleId}.

Key response fields:

FieldTypeDescription
transfer.isTravelRulebooleanWhether the transfer requires Travel Rule compliance.
transfer.presentationDefinitionUrlstringURL of the presentation definition that lists the PII the counterparty requires.
transfer.statusstringNotabene 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 instead.

Step 3: Create Transfer Order intent

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

Transfer Order intent payload:

FieldTypeRequiredDescription
payload.accountIdstring (uuid)YesSource account ID
payload.ledgerIdstringNoLedger identifier
payload.parameters.operationobjectYesTransfer operation details including destination, amount, and type
payload.typestringYesMust 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 ResultTravel Rule ResultDecision
ApprovedApprovedAUTO_APPROVED
Rejected—AUTO_REJECTED (Travel Rule skipped)
ApprovedRejectedAUTO_REJECTED
InconclusiveInconclusiveNEED_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:

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

Key response fields:

FieldTypeDescription
transfer.statusstringNotabene transfer status (e.g., SETTLED, REJECTED)
transfer.directionstringOUTGOING for this workflow

Next steps