Travel Rule Migration Guide
Caliza is rolling out crypto Travel Rule compliance to all integrators. Most of the changes are transparent, but a few require action on your side, and some of them become mandatory on a date we will communicate to you in advance.
This page is the delta: what changes compared to how your integration works today, what you need to do, and how to test it. The reference documentation for each feature is linked from every section.
The rollout is gradual and per integrator. Nothing described here is enforced for your account until we tell you the date. Until then, you can already adopt every change below — none of them breaks the current behavior.
Summary
| Area | What changes | Action required |
|---|---|---|
| Creating crypto recipients | The wallet hosting declaration becomes mandatory and is validated. | Yes — update your request |
| Payouts to self-hosted wallets | A wallet ownership proof is required before a simulation or transaction can be created. | Yes — integrate proof collection |
| Payouts to VASP-hosted wallets | The payout may pause while the counterparty VASP authorizes the transfer. | No — handle longer PROCESSING |
| Crypto deposits | Deposits above a threshold are held until the sender's VASP transmits the Travel Rule message. | No — inform your depositors |
| Recipient review | Recipients whose declared hosting contradicts on-chain attribution go to compliance review. | No — watch reviewStatus |
1. Creating crypto recipients
What changes. Every crypto recipient must declare where the destination wallet is hosted. Today the declaration is accepted loosely; after the rollout it is validated on every POST /v1/recipients and PUT /v1/recipients/{id}.
| Before | After |
|---|---|
details.vaspName alone identified the provider (and vaspId and vaspName were mutually exclusive) | details.vaspId from the VASP directory is required. vaspName is rejected on its own; it may accompany a vaspId as display information. |
details.vaspId: "NON_CUSTODIAL_WALLET" marked a self-hosted wallet | details.isNonCustodialWallet: true marks a self-hosted wallet. The legacy value is still normalized for compatibility but is deprecated; new integrations must use the boolean. |
belongsToBeneficiary was optional | Set it explicitly: true for the beneficiary's own wallet, false for a third party's wallet. |
| No address for third-party wallets | A third-party self-hosted wallet (isNonCustodialWallet: true + belongsToBeneficiary: false) requires details.recipientAddress with at least streetOne, city and country. |
What you need to do.
- Look up the hosting provider with
GET /v1/recipients/vasps/search?searchQuery=...and store the returnedidasdetails.vaspId. If the provider is not in the directory, contact Caliza support before creating the recipient. - For self-hosted wallets, send
isNonCustodialWallet: trueand, for third parties, the holder's physical address. - Review the crypto recipients you already have: any recipient with only a
vaspName, or with the legacyNON_CUSTODIAL_WALLETvalue, should be updated. Payouts to a recipient that cannot be addressed to a VASP are held for manual review.
Field reference and examples: Create Recipients.
2. Payouts to self-hosted wallets
What changes. A payout to a self-hosted wallet requires a valid wallet ownership proof for the destination address. Once enforced for your account, POST /v1/simulations, POST /v2/simulations and POST /v1/transactions targeting a self-hosted recipient without a proof fail with HTTP 422 and error code travel-rule.ownership_proof_required.
What you need to do.
- Collect a proof for every self-hosted wallet recipient you pay out to. Three methods are available; pick the one that fits how your customers hold their wallets:
- Signature with the SafeConnect components — the wallet holder connects a browser wallet and signs in your frontend.
POST /v1/travel-rule/proofs/delegate-token, thenPOST /v1/travel-rule/proofs. - Manual signature — for wallets that cannot use SafeConnect (keystore or seed-phrase holders, custody consoles, TRON wallets).
POST /v1/travel-rule/proofs/manual-attestationreturns the text to sign; the wallet holder signs it with their own tooling and you submit the signature toPOST /v1/travel-rule/proofs. This is also the method for wallets owned by a third party: relay the attestation text, get the signature back. - Microtransfer (Satoshi test) —
POST /v1/travel-rule/proofs/microtransferreturns an exact amount and destination; the wallet holder sends it from the wallet being proven and the proof verifies automatically when it arrives.
- Signature with the SafeConnect components — the wallet holder connects a browser wallet and signs in your frontend.
- Before initiating a payout, check
GET /v1/travel-rule/proofs?recipientId={id}:VERIFIEDmeans you can proceed; 404 means no proof exists yet. - Handle the 422
travel-rule.ownership_proof_requiredresponse on simulations and transactions as a signal to start proof collection. - Plan for re-collection: proofs expire (currently one year after verification), and updating a recipient's wallet address or Travel Rule details invalidates its proofs.
Full walkthrough of each method: Self-Hosted Wallets.
You can collect proofs before the requirement is enforced for your account. A proof collected today is valid once enforcement starts, so collecting early means no payout is ever blocked.
3. Payouts to VASP-hosted wallets
What changes. Before the crypto leaves custody, Caliza sends the Travel Rule message to the counterparty VASP and waits for its authorization. For most transfers this is immediate. When the counterparty takes time to authorize, the payout pauses: the transaction keeps its current status (typically PROCESSING), no webhook is emitted for the pause, and it resumes automatically once the counterparty responds. If the counterparty rejects the message, the payout goes to manual compliance review.
What you need to do. Nothing in code. Make sure your monitoring tolerates crypto payouts staying in PROCESSING longer than today, and that the recipient's Travel Rule data (name, vaspId) is accurate, since incomplete or mismatched information is the usual reason for a rejection.
Details: Crypto Travel Rule — Payouts.
4. Crypto deposits
What changes. Crypto deposits at or above the per-currency threshold are held until their Travel Rule requirements are resolved: the funds arrive on-chain but are not credited to the beneficiary's balance, and PAYMENT_IN_COMPLETED only fires once the deposit is released.
- Deposit from a VASP: credited once the sender's VASP transmits the Travel Rule message and it is accepted (the beneficiary name in the message must match the beneficiary on the account). If the message arrives before the funds, nothing is held.
- Deposit from a self-hosted wallet: no VASP will send a message. After a waiting period the origin address goes through automated screening; a clean result releases the deposit, anything else goes to manual review.
- Deposits below the threshold are credited immediately, as today.
What you need to do. Nothing in code. Give your depositors the beneficiary's Travel Rule deposit information along with the wallet address, so their exchange can address the message to Caliza:
curl 'https://api.sandbox.caliza.com/core-api/v1/beneficiaries/{{beneficiaryId}}/travel-rule/deposit-info' \
--header 'Authorization: Bearer {{ACCESS_TOKEN}}'Details: Crypto Travel Rule — Deposits.
5. Recipient review
What changes. Every crypto recipient is created with reviewStatus: PENDING_REVIEW and screened right away; a clean screening approves it automatically, usually within seconds. With the Travel Rule rollout the screening also checks the declared hosting against on-chain attribution data. A contradiction — a wallet declared self-hosted that is attributed to an exchange, or declared at VASP X but attributed to VASP Y — keeps the recipient in PENDING_REVIEW until a compliance reviewer approves or rejects it. While a recipient is PENDING_REVIEW or REJECTED, simulations and transactions targeting it fail with HTTP 422 and error code recipient.under_review.
What you need to do. Nothing in code, unless you create a recipient and pay out to it in the same flow: read reviewStatus on the recipient response (or handle the 422) and retry once it is APPROVED. Double-check the hosting declaration when a recipient stays under review.
Checklist
- Crypto recipient requests send
details.vaspId(from the VASP directory) ordetails.isNonCustodialWallet: true. -
belongsToBeneficiaryis set explicitly on every crypto recipient. - Third-party self-hosted recipients include
details.recipientAddress. - Existing crypto recipients with only a
vaspName, or with the legacyNON_CUSTODIAL_WALLETvalue, are updated. - Ownership proofs are collected for every self-hosted wallet recipient you pay out to, using at least one of the three methods.
- Simulations and transactions handle the 422
travel-rule.ownership_proof_requiredresponse. - Payout monitoring tolerates crypto payouts staying in
PROCESSINGwhile the counterparty VASP authorizes. - Depositors receive the Travel Rule deposit info together with the wallet address.
- Every flow above has been exercised in the sandbox.
Testing in sandbox
Every behavior on this page can be exercised in the sandbox: simulate the counterparty's authorization or rejection on a payout, simulate inbound Travel Rule messages on deposits, and collect proofs against Notabene's test environment. See Testing Travel Rule in Sandbox.
Related Articles
Updated 7 days ago
