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

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

  • type is stablecoin.
  • amount is 3,000 or more in the payment's currency, for example 3,000 USDC ($3,000 USD-equivalent). amount is in the coin's smallest unit, so for USDC that's 3000000000 or 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.

FieldRequiredValue
account_typeAlwayshosted_wallet or self_hosted_wallet. See Hosted and self-hosted wallets.
routing_detailsFor hosted_walletA routing detail with routing_number_type: "vasp" and the VASP's routing_number. See Find a VASP routing number.
party_typeUnless you're paying your own walletindividual or business.
party_nameUnless you're paying your own walletThe 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.countryUnless you're paying your own walletThe 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"
  }
}
parameterFix
receiving_entity.account_typeSet account_type to hosted_wallet or self_hosted_wallet.
receiving_entity.routing_detailsAdd a vasp routing detail to the hosted wallet.
receiving_entity.party_typeSet party_type.
receiving_entity.party_nameSet party_name.
receiving_entity.party_address.countrySet party_address with a country.