Travel Rule
What it is
The Travel Rule is a financial regulation, It originates from the US Bank Secrecy Act (1996), which required banks to make certain sender/receiver information "travel" with a wire transfer as it passes between institutions. In 2019, FATF (the international body that sets global AML standards) extended the same concept to crypto under Recommendation 16 , applying it to virtual asset service providers (VASPs) like OwlPay moving stablecoins instead of banks moving fiat.
The name describes the mechanism, not the customer: it's about transaction data traveling with the money, not about anyone traveling anywhere.
When it applies
Travel Rule information is required when both of these are true:
- The transfer is an On-Ramp (Fiat → Stablecoin), Off-Ramp (Stablecoin → Fiat), or On-Chain (Stablecoin → Stablecoin) transfer
- The transfer value exceeds USD 3,000
Below that threshold, none of this information needs to be collected. This $3,000 check applies the same way across all three transfer types — none of them are exempt just because of which type they are.
The two-step decision flow
Whether Travel Rule data is needed — and how much — comes down to two separate checks, done in order:
Step 1: Is it on-ramp, off-ramp, or on-chain AND over $3,000?
NO → done, no Travel Rule needed at all
YES → go to Step 2
Step 2: Is it a self-transfer?
YES → fill short form (wallet info only)
NO → fill long form (full beneficiary details)
is_self_transfer never decides whether the Travel Rule applies (that's Step 1 alone) — it only decides what shape the required data takes, once Step 1 has already said yes.
What information is required
| Field | Description | Allowed values | Required |
|---|---|---|---|
residential_country_code | ISO 3166-1 alpha-2 code of the beneficiary's residential country | — | Yes |
residential_state | State/Province/Region of the beneficiary's residence | — | Yes |
residential_city | City of the beneficiary's residence | — | Yes |
residential_address_1 | Primary street address of the beneficiary | — | Yes |
residential_address_2 | Secondary address details (apartment, suite, unit) | — | No |
residential_postal_code | Postal/ZIP code of the beneficiary's residence | — | Yes |
beneficiary_type | Type of beneficiary | individual, company | Yes |
beneficiary_dob | Date of birth of the beneficiary (YYYY-MM-DD) | — | No |
beneficiary_id_doc_type | Type of identification document | Individual: ID_CARD, PASSPORT, DRIVERS, PAYMENT_SOURCE, BANK_CARD, OTHER. Company: COMPANY_DOC, TRANSPARENCY_REGISTRY_EXTRACT, POWER_OF_ATTORNEY | No |
beneficiary_id_doc_country_code | Country code where the ID document was issued | — | No |
beneficiary_id_doc_number | Identification document number | — | No |
beneficiary_receiving_wallet_type | Receiving wallet type | personalWallet, thirdPartyCustodian, other | Yes |
beneficiary_institution_name | Name of the wallet provider or institution (e.g. MetaMask) | — | Yes |
Two scenarios
The required fields differ depending on the is_self_transfer flag.
Case 1 — Transfer to a third party (is_self_transfer: false)
is_self_transfer: false)Full beneficiary detail is required — residential address, ID document, and wallet info:
"destination": {
"is_self_transfer": false,
"residential_country_code": "US",
"residential_state": "DE",
"residential_city": "Wilmington",
"residential_address_1": "100 Market Street",
"residential_address_2": "Suite 200",
"residential_postal_code": "62704",
"beneficiary_type": "individual",
"beneficiary_dob": "1990-01-01",
"beneficiary_id_doc_type": "PASSPORT",
"beneficiary_id_doc_country_code": "US",
"beneficiary_id_doc_number": "123456789",
"beneficiary_receiving_wallet_type": "personalWallet",
"beneficiary_institution_name": "MetaMask"
}Case 2 — Transfer to self (is_self_transfer: true)
is_self_transfer: true)Only wallet info is required — no separate beneficiary identity, since sender and beneficiary are the same person:
"destination": {
"is_self_transfer": true,
"beneficiary_receiving_wallet_type": "personalWallet",
"beneficiary_institution_name": "MetaMask"
}Worked examples
| # | Scenario | Step 1: On-ramp/Off-ramp/On-chain AND > $3,000? | Step 2: Self-transfer? | Result |
|---|---|---|---|---|
| 1 | $500 on-ramp to a friend in Brazil | No ($500 is under the limit) | — | No Travel Rule data needed. Done at Step 1. |
| 2 | $5,000 on-ramp to that same friend | Yes | No (third party) | Long form required — friend's address, ID doc, wallet info. |
| 3 | $5,000 on-ramp to your own MetaMask wallet | Yes | Yes | Short form required — just wallet type + institution name. |
| 4 | $10,000 on-chain stablecoin-to-stablecoin transfer, to a third party | Yes (on-chain counts, and it's over $3,000) | No (third party) | Long form required — same as on-ramp/off-ramp once over the threshold. |
API reference
- v1 (deprecated):
POST /api/v1/transfer— Travel Rule fields go inside thedestinationobject. Shuts down April 1, 2026. - v2 (current):
GET /api/v2/transfers/travel_rulereturns the JSON Schema (Draft 2020-12) describing the requiredtravel_ruleobject fields for use withPOST /api/v2/transfers.
Updated 22 days ago