# Approvals API

This feature enables users who do not have direct withdrawal permission to initiate a withdrawal request that can then be reviewed by a user with approval permission.

Approvers have the option to **approve** or **reject** a request, while users who initiate a request have the ability to only **cancel** their own request.

## Fetch approval requests

<mark style="color:blue;">`GET`</mark> `https://api.aquanow.io/accounts/v1/approval`

Fetches the approval(s) given by the query parameter. \ <mark style="color:orange;">NOTE:</mark> One of `startTime` or `approvalId` must be given as a query parameter. Query parameters can not be combined.

#### Query Parameters

| Name       | Type   | Description                                                                                                                                     |
| ---------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| startTime  | string | <p>Pagination token that can be used to query more data<br><mark style="color:orange;">NOTE:</mark> startTime must be within a 90 day range</p> |
| approvalId | string | <p><code>yyyy-mm-ddThh:mm:ss.sssZ</code><br>UTC time stamp when approval request was created</p>                                                |

{% tabs %}
{% tab title="200: OK Get approvals by approvalId" %}
Returns an [ApprovalsObject](https://docs.aquanow.io/aquanow/legacy/data-objects-and-statuses/transaction-objects/approval-objects#approvalsobject).

```json
{
    "payload": {
        "transactionType": "WITHDRAW",
        "symbol": "ETH",
        "address": "0xf6aCc5f01BCE41860B425bcaDfD7ce5ABcc19ECq",
        "quantity": 0.4
    },
    "action": "WITHDRAW",
    "requestedBy": "childUser",
    "approvalId": "d0a83d6f-d63b-4c11-a673-3ab0a4191eb5",
    "status": "APPROVED",
    "created": "2023-05-17T17:21:04.238Z",
    "username": "rootUser",
    "reviewRecords": [
        {
            "reviewedAt": "2023-06-05T18:35:52.531Z",
            "comment": "request approved",
            "reviewedBy": "rootUser",
            "status": "APPROVED"
        }
    ],
    "entity": "Approval",
    "resource": "BALANCE"
    }
```

{% endtab %}

{% tab title="200: OK Get approvals by startTime" %}
Returns an array of [ApprovalsObject](https://docs.aquanow.io/aquanow/legacy/data-objects-and-statuses/transaction-objects/approval-objects#approvalsobject).

```json
[
    {
        "payload": {
            "transactionType": "WITHDRAW",
            "symbol": "ETH",
            "address": "0xf6aCc8f06PCE41860B425bcaDfD7c75ABcc19ECa",
            "quantity": 1
        },
        "action": "WITHDRAW",
        "requestedBy": "childUser",
        "approvalId": "d0783d6f-d63b-4c11-a673-3ab0a4191eb2",
        "status": "APPROVED",
        "created": "2023-05-17T17:21:04.238Z",
        "username": "rootUser",
        "reviewRecords": [
            {
                "reviewedAt": "2023-06-05T18:35:52.531Z",
                "comment": "request approved",
                "reviewedBy": "rootUser",
                "status": "APPROVED"
            }
        ],
        "entity": "Approval",
        "resource": "BALANCE"
    },
    {
        "payload": {
            "transactionType": "WITHDRAW",
            "symbol": "USDT",
            "address": "0x6EFD3522f88130e7A788327fe6F73911902088c0",
            "quantity": 300
        },
        "action": "WITHDRAW",
        "requestedBy": "childUser",
        "approvalId": "16d615a8-fc59-47a8-ad8b-48387db3fbf2",
        "status": "PENDING",
        "created": "2023-05-17T17:48:01.346Z",
        "username": "rootUser",
        "reviewRecords": [],
        "entity": "Approval",
        "resource": "BALANCE"
    }
]
```

{% endtab %}

{% tab title="400: Internal Server Error startTime exceeds 90 days" %}

```json
{
    "message": "Query time range must be within 90 days"
}
```

{% endtab %}

{% tab title="500: Internal Server Error startTime is in the future" %}

```json
{
    "message": "Query endTime must be later than startTime"
}
```

{% endtab %}

{% tab title="500: Internal Server Error startTime is invalid" %}

```json
{
    "message": "Invalid KeyConditionExpression: The BETWEEN operator requires upper bound to be greater than or equal to lower bound; lower bound operand: AttributeValue: {S:2023-11-T08:00:00.000Z}, upper bound operand: AttributeValue: {S:2023-06-13T21:20:48.821Z}"
}
```

{% endtab %}

{% tab title="500: Internal Server Error starTime and approvalId are combined" %}

```json
{
    "message": "Invalid query parameters"
}
```

{% endtab %}

{% tab title="500: Internal Server Error approvalId is invalid" %}

```json
{
    "message": "Record not found"
}
```

{% endtab %}

{% tab title="500: Internal Server Error No query parameter is given" %}

```json
{
    "message": "Invalid query parameters"
}
```

{% endtab %}
{% endtabs %}

## Create an approval request

<mark style="color:green;">`POST`</mark> `https://api.aquanow.io/accounts/v1/approval`

Please specify either `grossQuantity` or `quantity` inside the payload.

#### Request Body

| Name                                      | Type   | Description                                                                                                                                                        |
| ----------------------------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| action<mark style="color:red;">\*</mark>  | string | `BALANCE/WITHDRAW`                                                                                                                                                 |
| payload<mark style="color:red;">\*</mark> | obj    | Contains an [ApprovalsPayloadObject](https://docs.aquanow.io/aquanow/legacy/data-objects-and-statuses/transaction-objects/approval-objects#approvalspayloadobject) |
|                                           | String |                                                                                                                                                                    |

{% tabs %}
{% tab title="200: OK Create an approval request" %}
Returns an [ApprovalsObject](https://docs.aquanow.io/aquanow/legacy/data-objects-and-statuses/transaction-objects/approval-objects#approvalsobject).

```json
{
    "approvalId": "9q2f0fd8-1714-4pdc-b1a5-c8ue388704We",
    "resource": "BALANCE",
    "action": "WITHDRAW",
    "payload": {
        "address": "0xf6aCc8f06BCEw5760B425bcaDfQ7ce5ABcd19ECa",
        "symbol": "ETH",
        "quantity": 0.4,
        "transactionType": "WITHDRAW",
        "networkFee": 0.01
    },
    "username": "rootUser",
    "requestedBy": "childUser",
    "reviewRecords": [],
    "status": "PENDING"
}
```

{% endtab %}

{% tab title="500: Internal Server Error Missing a required parameter" %}

```json
{
    "message": "Invalid request body"
}
```

{% endtab %}

{% tab title="500: Internal Server Error Invalid parameter value" %}

```json
{
    "message": "Invalid request body"
}
```

{% endtab %}
{% endtabs %}

## Cancel an approval request

<mark style="color:red;">`DELETE`</mark> `https://api.aquanow.io/accounts/v1/approval`

<mark style="color:orange;">NOTE:</mark> Users can only cancel their own approval requests while the request status is `PENDING`.

#### Request Body

| Name                                         | Type   | Description                    |
| -------------------------------------------- | ------ | ------------------------------ |
| approvalId<mark style="color:red;">\*</mark> | string | approvalId of approval request |

{% tabs %}
{% tab title="200: OK Cancel an approval request" %}
Returns an [ApprovalsObject](https://docs.aquanow.io/aquanow/legacy/data-objects-and-statuses/transaction-objects/approval-objects#approvalsobject).

```json
{
    "approvalId": "58d5081e-82dc-4tcw-a820-8440e4dfo9c0",
    "status": "CANCELLED"
}
```

{% endtab %}

{% tab title="500: Internal Server Error Invalid approvalId" %}

```json
{
    "message": "Approval request is invalid to cancel"
}
```

{% endtab %}

{% tab title="500: Internal Server Error Missing approvalId" %}

```json
{
    "message": "Invalid request body"
}
```

{% endtab %}
{% endtabs %}

## Review an approval request

<mark style="color:green;">`POST`</mark> `https://api.aquanow.io/accounts/v1/approval/review`

User with approver permissions can approve or reject an approval request while the status is `PENDING`.

#### Request Body

| Name                                         | Type   | Description                    |
| -------------------------------------------- | ------ | ------------------------------ |
| action<mark style="color:red;">\*</mark>     | string | `APPROVE` \| `REJECT`          |
| approvalId<mark style="color:red;">\*</mark> | string | approvalId of approval request |
| comment                                      | string | Comment set by reviewer        |

{% tabs %}
{% tab title="200: OK Review an approval request" %}
Returns an [ApprovalsObject](https://docs.aquanow.io/aquanow/legacy/data-objects-and-statuses/transaction-objects/approval-objects#approvalsobject).

```json
{
    "approvalId": "58w5081e-82dc-49cw-a820-844oe4dfq9t4",
    "status": "APPROVED"
}
```

{% endtab %}

{% tab title="500: Internal Server Error Invalid/missing approvalId or action" %}

```json
{
    "message": "Invalid request body"
}
```

{% endtab %}

{% tab title="500: Internal Server Error Approval request has been reviewed" %}

```json
{
    "message": "Approval is invalid for review"
}
```

{% endtab %}
{% endtabs %}
