# Action Transfer

<mark style="color:purple;">`PATCH`</mark> `/api/v2/travelrule/transfers/{transfer_id OR reference_id}/{action}`

This endpoint is used to take actions on a transfer depending on the current transfer status.

### **Path Parameters**

| Name           | Type   | Description                                                                                                                                                                       |
| -------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `transfer_id`  | string | <p>A system-generated identifier unique to each transaction </p><p></p><p>Example: <mark style="color:orange;"><code>0663cc41-ef29-7995-8000-2d9b414b3174</code></mark></p>       |
| `reference_id` | string | <p>A unique identifier provided by the originator when initiating the transfer. </p><p></p><p>Example: <mark style="color:orange;"><code>transfer20250312040414</code></mark></p> |
| `action`       | string | The action to be applied. See list of supported actions below.                                                                                                                    |

{% hint style="warning" %}
NOTE: querying the transfer details by `reference_Id` is only supported for transfer requests created by the user (outgoing transfers). \
\
Querying by `reference_id` won't work for recipients of the transfer request (incoming transfers).&#x20;
{% endhint %}

Transfers can be queried using either the transfer\_id or the reference\_id.

* **reference\_id**: A unique identifier provided by the originator when initiating the transfer. It serves as a reference to track and retrieve transfer details and is only applicable for outgoing transfers. For incoming transfers, reference\_id is not supported.
* **transfer\_id**: A system-generated identifier unique to each transaction. It can be used to track and retrieve details for both outgoing and incoming transfers.

### Request Body

| Name               | Type    | Description                                                                                             | Required                     |
| ------------------ | ------- | ------------------------------------------------------------------------------------------------------- | ---------------------------- |
| `retry`            | boolean | Indicates if transfer request should be updated for resending.                                          | True if  action is "reject"  |
| `reject_error`     | string  | <p>The rejection error code of the transfer request. <br><br>See below for the list of error codes.</p> | True if action is "reject"   |
| `message`          | string  | Additional information on why transfer request is rejected.                                             | True if action is "reject"   |
| `transaction_hash` | string  | The blockchain transaction hash of the completed crypto transaction.                                    | True if action is "complete" |

<details>

<summary>Transfer Status and Supported Actions</summary>

The allowed transfer actions depend on the protocol used and whether the transfer is outgoing or incoming. An outgoing transfer is initiated by the VASP to send a transfer request to a counterparty, while an incoming transfer is a transfer request received by the counterparty VASP. Each action taken—such as “accept,” “reject,” or “complete”—triggers a change in the transfer’s status, ensuring that the workflow reflects the real-time state of the transaction.

<table><thead><tr><th width="135.314453125">Actions</th><th width="153.62109375">Status</th><th>Description</th></tr></thead><tbody><tr><td>-</td><td>INITIATED</td><td>The transfer request is sent to the beneficiary VASP using the Create Transfer endpoint.</td></tr><tr><td>-</td><td>REVIEW</td><td>The transfer request is being reviewed by the beneficiary VASP.</td></tr><tr><td>cancel</td><td>CANCELED</td><td>The originator VASP canceled the transfer request using the Action Transfer endpoint.</td></tr><tr><td>repair</td><td>REVIEW</td><td>The originator VASP updates the transfer request based on the rejection reason using the Action Transfer endpoint.</td></tr><tr><td>reject</td><td>REJECTED</td><td>The beneficiary VASP rejected the originator VASP’s request, providing a reason and indicating whether a retry is allowed, using the Action Transfer endpoint.</td></tr><tr><td>accept</td><td>ACCEPTED</td><td>The beneficiary VASP accepted the transfer request, allowing the originator VASP to proceed with executing the crypto transaction using the Action Transfer endpoint.</td></tr><tr><td>complete</td><td>COMPLETED</td><td>The originator VASP has completed the execution of the crypto transaction using the Action Transfer endpoint.</td></tr></tbody></table>

<table><thead><tr><th width="132.671875">Protocols</th><th width="276.404296875">Outgoing Transfer  (Action → Status)</th><th>Incoming Transfer (Action →  Status)</th></tr></thead><tbody><tr><td>flow</td><td>cancel  →  CANCELED<br>repair  →  REVIEW<br>complete →  COMPLETED</td><td>accept  →  ACCEPTED<br>reject  →  REJECTED</td></tr><tr><td>trisa</td><td>repair →  REVIEW<br>complete →  COMPLETED</td><td>accept  →  ACCEPTED<br>reject  →  REJECTED</td></tr><tr><td>trp</td><td>complete →  COMPLETED</td><td>accept  →  ACCEPTED<br>reject  →  REJECTED</td></tr></tbody></table>

