Create Transfer
POST
/api/v2/travelrule/transfers
This API endpoint simplifies the process of handling various 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 🚀
Transfer Scenarios
When initiating a Travel Rule transfer, the roles of originator and beneficiary are defined to meet regulatory requirements. These roles ensure all required data is properly collected, grouped, and transmitted in accordance with compliance standards.
In Ospree, either role can be associated with:
Customer: An individual or entity that has been onboarded by the VASP.
Non-Customer: An external party who is not onboarded but is involved in the transaction.
This flexible structure allows the platform to support a wide range of transfer scenarios, all from a single API endpoint:
VASP-to-VASP Withdrawal / Customer → Non-Customer (Different VASP)
A customer sends crypto funds to an non-customer beneficiary account hosted at another VASP.
VASP-to-VASP Withdrawal / Customer → Customer (Different VASP)
A customer sends crypto funds to their own account held at a different VASP.
VASP-to-VASP Transfer / Customer → Customer (Same VASP)
A customer transfers crypto between accounts within the same VASP.
Self-Hosted Wallet Withdrawal / Customer → Customer
A customer withdraws crypto funds to a self-hosted wallet they personally or institutionally control.
Self-Hosted Wallet Deposit / Customer ← Customer
A customer deposits crypto from their self-hosted wallet back into their VASP account.
Request Body
amount
number
The amount of the digital token being transferred.
True
dti
string
The Digital Token Identifier (DTI) based on ISO 24165.
Required if chain
and symbol
are not defined in the request body.
Example: 4H95J0R2X
(see https://dtif.org)
False
chain
string
The chain name of the digital token.
Required with symbol
if dti
is not defined in the request body.
Refer to Token Identifier for the complete list of supported chains.
Example: bitcoin
False
symbol
string
The symbol or ticker of the digital token.
Required with chain
if dti
is not defined in the request body.
Refer to Token Identifier for the complete list of supported tokens.
Example: BTC
False
protocol
string
Travel Rule protocol to be used for communication. Examples: trp
, gtr
, flow
, trisa
True
beneficiary_vasp_id
string
6 character ID of the receiving Virtual Asset Service Provider (VASP). Example: ABCXYZ
True
originator_address
string
Blockchain address of the sender. If linked, the associated account is used; otherwise, link it via the Create Address endpoint or provide originator_account_reference_id
.
Example: 12higDjoCCNXSA95xZMWUdPvXNmkAduhWv
True
originator_address_is_self_hosted
boolean
Specify if provided originator_address
is "self-hosted".
Defaults to false.
False
beneficiary_address
string
Blockchain address of the recipient. If linked, the associated account is used; otherwise, link it via the Create Address endpoint or provide beneficiary_account_reference_id
. Example: bc1qas2rvpejpvncd6z5hcscvw52n4wxw5th2de67v
True
beneficiary_address_is_self_hosted
boolean
Specify if provided beneficiary_address
is "self-hosted".
Defaults to false.
False
routing_number
string
Optional memo/destination tag for the beneficiary.
False
originator_account_reference_id
string
Reference ID of the sender´s account within the originator VASP.
Example: account1234
True
beneficiary_account_reference_id
string
Reference ID of the recipient´s account within the originator VASP.
Example: account1234
True
transaction_hash
string
Blockchain transaction hash, if already available. This can be updated later via the update transfer endpoint. Example: 80003fee6bcbb2726b4d6466d690fce6caaa03771aada747eb0651637514b893
False
reference_id
string
Unique identifier for the transfer, generated by the sender. Example: transfer20250312040414
False
originator_account
object
Account details of the originator.
If originator_account_reference_id
does not exist, a new originator account will be created with data from originator_account
object.
If originator_account_reference_id
already exists, the originator account will be updated with data from originator_account
object.
Refer to the Create Account section for the expected schema.
NOTE: reference_id
is not required, since originator_account_reference_id
is already provided.
False
beneficiary_account
object
Account details of the beneficiary.
If beneficiary_account_reference_id
does not exist, a new beneficiary account will be created with data from originator_account
object.
If beneficiary_account_reference_id
already exists, the originator account will be updated with data from beneficiary_account
object.
Refer to the Create Account section for the expected schema.
NOTE: reference_id
is not required, since beneficiary_account_reference_id
is already provided.
False
Sample Requests
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",
"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."
}
}
}
}'
Response
{
"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