Travel Rule requirements
The Travel Rule is a US anti-money-laundering requirement (31 CFR 1010.410(f)). For transfers of $3,000 or more, the sending institution must pass along who receives the funds and which institution holds the receiving wallet. Our stablecoin partners begin enforcing it on November 30, 2026.
Modern Treasury checks for these details when you create a stablecoin Payment Order. A payment that's missing them is rejected with a 422 right away, rather than failing after it's sent.
Action required by November 30, 2026Add the details below to every External Account you send stablecoin payouts to. From November 30, 2026, Modern Treasury rejects stablecoin Payment Orders that are missing them.
When the Travel Rule applies
A Payment Order needs Travel Rule details when all of these are true:
typeisstablecoin.amountis 3,000 or more in the payment's currency, for example 3,000 USDC ($3,000 USD-equivalent).amountis in the coin's smallest unit, so for USDC that's3000000000or more.- The receiving account is an External Account or an Internal Account.
Each Payment Order is checked on its own. Payments under 3,000 don't need the details. We still recommend adding them to every wallet External Account, so a larger payment to the same wallet isn't rejected later.
Existing External Accounts aren't updated for you. Add the details to each wallet you already pay before November 30, 2026.
Payments to Internal Accounts
Modern Treasury sets the wallet type and VASP on your stablecoin Internal Accounts. The receiving Internal Account also needs the owner's name and country. Accounts provisioned with a legal_entity_id take both from the Legal Entity, so you don't need to add anything.
What to provide
Travel Rule details live on the receiving External Account, so you add them once per wallet rather than on every payment.
| Field | Required | Value |
|---|---|---|
account_type | Always | hosted_wallet or self_hosted_wallet. See Hosted and self-hosted wallets. |
routing_details | For hosted_wallet | A routing detail with routing_number_type: "vasp" and the VASP's routing_number. See Find a VASP routing number. |
party_type | Unless you're paying your own wallet | individual or business. |
party_name | Unless you're paying your own wallet | The recipient's full legal name: a person's first name then last name, such as Jane Doe, or a business's legal name. Not a wallet address or nickname. |
party_address.country | Unless you're paying your own wallet | The recipient's country, as an ISO 3166-1 alpha-2 code such as US. The rest of the address is optional. |
Hosted and self-hosted wallets
hosted_wallet: an exchange or custodian holds the wallet's keys for the recipient. That provider is known as a Virtual Asset Service Provider (VASP). Examples include a wallet at Coinbase, Kraken, or Robinhood. Hosted wallets also need the VASP's routing detail.self_hosted_wallet: the recipient controls the wallet's keys or seed phrase themselves, for example in a non custodial Privy or Turnkey wallet implementation. Self-hosted wallets don't need a routing detail, but they still need the recipient's details.
Paying your own wallet
When you send to a wallet owned by the same person or business that owns the originating Internal Account, you only need account_type, plus the VASP routing detail for a hosted wallet. The recipient's name comes from the verified Legal Entity.
Modern Treasury treats a payment as going to your own wallet when the External Account's Counterparty has the same legal_entity_id as the originating Internal Account. Set legal_entity_id when you create the Counterparty to link them.
The owner has to match the originator. For example, a wallet that belongs to your business doesn't count as "your own" when you pay it from your customer's Internal Account. That payment needs the recipient's details.
Find a VASP routing number
Each VASP has a Modern Treasury routing number, a UUID that stays the same over time. Ask your Customer Success contact for a copy of the VASP lookup file, and find the VASP that holds the wallet by name.
Send only routing_number and routing_number_type. Modern Treasury fills in the VASP's name as bank_name, so don't send bank_name or bank_address.
If a VASP is listed more than once, choose the entry for the region where the recipient's account is held. If the VASP isn't listed, contact your Customer Success contact.
Collect details from your users
If your users add their own wallets, collect the Travel Rule details at the same time. Ask whether the wallet is hosted or self-hosted, which VASP hosts it, and who owns it.
Add the details to External Accounts
Set these fields when you create a Counterparty or create an External Account, or pass them on an inline receiving_account when you create a Payment Order.
For an External Account you already pay, update the External Account with account_type, party_type, party_name, and party_address. For a hosted wallet, also create a routing detail with routing_number_type: "vasp" and the VASP's routing_number.
Errors
A stablecoin Payment Order of 3,000 or more is rejected with a 422 when its receiving External Account is missing a Travel Rule detail. The parameter names the missing field:
{
"errors": {
"code": "parameter_invalid",
"message": "Receiving entity routing details is invalid",
"parameter": "receiving_entity.routing_details"
}
}parameter | Fix |
|---|---|
receiving_entity.account_type | Set account_type to hosted_wallet or self_hosted_wallet. |
receiving_entity.routing_details | Add a vasp routing detail to the hosted wallet. |
receiving_entity.party_type | Set party_type. |
receiving_entity.party_name | Set party_name. |
receiving_entity.party_address.country | Set party_address with a country. |
Updated 30 minutes ago