</details>

<details>

<summary>Reject Transfer Error Codes</summary>

<table><thead><tr><th width="57.095703125">ID</th><th width="306.94140625">Code</th><th width="357.5625">Description</th></tr></thead><tbody><tr><td>0</td><td>REJECTED</td><td>Default rejection reason. </td></tr><tr><td>1</td><td>UNKNOWN_WALLET_ADDRESS</td><td>VASP doesn't control the beneficiary wallet address.</td></tr><tr><td>2</td><td>UNKNOWN_ORIGINATOR</td><td>The originator account can't be identified.</td></tr><tr><td>3</td><td>UNKNOWN_BENEFICIARY</td><td>The beneficiary account can't be identified.</td></tr><tr><td>4</td><td>UNSUPPORTED_CURRENCY</td><td>VASP doesn't support the specified cryptocurrency. </td></tr><tr><td>5</td><td>EXCEEDED_TRADING_VOLUME</td><td>VASP can't receive more transaction inflows.</td></tr><tr><td>6</td><td>COMPLIANCE_CHECK_FAIL</td><td>VASP internal compliance check has failed.</td></tr><tr><td>7</td><td>NO_COMPLIANCE</td><td>VASP not able to implement travel rule compliance.</td></tr><tr><td>8</td><td>HIGH_RISK</td><td>VASP unwilling to proceed with the transaction after risk assessment.</td></tr><tr><td>9</td><td>OUT_OF_NETWORK</td><td>Wallet address or transaction is not available on the specified blockchain network.</td></tr><tr><td>10</td><td>BAD_REQUEST</td><td></td></tr><tr><td>11</td><td>UNPARSEABLE_IDENTITY</td><td>Unable to parse identity record.</td></tr><tr><td>12</td><td>PRIVATE_INFO_WRONG_FORMAT</td><td></td></tr><tr><td>13</td><td>UNPARSEABLE_TRANSACTION</td><td>Unable to parse transaction data record.</td></tr><tr><td>14</td><td>MISSING_FIELDS</td><td>There are missing required fields in the transaction data.</td></tr><tr><td>15</td><td>INCOMPLETE_IDENTITY</td><td>The identity record is not complete enough for compliance purposes.</td></tr><tr><td>16</td><td>VALIDATION_ERROR</td><td>There was an error validating a field in the transaction data.</td></tr><tr><td>17</td><td>COMPLIANCE_PERIOD_EXCEEDED</td><td>The review period has exceeded the required compliance timeline.</td></tr><tr><td>18</td><td>CANCELED</td><td>The transfer request was canceled.</td></tr></tbody></table>

</details>

## Understanding Travel Rule Transfer Statuses

The status of a Travel Rule transfer evolves as the transfer progresses through different stages. Importantly, the status can differ depending on the point of view:

Originator’s View - The sender (originator) sees the status reflecting the current action they have completed or are awaiting confirmation on. Beneficiary’s View - The recipient (beneficiary) sees a status representing what is pending on their side, such as needing to review, accept, or reject the transfer.

This dual perspective ensures that each party clearly understands their respective responsibilities at any given stage.

### Sample Requests

{% tabs %}
{% tab title=""reject" without retry" %}

```json
{
  "reject_error": "REJECTED",
  "message": "Rejected without reason",
  "retry": false
}
```

{% endtab %}

{% tab title=""reject" with retry" %}

```json
{
  "reject_error": "UNKNOWN_WALLET_ADDRESS",
  "message": "Please provide the correct wallet address.",
  "retry": true
}
```

{% endtab %}

{% tab title=""complete" transfer" %}

```json
{
  "transaction_hash": "80003fee6bcbb2726b4d6466d690fce6caaa03771aada747eb0651637514b893"
}
```

{% endtab %}
{% endtabs %}

### **Response**

{% tabs %}
{% tab title="200 - "accept"" %}

