Travel Rule
The Travel Rule requires virtual asset service providers (VASPs) to collect and exchange identifying information about the sender and the recipient of a virtual asset transfer. The Financial Action Task Force (FATF) sets the international standard in Recommendation 16, and regulators apply it to virtual asset service providers across the markets Stables serves.
Stables applies the Travel Rule with no minimum amount. Every stablecoin transfer Stables processes is in scope, regardless of value.
Stables collects the required originator and beneficiary information, screens wallets and transactions, attributes the counterparty wallet to a provider, and exchanges a Travel Rule message with that provider where one exists. Your integration supplies a small amount of data to make this work, described below.
Even if your business is not itself a regulated entity, Stables must hold originator and beneficiary information for every transfer it processes. The fields on this page are a condition of processing stablecoin transfers.
Which transfers are covered
Any transfer with a crypto leg:
| Transfer | Stables' role | Originator | Beneficiary |
|---|---|---|---|
| Stablecoin to fiat (Transfers API) | Beneficiary VASP. Stables receives the deposit. | Your customer and the wallet they send from | Stables |
| Fiat to stablecoin (Virtual Accounts) | Originating VASP. Stables sends the payout. | Stables, on behalf of your customer | Your customer and the destination wallet |
Transfers paid from your balance have no customer crypto leg and are not subject to Travel Rule exchange.
How Stables complies
For every covered transfer Stables performs the following:
- Wallet screening. The customer wallet is screened with blockchain analytics for sanctions exposure, risk scoring and entity clustering. Flagged wallets may hold the transfer for review.
- Wallet attribution. Stables determines whether the customer wallet is hosted by another VASP or self-custodied. For hosted wallets it identifies the provider so the Travel Rule message can be delivered.
- Travel Rule message. Where the counterparty is a VASP, originator, beneficiary and transaction details are exchanged over an encrypted protocol before the payout is released (fiat to stablecoin) or recorded against the settled deposit (stablecoin to fiat).
- Self-custody verification. For payouts to a self-custodied wallet, Stables may ask the customer to prove they control the wallet before releasing funds.
- Record keeping. Originator, beneficiary and transaction records are retained for seven years.
Originator and beneficiary identity is sourced from the customer's completed KYC or KYB record. You do not pass identity fields on the transfer.
What the Travel Rule message includes
| Data | What is shared | Source |
|---|---|---|
| Customer | Full name, and one of residential or business address, date and place of birth, or an identifier, as required by applicable regulation | Customer KYC or KYB record |
| Customer wallet | Wallet address (and memo or tag where the network uses one) | Deposit detected on chain, or the virtual account destination |
| Stables | Legal entity name and the Stables custody wallet address | Stables |
| Transaction | Amount, currency, blockchain network, transaction hash, timestamp | Transfer and on-chain settlement |
| Counterparty provider | Provider name, when the customer wallet is hosted | Your source_wallet declaration and wallet attribution |
Stablecoin to fiat: declare the sending wallet
When you create a transfer, tell Stables who controls the wallet the customer will send from. This drives wallet attribution and whether a Travel Rule message is exchanged.
| Field | Values | Required |
|---|---|---|
source_wallet.type | hosted when the wallet belongs to an exchange or other VASP. self_hosted when the customer holds the keys. | Recommended. Defaults to self_hosted when omitted. |
source_wallet.vasp_name | Name of the provider hosting the wallet, for example Binance | When type is hosted |
The declaration is echoed back as source.wallet on the transfer resource.
{
"quote_id": "550e8400-e29b-41d4-a716-446655440000",
"customer_id": "550e8400-e29b-41d4-a716-446655440001",
"source_wallet": {
"type": "hosted",
"vasp_name": "Binance"
},
"destination": {
"type": "bank",
"account_holder_name": "Nikos Papadopoulos",
"iban": "GR1601101250000000012300695",
"bank_name": "National Bank of Greece",
"bank_country": "GR",
"currency": "EUR",
"swift_code": "ETHNGRAA"
}
}What happens after the deposit lands:
- Hosted wallet. Stables exchanges the Travel Rule message with the sending provider. The transfer moves to
COMPLIANCE_HOLDuntil the exchange completes, then continues to payout. - Self-custodied wallet. No counterparty VASP exists. Stables records the originator data from the customer's KYC record and screens the wallet. The transfer continues unless screening raises a flag.
- Declaration does not match the chain. If a wallet declared
self_hostedis attributed to a VASP, or the reverse, the transfer may be held while Stables reconciles the two. Ask your customer to confirm which wallet they will send from.
Fiat to stablecoin: destination wallet verification
Payouts from a virtual account go to the destination wallet configured on the account. Stables treats that wallet as belonging to your customer.
Before the payout is released:
- The customer's identity and the destination wallet are screened.
- If the wallet is attributed to another VASP, Stables sends the Travel Rule message and waits for the receiving provider to confirm the beneficiary before broadcasting.
- If the wallet is self-custodied, Stables may require the customer to prove ownership. The payout stays in
COMPLIANCE_HOLDand Stables emitstravel_rule.wallet_verification_requiredwith a verification link and its expiry:
{
"event_category": "travel_rule",
"event_type": "travel_rule.wallet_verification_required",
"event_object_id": "txn-ref-8842",
"event_object": {
"transaction_reference_id": "txn-ref-8842",
"verification_url": "https://verify.example.com/payment-sources/confirm?token=abc123",
"expires_at": "2026-08-02T02:20:00.000Z"
}
}Surface verification_url to the customer. They sign a message with the destination wallet to prove control. Once verified the payout resumes. If the link expires unverified the transaction stays on hold for manual review.
See Webhooks for the full event envelope.
Transfer states and webhooks
Travel Rule outcomes surface through the normal transfer lifecycle. No new terminal states are introduced.
| Outcome | Transfer status | Webhook |
|---|---|---|
| Exchange completed, screening clear | Continues normal progression | transfer.updated.status_transitioned |
| Awaiting counterparty VASP, wallet verification or compliance review | COMPLIANCE_HOLD | transfer.updated.status_transitioned (status COMPLIANCE_HOLD), plus travel_rule.wallet_verification_required when the customer must act |
| Counterparty declined, information mismatch, or screening failed | Held for resolution by Stables compliance. May end in FAILED, with deposited funds returned where applicable. | transfer.updated.status_transitioned |
A hold can last from minutes to a few hours depending on the counterparty provider. Build a pending state in your product rather than treating COMPLIANCE_HOLD as a failure. See Transfer states.
Integration checklist
- Complete KYC or KYB before transfers. Originator and beneficiary identity comes from the verified customer record. A customer without a completed verification cannot transact.
- Declare the sending wallet on every stablecoin to fiat transfer with
source_wallet.type, andsource_wallet.vasp_namefor hosted wallets. Ask the customer which wallet or exchange they will send from. - Handle
COMPLIANCE_HOLDin your transfer flow and subscribe totransfer.updated.status_transitioned. - Subscribe to
travel_rule.wallet_verification_requiredif your customers hold funds in self-custody wallets, and surface the verification link beforeexpires_at. - Keep your own references. Store
transaction_reference_idand transfer ids so you can match Stables records if a regulator or your own auditors ask.
Travel Rule exchange runs in production only. Sandbox transfers are not submitted to counterparty VASPs and never enter a Travel Rule hold, so test your hold and verification handling against the webhook payloads above.