# User

#### **Overview**

Base URL: `https://api.idosgames.com`

HTTP Method: `GET` / `POST`

Route: `/api/v2/{TitleTemplateId}/{TitleId}/Client/User/{Action}/{UserID}`

Documentation: [**LiveOps Configuration & Logic**](https://docs.idosgames.com/liveops/user)

**Actions (UserAction):**

* `GetClientState`
* `GetUserInventory`
* `GetCustomUserData`
* `UpdateCustomUserData`
* `TransferVirtualCurrency`
* `SubtractVirtualCurrency`
* `ConsumeItem`
* `DeleteUserAccount`
* `GetUsageTime`
* `AddUsageTime`

#### Authentication

**Required Headers**

* `Authorization: Bearer <SessionTicket>`
* `Content-Type: application/json`

**Unauthorized (401)**

Returned when:

* `Authorization` header is missing
* Bearer token is missing/invalid
* Session validation failed

#### Response Envelope (Server Standard)

All responses are wrapped with `OperationResult<T>`:

**Success**

```json
{
  "Success": true,
  "Error": null,
  "Data": { }
}
```

**Failure**

```json
{
  "Success": false,
  "Error": "Some error message",
  "Data": null
}
```

**SuccessResponse**

Used by operations like UpdateCustomUserData and DeleteUserAccount:

```json
{
  "IsCompleted": true,
  "ServerTime": "2026-02-09T12:34:56.789Z"
}
```

***

#### Quick Reference (Action Table)

|                                                   Action | Request Body Fields                                                | Response Data Type                                                                                      |
| -------------------------------------------------------: | ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------- |
|                   [GetClientState](#id-1-getclientstate) | *(none)*                                                           | [`ClientStateResponse`](#response-operationresult-less-than-clientstateresponse-greater-than)           |
|               [GetUserInventory](#id-2-getuserinventory) | *(none)*                                                           | [`GetUserInventoryResult`](#response-operationresult-less-than-getuserinventoryresult-greater-than)     |
|             [GetCustomUserData](#id-3-getcustomuserdata) | *(none)*                                                           | [`GetCustomUserDataResult`](#response-operationresult-less-than-getcustomuserdataresult-greater-than)   |
|       [UpdateCustomUserData](#id-4-updatecustomuserdata) | `Key`, `Value`                                                     | [`SuccessResponse`](#response-operationresult-less-than-successresponse-greater-than)                   |
| [TransferVirtualCurrency](#id-5-transfervirtualcurrency) | `FromCurrencyID`, `ToCurrencyID`, `TransferAmount`                 | [`CurrencyTransferResponse`](#response-operationresult-less-than-currencytransferresponse-greater-than) |
| [SubtractVirtualCurrency](#id-6-subtractvirtualcurrency) | `CurrencyID`, `SubtractAmount`                                     | [`CurrencyUpdateResponse`](#response-operationresult-less-than-currencyupdateresponse-greater-than)     |
|                         [ConsumeItem](#id-7-consumeitem) | `ItemInstanceID` or `ItemID` (+`CatalogVersion`), `SubtractAmount` | [`ConsumeItemResponse`](#response-operationresult-less-than-consumeitemresponse-greater-than)           |
|             [DeleteUserAccount](#id-8-deleteuseraccount) | *(none)*                                                           | [`SuccessResponse`](#response-operationresult-less-than-successresponse-greater-than-1)                 |
|                       [GetUsageTime](#id-9-getusagetime) | *(none)*                                                           | [`UsageTimeStats`](#response-operationresult-less-than-usagetimestats-greater-than)                     |
|                      [AddUsageTime](#id-10-addusagetime) | `UsageTime`                                                        | [`UsageTimeStats`](#response-operationresult-less-than-usagetimestats-greater-than-1)                   |

> Request body can be `{}` for actions without arguments.

***

### Endpoints

#### 1) GetClientState

Returns the full client state for the player. This is the primary bootstrap call — it returns user data, inventory, currencies, configuration, characters, quests, premium state, and more.

**Request**

**Route** `POST /api/v2/{TitleTemplateId}/{TitleId}/Client/User/GetClientState/{UserID}`

**Body**

```json
{}
```

#### **Response (OperationResult\<ClientStateResponse>)**

```json
{
  "Success": true,
  "Error": null,
  "Data": {
    /* ClientStateResponse — full client state object.
       Typically includes: user profile, inventory, virtual currencies,
       custom user data, title configuration, characters, quests,
       premium state, leaderboard data, social state, etc. */
  }
}
```

> **Implementation note:** The exact shape of `ClientStateResponse` is produced by the server's internal aggregation logic. It combines multiple data sources into a single payload. Refer to the SDK documentation for the full `ClientStateResponse` schema.

**Common Errors**

```json
{ "Success": false, "Error": "User data not found", "Data": null }
```

```json
{ "Success": false, "Error": "Get Client State returned null", "Data": null }
```

```json
{ "Success": false, "Error": "Get Client State error: <exception message>", "Data": null }
```

***

#### 2) GetUserInventory

Returns the player's current inventory, including items and virtual currency balances.

**Request**

**Route** `POST /api/v2/{TitleTemplateId}/{TitleId}/Client/User/GetUserInventory/{UserID}`

**Body**

```json
{}
```

#### **Response (OperationResult\<GetUserInventoryResult>)**

```json
{
  "Success": true,
  "Error": null,
  "Data": {
    "Inventory": [
      {
        "ItemInstanceId": "I_001",
        "ItemId": "sword_01",
        "CatalogVersion": "Item",
        "RemainingUses": 1,
        "IsEquipped": false
      }
    ],
    "VirtualCurrency": {
      "CO": 1500,
      "IG": 250
    },
    "VirtualCurrencyRechargeTimes": {}
  }
}
```

> **Note:** The exact fields of `GetUserInventoryResult` are defined by the SDK's `ServerModels`. The sample above shows typical fields.

**Common Errors**

```json
{ "Success": false, "Error": "Inventory is null", "Data": null }
```

```json
{ "Success": false, "Error": "GetUserInventory error: <exception message>", "Data": null }
```

***

#### 3) GetCustomUserData

Returns the player's custom user data (key-value pairs), excluding internal/system keys.

**Request**

**Route** `POST /api/v2/{TitleTemplateId}/{TitleId}/Client/User/GetCustomUserData/{UserID}`

**Body**

```json
{}
```

#### **Response (OperationResult\<GetCustomUserDataResult>)**

```json
{
  "Success": true,
  "Error": null,
  "Data": {
    "Data": {
      "preferred_language": { "Value": "en", "LastUpdated": "2026-02-09T12:00:00Z", "Permission": "Private" },
      "tutorial_step": { "Value": "5", "LastUpdated": "2026-02-09T12:30:00Z", "Permission": "Private" }
    }
  }
}
```

**Common Errors**

```json
{ "Success": false, "Error": "CustomUserData is null", "Data": null }
```

```json
{ "Success": false, "Error": "GetCustomUserData error: <exception message>", "Data": null }
```

***

#### 4) UpdateCustomUserData

Updates a single key-value pair in the player's custom user data. System keys (matching `SystemCustomUserDataKey` enum values) are forbidden.

**Request**

**Route** `POST /api/v2/{TitleTemplateId}/{TitleId}/Client/User/UpdateCustomUserData/{UserID}`

**Body**

```json
{
  "Key": "preferred_language",
  "Value": "en"
}
```

#### **Response (OperationResult\<SuccessResponse>)**

```json
{
  "Success": true,
  "Error": null,
  "Data": {
    "IsCompleted": true,
    "ServerTime": "2026-02-09T12:34:56.789Z"
  }
}
```

**Common Errors**

**Missing key or value**

```json
{ "Success": false, "Error": "key or value is null", "Data": null }
```

**System key rejected**

```json
{ "Success": false, "Error": "Incorrect key (system key)", "Data": null }
```

**Database update failed**

```json
{ "Success": false, "Error": "Failed to update Custom User Data", "Data": null }
```

```json
{ "Success": false, "Error": "UpdateCustomUserData error: <exception message>", "Data": null }
```

***

#### 5) TransferVirtualCurrency

Transfers an amount of one virtual currency to another. Both currencies must form an allowed pair in `AllowedCurrencyTransferPairs` from the title configuration. System currencies (Coin, CoinLimit, Token, TokenLimit) are forbidden.

**Request**

**Route** `POST /api/v2/{TitleTemplateId}/{TitleId}/Client/User/TransferVirtualCurrency/{UserID}`

**Body**

```json
{
  "FromCurrencyID": "DICE",
  "ToCurrencyID": "CO",
  "TransferAmount": 100
}
```

> `TransferAmount` defaults to `1` if not provided or ≤ 0.

#### **Response (OperationResult\<CurrencyTransferResponse>)**

```json
{
  "Success": true,
  "Error": null,
  "Data": {
    "FromCurrencyID": "DICE",
    "ToCurrencyID": "CO",
    "TransferAmount": 100,
    "UpdatedVirtualCurrencies": {
      "DICE": 400,
      "CO": 1600
    }
  }
}
```

**Common Errors**

**Missing arguments**

```json
{ "Success": false, "Error": "args is null", "Data": null }
```

**Missing currency IDs**

```json
{ "Success": false, "Error": "fromCurrencyID or toCurrencyID is null", "Data": null }
```

**Same currency**

```json
{ "Success": false, "Error": "fromCurrencyID and toCurrencyID cannot be the same", "Data": null }
```

**System currency blocked**

```json
{ "Success": false, "Error": "Forbidden currency id", "Data": null }
```

**Amount too small**

```json
{ "Success": false, "Error": "Amount is less than the minimum allowed amount", "Data": null }
```

**Config not found**

```json
{ "Success": false, "Error": "TitlePublicConfiguration is null", "Data": null }
```

**Transfer pairs not configured**

```json
{ "Success": false, "Error": "AllowedCurrencyTransferPairs is not configured", "Data": null }
```

**Pair not in whitelist**

```json
{ "Success": false, "Error": "Transfer pair is not allowed", "Data": null }
```

**Inventory unavailable**

```json
{ "Success": false, "Error": "Inventory.VirtualCurrency is null", "Data": null }
```

**Not enough balance**

```json
{ "Success": false, "Error": "Insufficient funds", "Data": null }
```

**Transfer operation failed**

```json
{ "Success": false, "Error": "Failed to transfer virtual currency", "Data": null }
```

**Post-transfer inventory error**

```json
{ "Success": false, "Error": "Inventory.VirtualCurrency is null after transfer", "Data": null }
```

```json
{ "Success": false, "Error": "TransferVirtualCurrency error: <exception message>", "Data": null }
```

***

#### 6) SubtractVirtualCurrency

Subtracts (burns) a specified amount of virtual currency from the player's balance.

**Request**

**Route** `POST /api/v2/{TitleTemplateId}/{TitleId}/Client/User/SubtractVirtualCurrency/{UserID}`

**Body**

```json
{
  "CurrencyID": "CO",
  "SubtractAmount": 50
}
```

#### **Response (OperationResult\<CurrencyUpdateResponse>)**

```json
{
  "Success": true,
  "Error": null,
  "Data": {
    "CurrencyID": "CO",
    "NewBalance": 1450
  }
}
```

**Common Errors**

**Missing arguments**

```json
{ "Success": false, "Error": "args, currencyId or amount is null", "Data": null }
```

**Amount too small**

```json
{ "Success": false, "Error": "Amount is less than the minimum allowed amount", "Data": null }
```

**Insufficient balance**

```json
{ "Success": false, "Error": "Insufficient funds", "Data": null }
```

**Subtraction failed**

```json
{ "Success": false, "Error": "Failed to subtract virtual currency", "Data": null }
```

> **Note:** On unexpected exceptions, this action throws rather than returning a failure envelope. The error will be: `"Error for UserID: {userId}: <exception message>"`.

***

#### 7) ConsumeItem

Consumes (reduces uses / removes quantity) of an item from the player's inventory. Supports two modes:

* **By `ItemInstanceID`** — targets a specific item instance
* **By `ItemID`** (+ optional `CatalogVersion`) — targets items across all instances of that item type

Equipped items cannot be reduced to 0.

**Request**

**Route** `POST /api/v2/{TitleTemplateId}/{TitleId}/Client/User/ConsumeItem/{UserID}`

**Body (by ItemInstanceID)**

```json
{
  "ItemInstanceID": "I_001",
  "SubtractAmount": 1
}
```

**Body (by ItemID)**

```json
{
  "ItemID": "potion_hp",
  "CatalogVersion": "Item",
  "SubtractAmount": 5
}
```

> `SubtractAmount` defaults to `1` if not provided or ≤ 0. If `CatalogVersion` is omitted, it defaults to `"Item"`.

#### **Response (OperationResult\<ConsumeItemResponse>)**

**By ItemInstanceID:**

```json
{
  "Success": true,
  "Error": null,
  "Data": {
    "ItemInstanceID": "I_001",
    "ItemID": null,
    "CatalogVersion": null,
    "ConsumedAmount": 1
  }
}
```

**By ItemID:**

```json
{
  "Success": true,
  "Error": null,
  "Data": {
    "ItemID": "potion_hp",
    "ItemInstanceID": null,
    "CatalogVersion": "Item",
    "ConsumedAmount": 5
  }
}
```

**Common Errors**

**Missing arguments**

```json
{ "Success": false, "Error": "args is null", "Data": null }
```

**No identifier provided**

```json
{ "Success": false, "Error": "ItemID or ItemInstanceID is required", "Data": null }
```

**Item not found / insufficient / equipped**

```json
{ "Success": false, "Error": "Item not found / not enough amount / equipped item cannot be reduced to 0", "Data": null }
```

**Consume by ItemID failed**

```json
{ "Success": false, "Error": "Not enough items / equipped rule prevented consume / database error", "Data": null }
```

```json
{ "Success": false, "Error": "ConsumeItem error: <exception message>", "Data": null }
```

***

#### 8) DeleteUserAccount

Permanently deletes the player's account and all associated data.

**Request**

**Route** `POST /api/v2/{TitleTemplateId}/{TitleId}/Client/User/DeleteUserAccount/{UserID}`

**Body**

```json
{}
```

#### **Response (OperationResult\<SuccessResponse>)**

```json
{
  "Success": true,
  "Error": null,
  "Data": {
    "IsCompleted": true,
    "ServerTime": "2026-02-09T12:34:56.789Z"
  }
}
```

**Common Errors**

```json
{ "Success": false, "Error": "Failed to Delete User Account", "Data": null }
```

***

#### 9) GetUsageTime

Returns aggregated usage time statistics for the player.

**Request**

**Route** `POST /api/v2/{TitleTemplateId}/{TitleId}/Client/User/GetUsageTime/{UserID}`

**Body**

```json
{}
```

#### **Response (OperationResult\<UsageTimeStats>)**

```json
{
  "Success": true,
  "Error": null,
  "Data": {
    "Today": 45,
    "Yesterday": 120,
    "CurrentWeek": 380,
    "CurrentMonth": 1540,
    "Total": 12500,
    "History": {
      "2026-02-08T00:00:00Z": 120,
      "2026-02-09T00:00:00Z": 45
    }
  }
}
```

**Common Errors**

```json
{ "Success": false, "Error": "Data is null", "Data": null }
```

```json
{ "Success": false, "Error": "GetUserInventory error: <exception message>", "Data": null }
```

> **Note:** The error message references "GetUserInventory" — this is a copy-paste artifact in the source code. The actual action is `GetUsageTime`.

***

#### 10) AddUsageTime

Records additional usage time for the player and returns updated statistics.

**Request**

**Route** `POST /api/v2/{TitleTemplateId}/{TitleId}/Client/User/AddUsageTime/{UserID}`

**Body**

```json
{
  "UsageTime": 15
}
```

> `UsageTime` — the amount of time to add (defined in the base `IGSRequest` class; typically in minutes or seconds — see server implementation).

#### **Response (OperationResult\<UsageTimeStats>)**

```json
{
  "Success": true,
  "Error": null,
  "Data": {
    "Today": 60,
    "Yesterday": 120,
    "CurrentWeek": 395,
    "CurrentMonth": 1555,
    "Total": 12515,
    "History": {
      "2026-02-08T00:00:00Z": 120,
      "2026-02-09T00:00:00Z": 60
    }
  }
}
```

**Common Errors**

```json
{ "Success": false, "Error": "AddUsageTime error: <exception message>", "Data": null }
```

***

### Models (Contracts)

#### UserRequest

The shared request DTO for all User actions. Each action reads only the fields it needs.

```json
{
  "Key": "string",
  "Value": "any",
  "CurrencyID": "string",
  "SubtractAmount": 0,
  "FromCurrencyID": "string",
  "ToCurrencyID": "string",
  "TransferAmount": 1,
  "ItemInstanceID": "string",
  "ItemID": "string",
  "CatalogVersion": "string",
  "UsageTime": 0
}
```

> `UserRequest` extends `IGSRequest`. Fields `ItemID`, `CatalogVersion`, and `UsageTime` are inherited from the base class. `TransferAmount` defaults to `1`. `Value` accepts any JSON type (string, number, object, etc.).

|            Field | Type   | Used by                              | Description                                                       |
| ---------------: | ------ | ------------------------------------ | ----------------------------------------------------------------- |
|            `Key` | string | UpdateCustomUserData                 | Custom data key to update                                         |
|          `Value` | any    | UpdateCustomUserData                 | Value to set for the key (serialized to string server-side)       |
|     `CurrencyID` | string | SubtractVirtualCurrency              | Virtual currency ID to subtract from                              |
| `SubtractAmount` | long   | SubtractVirtualCurrency, ConsumeItem | Amount to subtract/consume. Defaults to `1` if ≤ 0 in ConsumeItem |
| `FromCurrencyID` | string | TransferVirtualCurrency              | Source currency ID                                                |
|   `ToCurrencyID` | string | TransferVirtualCurrency              | Destination currency ID                                           |
| `TransferAmount` | long   | TransferVirtualCurrency              | Amount to transfer (default: `1`)                                 |
| `ItemInstanceID` | string | ConsumeItem                          | Specific item instance to consume                                 |
|         `ItemID` | string | ConsumeItem                          | Item ID to consume (across all instances)                         |
| `CatalogVersion` | string | ConsumeItem                          | Catalog version (defaults to `"Item"` if omitted)                 |
|      `UsageTime` | int    | AddUsageTime                         | Usage time value to record                                        |

#### CurrencyTransferResponse

```json
{
  "FromCurrencyID": "string",
  "ToCurrencyID": "string",
  "TransferAmount": 0,
  "UpdatedVirtualCurrencies": {
    "<CurrencyID>": 0
  }
}
```

#### CurrencyUpdateResponse

```json
{
  "CurrencyID": "string",
  "NewBalance": 0
}
```

#### ConsumeItemResponse

```json
{
  "ItemID": "string",
  "ItemInstanceID": "string",
  "CatalogVersion": "string",
  "ConsumedAmount": 0
}
```

**Notes:**

* When consuming by `ItemInstanceID`: `ItemID` and `CatalogVersion` will be `null`.
* When consuming by `ItemID`: `ItemInstanceID` will be `null`.

#### UsageTimeStats

```json
{
  "Today": 0,
  "Yesterday": 0,
  "CurrentWeek": 0,
  "CurrentMonth": 0,
  "Total": 0,
  "History": {
    "<DateTime>": 0
  }
}
```

#### SuccessResponse

```json
{
  "IsCompleted": true,
  "ServerTime": "2026-02-09T12:34:56.789Z"
}
```

#### CurrencyTransferPair

Used in `TitlePublicConfiguration.AllowedCurrencyTransferPairs` to define permitted transfer directions.

```json
{
  "FromCurrencyID": "string",
  "ToCurrencyID": "string"
}
```

***

### Client Flow (Recommended)

#### A) Bootstrap (App Launch / Login)

1. `GetClientState`

> This single call returns the complete client state. Use it to populate the main screen, inventory, characters, shop, etc.

#### B) Refresh Inventory

1. `GetUserInventory`

> Call after any purchase, consumption, or equipment change to get up-to-date item and currency data.

#### C) Update Custom Data

1. `UpdateCustomUserData` (`Key`, `Value`)

> For saving player preferences, tutorial progress, UI state, etc.

#### D) Transfer Currency

1. `TransferVirtualCurrency` (`FromCurrencyID`, `ToCurrencyID`, `TransferAmount`)
2. *(optional)* `GetUserInventory` (refresh balances)

#### E) Spend Currency

1. `SubtractVirtualCurrency` (`CurrencyID`, `SubtractAmount`)
2. *(optional)* `GetUserInventory` (refresh balances)

#### F) Consume Item

1. `ConsumeItem` (`ItemInstanceID` or `ItemID` + `CatalogVersion`, `SubtractAmount`)
2. *(optional)* `GetUserInventory` (refresh inventory)

#### G) Track Usage Time

1. `AddUsageTime` (`UsageTime`) — call periodically (e.g., every minute)
2. `GetUsageTime` — call to display stats in profile/settings

#### H) Delete Account

1. `DeleteUserAccount`

> ⚠️ This action is irreversible. Show a confirmation dialog before calling.

***

### Config Usage Guide (Client)

#### Currency Transfer Whitelist

Before showing a currency transfer UI, the client should check `AllowedCurrencyTransferPairs` from the title configuration (returned in `GetClientState`). Only pairs explicitly listed are permitted. The direction matters: a pair `{From: "A", To: "B"}` does **not** imply `{From: "B", To: "A"}` is allowed.

#### System Currency IDs

The following currencies are **system-reserved** and cannot be used in `TransferVirtualCurrency`:

* Coin ID (soft currency)
* CoinLimit ID
* Token ID (hard currency)
* TokenLimit ID

The exact IDs are defined by `DefaultData` on the server. If a transfer is attempted with any of these, the server returns `"Forbidden currency id"`.

#### Custom User Data Keys

The client can store arbitrary key-value pairs via `UpdateCustomUserData`, with one restriction: keys that match any value in the `SystemCustomUserDataKey` enum are reserved by the system and will be rejected with `"Incorrect key (system key)"`.

***

### Examples (cURL)

#### GetClientState

```bash
curl -X POST "https://<host>/api/v2/<TitleTemplateId>/<TitleId>/Client/User/GetClientState/<UserID>" \
  -H "Authorization: Bearer <SessionTicket>" \
  -H "Content-Type: application/json" \
  -d "{}"
```

#### GetUserInventory

```bash
curl -X POST "https://<host>/api/v2/<TitleTemplateId>/<TitleId>/Client/User/GetUserInventory/<UserID>" \
  -H "Authorization: Bearer <SessionTicket>" \
  -H "Content-Type: application/json" \
  -d "{}"
```

#### GetCustomUserData

```bash
curl -X POST "https://<host>/api/v2/<TitleTemplateId>/<TitleId>/Client/User/GetCustomUserData/<UserID>" \
  -H "Authorization: Bearer <SessionTicket>" \
  -H "Content-Type: application/json" \
  -d "{}"
```

#### UpdateCustomUserData

```bash
curl -X POST "https://<host>/api/v2/<TitleTemplateId>/<TitleId>/Client/User/UpdateCustomUserData/<UserID>" \
  -H "Authorization: Bearer <SessionTicket>" \
  -H "Content-Type: application/json" \
  -d "{\"Key\":\"preferred_language\",\"Value\":\"en\"}"
```

#### TransferVirtualCurrency

```bash
curl -X POST "https://<host>/api/v2/<TitleTemplateId>/<TitleId>/Client/User/TransferVirtualCurrency/<UserID>" \
  -H "Authorization: Bearer <SessionTicket>" \
  -H "Content-Type: application/json" \
  -d "{\"FromCurrencyID\":\"DICE\",\"ToCurrencyID\":\"CO\",\"TransferAmount\":100}"
```

#### SubtractVirtualCurrency

```bash
curl -X POST "https://<host>/api/v2/<TitleTemplateId>/<TitleId>/Client/User/SubtractVirtualCurrency/<UserID>" \
  -H "Authorization: Bearer <SessionTicket>" \
  -H "Content-Type: application/json" \
  -d "{\"CurrencyID\":\"CO\",\"SubtractAmount\":50}"
```

#### ConsumeItem (by ItemInstanceID)

```bash
curl -X POST "https://<host>/api/v2/<TitleTemplateId>/<TitleId>/Client/User/ConsumeItem/<UserID>" \
  -H "Authorization: Bearer <SessionTicket>" \
  -H "Content-Type: application/json" \
  -d "{\"ItemInstanceID\":\"I_001\",\"SubtractAmount\":1}"
```

#### ConsumeItem (by ItemID)

```bash
curl -X POST "https://<host>/api/v2/<TitleTemplateId>/<TitleId>/Client/User/ConsumeItem/<UserID>" \
  -H "Authorization: Bearer <SessionTicket>" \
  -H "Content-Type: application/json" \
  -d "{\"ItemID\":\"potion_hp\",\"CatalogVersion\":\"Item\",\"SubtractAmount\":5}"
```

#### DeleteUserAccount

```bash
curl -X POST "https://<host>/api/v2/<TitleTemplateId>/<TitleId>/Client/User/DeleteUserAccount/<UserID>" \
  -H "Authorization: Bearer <SessionTicket>" \
  -H "Content-Type: application/json" \
  -d "{}"
```

#### GetUsageTime

```bash
curl -X POST "https://<host>/api/v2/<TitleTemplateId>/<TitleId>/Client/User/GetUsageTime/<UserID>" \
  -H "Authorization: Bearer <SessionTicket>" \
  -H "Content-Type: application/json" \
  -d "{}"
```

#### AddUsageTime

```bash
curl -X POST "https://<host>/api/v2/<TitleTemplateId>/<TitleId>/Client/User/AddUsageTime/<UserID>" \
  -H "Authorization: Bearer <SessionTicket>" \
  -H "Content-Type: application/json" \
  -d "{\"UsageTime\":15}"
```
