# 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 %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.ospree.io/ospree-api/travel-rule/api-endpoints/create-transfer.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
