Create Transfer
POST
/api/v2/travelrule/transfers
This API endpoint is used to initiate different types of Travel Rule transfers. Including:
VASP-to-VASP Withdrawal: Transfer between two registered crypto service providers.
Self-Hosted Wallet Withdrawal: Send crypto to a user’s self-hosted wallet.
Self-Hosted Wallet Deposit: Receive crypto from a user’s self-hosted wallet.
It combines several steps into one call—saving time and reducing the effort needed to build your integration. Here’s what happens in the background:
Create the customer account (if it doesn’t exist already)
Create the beneficiary account (if it doesn’t exist already)
Add or update and verify the sending wallet address
Add or update the recipient wallet address
Start the transfer 🚀
Request Body
amount
number
The value being transferred.
True
dti
string
Unique identifier for the assets based on DTIF standards. Example: 4H95J0R2X
(see https://dtif.org)
Conditional
chain
string
Blockchain network name. Example: bitcoin
Conditional
symbol
string
Symbol used to represent this digital token
Conditional
protocol
string
Specifies the Travel Rule communication protocol used
True
reference_id
string
Unique identifier for the transfer, generated by the sender. Example: transfer20250312040414
False
beneficiary_vasp_id
string
ID of the receiving Virtual Asset Service Provider (VASP). Example: ABCXYZ
True
originator_address
string
Blockchain address of the sender. Example: 12higDjoCCNXSA95xZMWUdPvXNmkAduhWv
True
originator_address_is_self_hosted
boolean
Indicates if the wallet address is self-hosted. Defaults to false
False
beneficiary_address
string
Blockchain address of the recipient. Example: bc1qas2rvpejpvncd6z5hcscvw52n4wxw5th2de67v
True
beneficiary_address_is_self_hosted
boolean
Indicates if the wallet address is self-hosted. Defaults to false
False
routing_number
string
A numeric or alphanumeric code.
False
originator_account_reference_id
string
Sender's account ID within the originator VASP. Example: account5678
True
beneficiary_account_reference_id
string
Recipient's account ID within the originator VASP.
Example: account1234
True
transaction_hash
string
The unique hash of the crypto transaction.
False
VASP-to-VASP Withdrawal Query
Customer (Individual) → Non-Customer (Individual). A customer initiates a crypto transfer to a non-customer beneficiary whose account is hosted at another VASP. The originator is an individual, and the beneficiary is also an individual.
// Includes both originator and beneficiary individual account
curl -X POST https://sandbox.ospree.io/api/v2/travelrule/transfers
-h 'Content-Type: application/json' \
-h 'Accept: application/json' \
-h 'Authorization: ••••••' \
-d '{
"amount": 4.2,
"dti": "4H95J0R2X",
"protocol": "flow",
"reference_id": "reference-transfer-01",
"beneficiary_vasp_id": "MLESJF",
"originator_address": "3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy",
"originator_address_is_self_hosted": false,
"beneficiary_address": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
"beneficiary_address_is_self_hosted": false,
"routing_number": "1234XYZ",
"originator_account_reference_id": "random-ref-id-101",
"beneficiary_account_reference_id": "random-ref-id-102",
"transaction_hash":"80003fee6bcbb2726b4d6466d690fce6caaa03771aada747eb0651637514b893",
"originator_account": {
"account_type": "individual",
"account_category": "customer",
"customer_id": "random-cust-id-101",
"individual": {
"individual_name": {
"name_type": "LEGL",
"name_first": "Mark",
"name_last": "Rover"
}
}
},
"beneficiary_account": {
"account_type": "individual",
"account_category": "non-customer",
"customer_id": "random-cust-id-102",
"individual": {
"individual_name": {
"name_type": "LEGL",
"name_first": "Robert",
"name_last": "Harding"
}
}
}
}'
VASP-to-VASP Withdrawal Query
Customer (Entity) → Non-Customer (Entity). A customer initiates a crypto transfer to a non-customer beneficiary whose account is hosted at another VASP. Both the originator and beneficiary accounts are entities.
// Includes both originator and beneficiary entity account details
curl -X POST https://sandbox.ospree.io/api/v2/travelrule/transfers
-h 'Content-Type: application/json' \
-h 'Accept: application/json' \
-h 'Authorization: ••••••' \
-d '{
"amount": 4.2,
"dti": "4H95J0R2X",
"protocol": "flow",
"reference_id": "reference-transfer-01",
"beneficiary_vasp_id": "MLESJF",
"originator_address": "3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy",
"originator_address_is_self_hosted": false,
"beneficiary_address": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
"beneficiary_address_is_self_hosted": false,
"routing_number": "1234XYZ",
"originator_account_reference_id": "random-ref-id-101",
"beneficiary_account_reference_id": "random-ref-id-102",
"transaction_hash":"80003fee6bcbb2726b4d6466d690fce6caaa03771aada747eb0651637514b893",
"originator_account": {
"account_type": "entity",
"account_category": "customer",
"customer_id": "random-cust-id-101",
"entity": {
"entity_name": {
"name_type": "LEGL",
"name_legal": "Digital Capital",
"name_business": "Digital Capital Pte. Ltd."
}
}
},
"beneficiary_account": {
"account_type": "entity",
"account_category": "non-customer",
"customer_id": "random-cust-id-102",
"entity": {
"entity_name": {
"name_type": "LEGL",
"name_legal": "Cyrpto Funds",
"name_business": "Cyrpto Funds Inc."
}
}
}
}'
VASP-to-VASP Withdrawal Query
Customer (Individual) → Customer (Entity). A customer initiates a crypto transfer to another customer whose account is hosted at a different VASP. The originator is an individual, and the beneficiary is an entity.
// Includes a originator individual and beneficiary entity account details
curl -X POST https://sandbox.ospree.io/api/v2/travelrule/transfers
-h 'Content-Type: application/json' \
-h 'Accept: application/json' \
-h 'Authorization: ••••••' \
-d '{
"amount": 4.2,
"dti": "4H95J0R2X",
"protocol": "flow",
"reference_id": "reference-transfer-01",
"beneficiary_vasp_id": "MLESJF",
"originator_address": "3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy",
"originator_address_is_self_hosted": false,
"beneficiary_address": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
"beneficiary_address_is_self_hosted": false,
"routing_number": "1234XYZ",
"originator_account_reference_id": "random-cust-id-101",
"beneficiary_account_reference_id": "random-ref-id-102",
"transaction_hash":"80003fee6bcbb2726b4d6466d690fce6caaa03771aada747eb0651637514b893",
"originator_account": {
"account_type": "individual",
"account_category": "customer",
"customer_id": "random-cust-id-101",
"individual": {
"individual_name": {
"name_type": "LEGL",
"name_first": "Mark",
"name_last": "Rover"
}
}
},
"beneficiary_account": {
"account_type": "entity",
"account_category": "non-customer",
"customer_id": "random-cust-id-102",
"entity": {
"entity_name": {
"name_type": "LEGL",
"name_legal": "Cyrpto Funds",
"name_business": "Cyrpto Funds Inc."
}
}
}
}'
Self-Hosted Wallet Withdrawal
Customer → Customer. A customer withdraws crypto funds to their own self-hosted wallet. The transfer uses originator_account_reference_id
, beneficiary_account_reference_id
, and dti
.
// Without Account account details and DTI
curl -X POST https://sandbox.ospree.io/api/v2/travelrule/transfers
-h 'Content-Type: application/json' \
-h 'Accept: application/json' \
-h 'Authorization: ••••••' \
-d '{
"amount": 4.2,
"dti": "4H95J0R2X",
"protocol": "flow",
"reference_id": "reference-transfer-01",
"beneficiary_vasp_id": "MLESJF",
"originator_address": "3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy",
"originator_address_is_self_hosted": false,
"beneficiary_address": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
"beneficiary_address_is_self_hosted": true,
"routing_number": "1234XYZ",
"originator_account_reference_id": "random-ref-id-101",
"beneficiary_account_reference_id": "random-ref-id-102",
"transaction_hash":"80003fee6bcbb2726b4d6466d690fce6caaa03771aada747eb0651637514b893"
}'
Self-Hosted Wallet Withdrawal
Customer → Customer. A customer withdraws crypto funds to their own self-hosted wallet. The transfer includes originator_account_reference_id
, beneficiary_account_reference_id
, chain
, and symbol
.
// Without Account (Chain + Symbol)
curl -X POST https://sandbox.ospree.io/api/v2/travelrule/transfers
-h 'Content-Type: application/json' \
-h 'Accept: application/json' \
-h 'Authorization: ••••••' \
-d '{
"amount": 4.2,
"chain": "bitcoin",
"symbol": "BTC",
"protocol": "flow",
"reference_id": "reference-transfer-01",
"beneficiary_vasp_id": "MLESJF",
"originator_address": "3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy",
"originator_address_is_self_hosted": false,
"beneficiary_address": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
"beneficiary_address_is_self_hosted": true,
"routing_number": "1234XYZ",
"originator_account_reference_id": "random-ref-id-101",
"beneficiary_account_reference_id": "random-ref-id-102",
"transaction_hash":"80003fee6bcbb2726b4d6466d690fce6caaa03771aada747eb0651637514b893"
}'
Here’s an example of the response data structure:
{
"status": "success",
"data": {
"transfer_id": "067fd57d-efe3-7eab-8000-04d8f072e418",
"reference_id": "reference-transfer-01",
"amount": 4.2,
"amount_usd": 356406.54,
"dti": "4H95J0R2X",
"chain": "bitcoin",
"symbol": "BTC",
"protocol": "flow",
"beneficiary_vasp_id": "MLESJF",
"originator_address": "3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy",
"beneficiary_address": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
"routing_number": "1234XYZ",
"originator_account_reference_id": "random-ref-id-101",
"beneficiary_account_reference_id": "random-ref-id-102",
"transaction_hash": "80003fee6bcbb2726b4d6466d690fce6caaa03771aada747eb0651637514b893",
"transfer_status": "REVIEW"
}
}
Last updated