Create Transfer

POST /api/v2/travelrule/transfers

This API endpoint is used to initiate different types of Travel Rule transfers. Including:

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

Name
Type
Description
Required

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