```json
{
  "status": "success",
  "data": {
    "transfer_id": "0663cc41-ef29-7995-8000-2d9b414b3174",
    "reference_id": "reference-transfer-01",
    "amount": 1,
    "amount_usd": 101234.00,
    "dti": "4H95J0R2X",
    "chain": "bitcoin",
    "symbol": "BTC",
    "protocol": "flow",
    "originator_vasp_id": "UVWDEP",
    "beneficiary_vasp_id": "ABCXYZ",
    "originator_address": "14qViLJfdGaP4EeHnDyJbEGQysnCpwk3gd",
    "originator_address_is_self_hosted": false,
    "beneficiary_address": "1F1tAaz5x1HUXrCNLbtMDqcw6o5GNn4xqX",
    "beneficiary_address_is_self_hosted": false,
    "routing_number": "1234XYZ",
    "originator_account_reference_id": "account5678",
    "beneficiary_account_reference_id": "account1234",
    "transaction_hash": null,
    "transfer_status": "ACCEPTED",
    "transfer_type": "INSTRUCTION"
  }
}
```

{% endtab %}

{% tab title="200 - "reject"" %}

```json
{
  "status": "success",
  "data": {
    "transfer_id": "0663cc41-ef29-7995-8000-2d9b414b3174",
    "reference_id": "reference-transfer-01",
    "amount": 1,
    "amount_usd": 101234.00,
    "dti": "4H95J0R2X",
    "chain": "bitcoin",
    "symbol": "BTC",
    "protocol": "flow",
    "beneficiary_vasp_id": "ABCXYZ",
    "originator_address": "14qViLJfdGaP4EeHnDyJbEGQysnCpwk3gd",
    "originator_address_is_self_hosted": false,
    "beneficiary_address": "1F1tAaz5x1HUXrCNLbtMDqcw6o5GNn4xqX",
    "beneficiary_address_is_self_hosted": false,
    "routing_number": "1234XYZ",
    "originator_account_reference_id": "account5678",
    "beneficiary_account_reference_id": "account1234",
    "transaction_hash": null,
    "transfer_status": "REJECTED",
    "transfer_type": "INSTRUCTION"
  }
}
```

{% endtab %}

{% tab title="200 - "cancel"" %}

```json
{
  "status": "success",
  "data": {
    "transfer_id": "0663cc41-ef29-7995-8000-2d9b414b3174",
    "reference_id": "reference-transfer-01",
    "amount": 1,
    "amount_usd": 101234.00,
    "dti": "4H95J0R2X",
    "chain": "bitcoin",
    "symbol": "BTC",
    "protocol": "flow",
    "beneficiary_vasp_id": "ABCXYZ",
    "originator_address": "14qViLJfdGaP4EeHnDyJbEGQysnCpwk3gd",
     "originator_address_is_self_hosted": false,
    "beneficiary_address": "1F1tAaz5x1HUXrCNLbtMDqcw6o5GNn4xqX",
    "beneficiary_address_is_self_hosted": false,
    "routing_number": "1234XYZ",
    "originator_account_reference_id": "account5678",
    "beneficiary_account_reference_id": "account1234",
    "transaction_hash": null,
    "transfer_status": "CANCELED",
    "transfer_type": "INSTRUCTION"
  }
}
```

{% endtab %}

{% tab title="200 - "complete"" %}

```json
{
  "status": "success",
  "data": {
    "transfer_id": "0663cc41-ef29-7995-8000-2d9b414b3174",
    "reference_id": "reference-transfer-01",
    "amount": 1,
    "amount_usd": 101234.00,
    "dti": "4H95J0R2X",
    "chain": "bitcoin",
    "symbol": "BTC",
    "protocol": "flow",
    "beneficiary_vasp_id": "ABCXYZ",
    "originator_address": "14qViLJfdGaP4EeHnDyJbEGQysnCpwk3gd",
    "originator_address_is_self_hosted": false,
    "beneficiary_address": "1F1tAaz5x1HUXrCNLbtMDqcw6o5GNn4xqX",
    "beneficiary_address_is_self_hosted": false,
    "routing_number": "1234XYZ",
    "originator_account_reference_id": "account5678",
    "beneficiary_account_reference_id": "account1234",
    "transaction_hash": "80003fee6bcbb2726b4d6466d690fce6caaa03771aada747eb0651637514b893",
    "transfer_status": "COMPLETED",
    "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/action-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.
