# Create Transfer

<mark style="color:yellow;">`POST`</mark>  `/api/v2/travelrule/transfers`

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

* [VASP-to-VASP Withdrawal](https://docs.ospree.io/ospree-api/api-integration-flows#vasp-to-vasp-withdrawal): Transfer between two registered crypto service providers.
* [Self-Hosted Wallet Withdrawal](https://docs.ospree.io/ospree-api/api-integration-flows#self-hosted-wallet-withdrawal): Send crypto to a user’s self-hosted wallet.
* [Self-Hosted Wallet Deposit](https://docs.ospree.io/ospree-api/api-integration-flows#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 🚀&#x20;

### Request Body <a href="#request-body" id="request-body"></a>

<table><thead><tr><th width="311.548583984375">Name</th><th width="104.62933349609375">Type</th><th width="246.4930419921875">Description</th><th>Required</th></tr></thead><tbody><tr><td><code>amount</code></td><td>number</td><td>The positive, non-zero amount of the digital token being transferred.</td><td>True</td></tr><tr><td><code>amount_usd</code></td><td>number</td><td>The USD amount equivalent of the token being transferred.</td><td>False</td></tr><tr><td><code>dti</code></td><td>string</td><td><p>Unique identifier for the assets based on DTIF standards. </p><p></p><p>Example: <mark style="color:orange;"><code>4H95J0R2X</code></mark>(see <a href="https://dtif.org/">https://dtif.org</a>)</p></td><td>Conditional</td></tr><tr><td><code>chain</code></td><td>string</td><td><p>Blockchain network name. </p><p></p><p>Example: <mark style="color:orange;"><code>bitcoin</code></mark></p></td><td>Conditional</td></tr><tr><td><code>symbol</code></td><td>string</td><td>Symbol used to represent this digital token</td><td>Conditional</td></tr><tr><td><code>protocol</code></td><td>string</td><td>Specifies the Travel Rule communication protocol used</td><td>True</td></tr><tr><td><code>reference_id</code></td><td>string</td><td><p>Unique identifier for the transfer, generated by the sender. </p><p></p><p>Example: <mark style="color:orange;"><code>transfer20250312040414</code></mark></p></td><td>False</td></tr><tr><td><code>originator_vasp_id</code></td><td>string</td><td><p>ID of the sending Virtual Asset Service Provider (VASP). <br><br>Specifying the <code>originator_vasp_id</code> will automatically assign the <code>beneficiary_vasp_id</code>  to the logged-in user's VASP ID. </p><p></p><p>This is for VASP-VASP deposit record, where the originator_vasp didn't initiate the transfer. </p><p></p><p>Example: <mark style="color:orange;"><code>ABCXYZ</code></mark></p></td><td>False</td></tr><tr><td><code>beneficiary_vasp_id</code></td><td>string</td><td>ID of the receiving Virtual Asset Service Provider (VASP). <br><br>Specifying the <code>beneficiary_vasp_id</code> is not required for self-hosted transfers or VASP-VASP deposit record transfers.<br><br>Example: <mark style="color:orange;"><code>ABCXYZ</code></mark></td><td>Conditional</td></tr><tr><td><code>originator_address</code></td><td>string</td><td><p>Blockchain address of the sender. </p><p></p><p>Example: <mark style="color:orange;"><code>12higDjoCCNXSA95xZMWUdPvXNmkAduhWv</code></mark></p></td><td>True</td></tr><tr><td><code>originator_address_is_self_hosted</code></td><td>boolean</td><td>Indicates if the wallet address is self-hosted. Defaults to <mark style="color:orange;"><code>false</code></mark></td><td>False</td></tr><tr><td><code>beneficiary_address</code></td><td>string</td><td><p>Blockchain address of the recipient. </p><p></p><p>Example: <mark style="color:orange;"><code>bc1qas2rvpejpvncd6z5hcscvw52n4wxw5th2de67v</code></mark></p></td><td>True</td></tr><tr><td><code>travel_address</code></td><td>string</td><td>base58check encoded unique URL, used to resolve counterparties in TRP. <br><br>Example:<br><code>ta2W2HPKfHxgSgrzY178knqXHg1H3jfeQrwQ9JrKBs9wv</code></td><td>Conditional</td></tr><tr><td><code>beneficiary_address_is_self_hosted</code></td><td>boolean</td><td>Indicates if the wallet address is self-hosted. Defaults to <mark style="color:orange;"><code>false</code></mark></td><td>False</td></tr><tr><td><code>routing_number</code></td><td>string</td><td>A numeric or alphanumeric code.</td><td>False</td></tr><tr><td><code>transaction_hash</code></td><td>string</td><td>The unique identifier (hash) of the crypto transaction. <br><br>Note: Including this field is highly recommended to enable accurate tracking and Travel Rule validation across blockchains.</td><td>False</td></tr><tr><td><code>originator_account_reference_id</code></td><td>string</td><td><p>Sender's account ID within the originator VASP. </p><p></p><p><code>originator_account</code>  is required if the account does not exist yet.</p><p></p><p>Example: <mark style="color:orange;"><code>account5678</code></mark></p></td><td>True</td></tr><tr><td><code>beneficiary_account_reference_id</code></td><td>string</td><td><p>Recipient's account ID within the originator VASP.</p><p></p><p><code>beneficiary_account</code>  is required if the account does not exist yet.</p><p></p><p>Example: <mark style="color:orange;"><code>account1234</code></mark></p></td><td>True</td></tr><tr><td><code>originator_account</code></td><td>object</td><td>The originator account details, required if the <code>originator_account_reference_id</code> does not exist yet.<br><br>Refer to <a data-mention href="../../accounts-directory/create-account">create-account</a>for the list of available account fields.</td><td>Conditional</td></tr><tr><td><code>beneficiary_account</code></td><td>object</td><td>The beneficiary account details, required if the <code>beneficiary_account_reference_id</code> does not exist yet.<br><br>Refer to <a data-mention href="../../accounts-directory/create-account">create-account</a>for the list of available account fields.</td><td>Conditional</td></tr></tbody></table>

### **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.

{% tabs %}
{% tab title="REQUEST" %}

```json
// 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,
    "originator_account_reference_id": "random-ref-id-101",
    "beneficiary_address": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
    "beneficiary_address_is_self_hosted": false,
    "beneficiary_account_reference_id": "random-ref-id-102",
    "routing_number": "1234XYZ",    
    "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"
            }
        }
    }
}' 

```

{% endtab %}
{% endtabs %}

### **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.

{% tabs %}
{% tab title="REQUEST" %}

```json
// 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,
    "originator_account_reference_id": "random-ref-id-101",
    "beneficiary_address": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
    "beneficiary_address_is_self_hosted": false,
    "beneficiary_account_reference_id": "random-ref-id-102",
    "routing_number": "1234XYZ",
    "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."
            }
        }
    }
}' 

```

{% endtab %}
{% endtabs %}

### **VASP-to-VASP Withdrawal Query**&#x20;

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.

{% tabs %}
{% tab title="REQUEST" %}

```json
// 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,
    "originator_account_reference_id": "random-cust-id-101",
    "beneficiary_address": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
    "beneficiary_address_is_self_hosted": false,
    "beneficiary_account_reference_id": "random-ref-id-102",
    "routing_number": "1234XYZ",
    "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."
            }
        }
    }
}' 

```

{% endtab %}
{% endtabs %}

### **VASP-to-VASP Deposit Query (Record)**

Customer (Individual) → Non-Customer (Individual). A transfer is created where the originator VASP didn't initiate the transfer and transfer created is for record-keeping purposes. The originator is an individual, and the beneficiary is also an individual.

{% tabs %}
{% tab title="REQUEST" %}

```json
// 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",
    "originator_vasp_id": "ABCXYZ",
    "originator_address": "3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy",
    "originator_address_is_self_hosted": false,
    "originator_account_reference_id": "random-ref-id-101",
    "beneficiary_address": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
    "beneficiary_address_is_self_hosted": false,
    "beneficiary_account_reference_id": "random-ref-id-102",
    "routing_number": "1234XYZ",    
    "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"
            }
        }
    }
}' 
```

{% endtab %}
{% endtabs %}

### **Self-Hosted Wallet Withdrawal (DTI)**

Customer → Customer. A customer withdraws crypto funds to their own self-hosted wallet. The transfer uses <mark style="color:orange;">`originator_account_reference_id`</mark>, <mark style="color:orange;">`beneficiary_account_reference_id`</mark>, and <mark style="color:orange;">`dti`</mark>.

{% tabs %}
{% tab title="REQUEST" %}

```json
// 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",
    "originator_address": "3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy",
    "originator_address_is_self_hosted": false,
    "originator_account_reference_id": "random-ref-id-101",
    "beneficiary_address": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
    "beneficiary_address_is_self_hosted": true,
    "beneficiary_account_reference_id": "random-ref-id-102",
    "routing_number": "1234XYZ",
    "transaction_hash":"80003fee6bcbb2726b4d6466d690fce6caaa03771aada747eb0651637514b893"
}' 
```

{% endtab %}
{% endtabs %}

### **Self-Hosted Wallet Withdrawal (Chain + Symbol)**

Customer → Customer. A customer withdraws crypto funds to their own self-hosted wallet. The transfer includes <mark style="color:orange;">`originator_account_reference_id`</mark>, <mark style="color:orange;">`beneficiary_account_reference_id`</mark>, <mark style="color:orange;">`chain`</mark>, and <mark style="color:orange;">`symbol`</mark>.

{% tabs %}
{% tab title="REQUEST" %}

```json
// 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",
    "originator_address": "3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy",
    "originator_address_is_self_hosted": false,
    "originator_account_reference_id": "random-ref-id-101",
    "beneficiary_address": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
    "beneficiary_address_is_self_hosted": true,
    "beneficiary_account_reference_id": "random-ref-id-102",
    "routing_number": "1234XYZ",
    "transaction_hash":"80003fee6bcbb2726b4d6466d690fce6caaa03771aada747eb0651637514b893"
}' 
```

{% endtab %}
{% endtabs %}

### **Self-Hosted Wallet Deposit (DTI)**

Customer → Customer. A customer withdraws crypto funds to their own self-hosted wallet. The transfer uses <mark style="color:orange;">`originator_account_reference_id`</mark>, <mark style="color:orange;">`beneficiary_account_reference_id`</mark>, and <mark style="color:orange;">`dti`</mark>.

{% tabs %}
{% tab title="REQUEST" %}

```json
// 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",
    "originator_address": "3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy",
    "originator_address_is_self_hosted": true,
    "originator_account_reference_id": "random-ref-id-101",
    "beneficiary_address": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
    "beneficiary_address_is_self_hosted": false,
    "beneficiary_account_reference_id": "random-ref-id-102",
    "routing_number": "1234XYZ",
    "transaction_hash":"80003fee6bcbb2726b4d6466d690fce6caaa03771aada747eb0651637514b893"
}' 
```

{% endtab %}
{% endtabs %}

### **Self-Hosted Wallet Deposit (Chain + Symbol)**

Customer → Customer. A customer withdraws crypto funds to their own self-hosted wallet. The transfer includes <mark style="color:orange;">`originator_account_reference_id`</mark>, <mark style="color:orange;">`beneficiary_account_reference_id`</mark>, <mark style="color:orange;">`chain`</mark>, and <mark style="color:orange;">`symbol`</mark>.

{% tabs %}
{% tab title="REQUEST" %}

```json
// 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",
    "originator_address": "3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy",
    "originator_address_is_self_hosted": true,
    "originator_account_reference_id": "random-ref-id-101",
    "beneficiary_address": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
    "beneficiary_address_is_self_hosted": false,
    "beneficiary_account_reference_id": "random-ref-id-102",
    "routing_number": "1234XYZ",    
    "transaction_hash":"80003fee6bcbb2726b4d6466d690fce6caaa03771aada747eb0651637514b893"
}' 
```

{% endtab %}
{% endtabs %}

### **Response**

Here’s an example of the response data structure:

{% tabs %}
{% tab title="RESPONSE" %}

```json
{
    "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",
        "originator_vasp_id": "UVWDEP",
        "beneficiary_vasp_id": "MLESJF",
        "originator_address": "3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy",
        "originator_address_is_self_hosted": false,
        "beneficiary_address": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
        "beneficiary_address_is_self_hosted": false,
        "originator_account_reference_id": "random-ref-id-101",
        "beneficiary_account_reference_id": "random-ref-id-102",
        "routing_number": "1234XYZ",
        "transaction_hash": "80003fee6bcbb2726b4d6466d690fce6caaa03771aada747eb0651637514b893",
        "transfer_status": "INITIATED",
        "transfer_type": "INSTRUCTION"
    }
}
```

{% endtab %}
{% endtabs %}
