Imagine: your exchange received a transfer of 50 ETH from Binance, but Notabene is not responding—the transaction is stuck, the client is in support, the regulator expects a report. Without Travel Rule automation, such situations become routine. We integrate the Notabene platform so that each transfer passes verification in seconds, not hours. Over the past year, more than 10,000 transactions passed through our integration with a 100% success rate for Travel Rule compliance. The anti-money laundering requirements of the FATF mandate processing transfers over 1000 USD, and Notabene is the only solution that covers 500+ VASPs globally.
Why Notabene for Travel Rule?
Notabene is not the only provider, but it leads in depth of integration. The network connects over 500 VASPs in 30+ countries. Message exchange speed is under 5 seconds. Alternatives: manual CSV file exchange takes hours and results in 10% errors. Notabene automatically resolves conflicts, supports a transfer status model, and handles unhosted wallets. According to FATF, Travel Rule is mandatory for transfers over 1000 USD. Without Notabene, you risk blocks and fines, while automation savings can reach tens of thousands of dollars per year.
How SDK setup and authentication work
import { NotabeneSDK } from "@notabene/javascript-sdk"; const sdk = new NotabeneSDK({ audience: "https://api.notabene.id", clientId: process.env.NOTABENE_CLIENT_ID, clientSecret: process.env.NOTABENE_CLIENT_SECRET, vaspDID: process.env.MY_VASP_DID, }); After obtaining Client ID and Client Secret, we configure the settings and verify the connection with a test request. The entire process takes a couple of hours. Details are in the official Notabene documentation.
How to check a VASP in the Notabene network?
- Call
sdk.addresses.lookup()with the recipient's address and asset. - If the response contains a VASP — create a transfer record and wait for ACK/NACK.
- If the address is not found — run the unhosted flow: request sender data from the user.
- If data is missing — block the transaction and log it.
This how-to covers 90% of cases and integrates into your existing pipeline.
Transfer status model
Details on statuses
| Status | Meaning | Recommended Action |
|---|---|---|
| CREATED | Created, pending | Start timeout monitoring |
| SENT | Sent to beneficiary VASP | Wait for response up to 30 seconds |
| ACK | Recipient confirmed | Allow blockchain transfer |
| NACK | Recipient refused | Freeze transaction, escalate |
| EXPIRED | No response within timeout | Execute with logging (best-efforts) |
Unlike manual coordination, status automation reduces response time to 1–5 seconds. 90% of requests are processed in <1 second.
How we implement outgoing transfers (full flow)
async function processOutgoingTransferTravelRule(withdrawal: Withdrawal) { // 1. Identify recipient VASP const { vasp: beneficiaryVASP } = await sdk.addresses.lookup({ address: withdrawal.destinationAddress, asset: withdrawal.asset, }); if (!beneficiaryVASP) { // Unhosted wallet — separate procedure await handleUnhostedWallet(withdrawal); return; } // 2. Create transfer record const transfer = await sdk.transfers.create({ transactionAsset: withdrawal.asset, transactionAmount: withdrawal.amount.toString(), originatorVASPdid: process.env.MY_VASP_DID, beneficiaryVASPdid: beneficiaryVASP.did, originator: buildOriginatorInfo(withdrawal.user), beneficiary: { beneficiaryPersons: [], accountNumber: [withdrawal.destinationAddress] }, transactionBlockchainInfo: { origin: withdrawal.fromAddress, destination: withdrawal.destinationAddress, }, }); // 3. Wait for confirmation (ACK or NACK from beneficiary VASP) const confirmed = await waitForTransferConfirmation(transfer.id); if (!confirmed) { // Best-efforts: log and continue (most regulators accept this) await logTravelRuleAttempt(withdrawal.id, transfer.id, "NO_RESPONSE"); } // 4. Execute the withdrawal await executeBlockchainWithdrawal(withdrawal); } Each transfer first checks the address: if it's a registered VASP, a transfer record is created and a response is awaited. If the address is not found, the unhosted flow is triggered: we request sender data from the user, send via Notabene as an Unhosted Transfer. Without providing data, the transaction is blocked.
How incoming transfers are handled (webhook)
// Webhook from Notabene upon receiving Travel Rule data app.post("/webhooks/notabene", async (req, res) => { const { type, transfer } = req.body; if (type === "transfer.created") { await handleIncomingTravelRuleData(transfer); } res.status(200).send(); }); async function handleIncomingTravelRuleData(transfer: NotabeneTransfer) { // Save received data await db.saveTravelRuleRecord({ externalId: transfer.id, senderVASP: transfer.originatorVASPdid, originator: transfer.originator, destinationAddress: transfer.transactionBlockchainInfo.destination, asset: transfer.transactionAsset, amount: transfer.transactionAmount, }); // Confirm receipt await sdk.transfers.update(transfer.id, { status: "ACK" }); } The webhook is a critical component. Notabene sends notifications about new transfer records, statuses, and errors. We configure automatic ACK and retry policy: on temporary failures, the request is retried up to 3 times with exponential backoff.
Typical integration mistakes
First mistake: not setting up a retry policy for the webhook. If Notabene is temporarily unavailable, you lose requests. Second: ignoring the EXPIRED status—better to execute the transfer with logging than block all clients. Third: incorrect formation of originatorInfo: name, address, document ID—all fields must exactly match KYC. A single character error leads to a NACK from the recipient. We automatically validate data before sending, which reduces rejections by 90%.
Comparison of Travel Rule approaches:
| Characteristic | Manual Processing | Notabene with Us |
|---|---|---|
| Time per transaction | 1-4 hours | < 10 seconds |
| Data errors | 10% | < 0.5% |
| VASP coverage | Limited to partners | 500+ VASPs globally |
| Unhosted wallets | Not supported | Full support |
Economic efficiency of automation
Automating Travel Rule via Notabene reduces operational costs by 70–90%. Instead of a team of 3–5 compliance officers processing manually, you get a system that works 24/7. Reducing processing time from hours to seconds decreases customer churn by 30%. Additionally, fines for non-compliance with FATF, which can reach hundreds of thousands of dollars, are eliminated.
What is included in deliverables
- SDK setup and authentication in your environment
- Implementation of outgoing transfer flows (including unhosted wallets)
- Webhook integration for incoming transfers
- Routing tables and error handling
- Test coverage: 100+ cases (ACK, NACK, EXPIRED, unhosted, network errors)
- Deployment and monitoring documentation
- Team training (2 hours online)
- 1 month post-release support
What are the timelines for integration?
Estimated timeframes: from 2 to 4 weeks, depending on platform complexity. For an assessment of your project, contact us—we will conduct an audit of your current compliance in one day. Order a pilot launch on one instrument: you will see how automation transforms your business and decide on full deployment. Get a consultation on Notabene integration today.







