# User profile

In addition to basic methods, you can observe and change the user profiles data. A user profile is the set of properties describing the user, which can be divided into 4 groups:

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

1. Cross-platform or custom user identifier. If this identifier is not set by a developer, then the device identifier is used.
2. Automatically collected properties, including data about user's device, geography, app version, SDK, and some other data which can be received from SDK.
3. The default set of user properties, which can be set by a developer. The set of this parameters works with separate methods. This set includes the data of the user's name, sex, age, e-mail, phone number and URL of user picture. Also, this set includes the mark of a user as a cheater.
4. Custom set of user properties. In this case, a developer sets any user data he/she needs to know. The data is set in key-value format and can be numeric, string, array, or boolean. Each project can have up to 30 custom user properties.
   {% endtab %}

{% tab title="Android" %}

1. Cross-platform or custom user identifier. If this identifier is not set by a developer, then the device identifier is used.
2. Automatically collected properties, including data about user's device, geography, app version, SDK, and some other data which can be received from SDK.
3. The default set of user properties, which can be set by a developer. The set of this parameters works with separate methods. This set includes the data of the user's name, sex, age, e-mail, phone number, and URL of user picture. Also, this set includes the mark of a user as a cheater.
4. Custom set of user properties. In this case, a developer sets any user data he/she needs to know. The data is set in key-value format and can be numeric, string, array, or boolean. Each project can have up to 30 custom user properties.
   {% endtab %}

{% tab title="Windows 8.1 and 10" %}

1. Cross-platform or custom user identifier. If this identifier is not set by developer, then the device identifier is used.
2. Automatically collected properties, including data about user's device, geography, app version, SDK, and some other data which can be received from SDK.
3. Default set of user properties, which can be set by developer. The set of this parameters works with separate methods. This set includes the data of user's name, sex, age, e-mail, phone-number and url of user picture. Also this set includes the mark of user as cheater.
4. Custom set of user properties. In this case developer sets any user data he/she needs to know. The data is set in key-value format and can be numeric, string, array or boolean. Each project can have up to 30 custom user properties.
   {% endtab %}

{% tab title="Web" %}

1. Cross-platform or custom user identifier. If this identifier is not set by developer, then the identifier which was set during the initialization is used.
2. Automatically collected properties, including data about user's device, geography, app version, SDK, and some other data which can be received from SDK.
3. Basic set of user properties, which can be set by developer. The set of this parameters works with separate methods. This set includes the data of user's name, sex, age, e-mail, phone-number and url of user picture. Also this set includes the mark of user as cheater.
4. Custom set of user properties. In this case developer sets any user data he/she needs to know. The data is set in key-value format and can be numeric, string, array or boolean. Each project can have up to 30 custom user properties.
   {% endtab %}

{% tab title="Unity" %}

1. Cross-platform or custom user identifier. If this identifier is not set by developer, then the device identifier is used.
2. Automatically collected properties, including data about user's device, geography, app version, SDK, and some other data which can be received from SDK.
3. Default set of user properties, which can be set by developer. The set of this parameters works with separate methods. This set includes the data of user's name, sex, age, e-mail, phone-number and url of user picture. Also this set includes the mark of user as cheater.
4. Custom set of user properties. In this case developer sets any user data he/she needs to know. The data is set in key-value format and can be numeric, string, array or boolean. Each project can have up to 30 custom user properties.
   {% endtab %}

{% tab title="Mac OS" %}

1. Cross-platform or custom user identifier. If this identifier is not set by developer, then the device identifier is used.
2. Automatically collected properties, including data about user's device, geography, app version, SDK, and some other data which can be received from SDK.
3. Default set of user properties, which can be set by developer. The set of this parameters works with separate methods. This set includes the data of user's name, sex, age, e-mail, phone-number and url of user picture. Also this set includes the mark of user as cheater.
4. Custom set of user properties. In this case developer sets any user data he/she needs to know. The data is set in key-value format and can be numeric, string, array or boolean. Each project can have up to 30 custom user properties.
   {% endtab %}

{% tab title="Adobe Air" %}

1. Cross-platform or custom user identifier. If this identifier is not set by developer, then the device identifier is used.
2. Automatically collected properties, including data about user's device, geography, app version, SDK, and some other data which can be received from SDK.
3. Default set of user properties, which can be set by developer. The set of this parameters works with separate methods. This set includes the data of user's name, sex, age, e-mail, phone-number and url of user picture. Also this set includes the mark of user as cheater.
4. Custom set of user properties. In this case developer sets any user data he/she needs to know. The data is set in key-value format and can be numeric, string, array or boolean. Each project can have up to 30 custom user properties.
   {% endtab %}

{% tab title="UE4" %}

1. Cross-platform or custom user identifier. If this identifier is not set by developer, then the device identifier is used.
2. Automatically collected properties, including data about user's device, geography, app version, SDK, and some other data which can be received from SDK.
3. Default set of user properties, which can be set by developer. The set of this parameters works with separate methods. This set includes the data of user's name, sex, age, e-mail, phone-number and url of user picture. Also this set includes the mark of user as cheater.
4. Custom set of user properties. In this case developer sets any user data he/she needs to know. The data is set in key-value format and can be numeric, string, array or boolean. Each project can have up to 30 custom user properties.
   {% endtab %}
   {% endtabs %}

You can segment users by all the properties in My Apps section of an application.

## Cross-platform user ID

{% tabs %}
{% tab title="iOS" %}
This method is used for user initialization in the applications that are the parts of cross-platform project.

We recommend you to apply this method before the SDK initialization, otherwise the user identifier from the previous session will be used since the SDK initialization moment till the *setUserID* method call.

If your cross-platform application is supposed to be used without cross-platform authorization, don't use the *setUserID* method or use the empty string ("") as the user identifier. SDK will assign the unique identifier to user. This identifier will be used until the real cross-platform identifier is assigned to the user.

{% hint style="warning" %}
If your application allows user to re-login (changing the user during the working session of the application), then the *setUserID* method should be called just after the authorization. You don't need to call the SDK initialization one more time.&#x20;
{% endhint %}

```objectivec
/**
* Initializes the user with the specified cross-platform identifier
* @param NSString userId - unique cross-platform user ID used
* for user identification on your server.
*/
[DevToDev setUserId: (NSString *) userId];
```

To see which identifier is used at the moment:

```objectivec
/**
* Returns current cross-platform user id
* @return userId - current cross-platform user id
*/
[DevToDev getUserId];
```

{% endtab %}

{% tab title="Android" %}
This method is used for user initialization in the applications which are the parts of cross-platform project.

We recommend you to apply this method before the SDK initialization, otherwise the user identifier from the previous session will be used since the SDK initialization moment till the *setUserID* method call.

If your cross-platform application supposes to be used without cross-platform authorization, don't use the *setUserID* method or use the empty string ("") as the user identifier. SDK will assign the unique identifier to user. This identifier will we used until the real cross-platform identifier assigns to the user.

{% hint style="warning" %}
If your application allows user to re-login (changing the user during the working session of application), then the *setUserID* method should be called just after the authorization. You don't need to call the SDK initialization one more time.&#x20;
{% endhint %}

```java
/**
* Initializes the user with the specified cross-platform identifier
* @param String userId - unique cross-platform user ID used
* for user identification on your server.
*/
DevToDev.setUserId(String userId);
```

To see which identifier is used at the moment:

```java
/**
* Returns current cross-platform user id
* @return userId - current cross-platform user id (or null, if sdk not initialized)
*/
DevToDev.getUserId();
```

{% endtab %}

{% tab title="Windows 8.1 and 10" %}
This method is used for user initialization in the applications which are the parts of cross-platform project.

We recommend you to apply this method before the SDK initialization, otherwise the user identiticator from the previous session will be used since the SDK initialization moment till the *UserID* property call.

If your cross-platform application supposes to be used without cross-platform authorization, don't use the *UserID* property or use the empty string ("") as the user identifier. SDK will assign the unique identifier to user. This identifier will we used until the real cross-platform identifier assigns to the user.

{% hint style="warning" %}
If your application allows user to re-login (changing the user during the working session of application), then the *UserID* property should be called just after the authorization. You don't need to call the SDK initialization one more time.&#x20;
{% endhint %}

```csharp
/**
* Initializes the user with the specified cross-platform identifier
* property allows to get and to set unique cross-platform user ID used
* for user identification on your server.
*/
DevToDev.SDK.UserId = userId;
```

This property also allows you to see which identifier is used at the moment.
{% endtab %}

{% tab title="Web" %}
This method is used for user initialization in the applications which are the parts of cross-platform project. You also can use this identifier in non-crossplatform projects, but in your app the own unique user identifier is used.

We recommend you to apply this method before the SDK initialization, otherwise the user identifier from the previous session will be used since the SDK initialization moment till the setCrossplatformUserId method call.

If your cross-platform application supposes to be used without cross-platform authorization, don't use the setCrossplatformUserId method or use the empty string ("") as the user identifier. SDK will assign the unique identifier to user. This identifier will be used until the real cross-platform identifier assigns to the user.

```javascript
/**
* Initializes the user with the specified cross-platform identifier
* @param {string} crossplatformUserId - unique cross-platform user ID used
* for user identification on your server.
*/

devtodev.setCrossplatformUserId(crossplatformUserId);
```

{% hint style="warning" %}
If your application allows user to re-login (changing the user during the working session of application), then the setCrossplatformUserId method should be called just after the authorization. You don't need to call the SDK initialization one more time.&#x20;
{% endhint %}

To see which identifier is used at the moment:

```javascript
/**
* Returns current cross-platform user id
* @return crossPlatformUserId - current cross-platform user id
*/

devtodev.getCrossplatformUserId();
```

{% endtab %}

{% tab title="Unity" %}
This method is used for user initialization in the applications which are the parts of cross-platform project.

We recommend you to apply this method before the SDK initialization, otherwise the user identifier from the previous session will be used since the SDK initialization moment till the *UserID* property call.

If your cross-platform application supposes to be used without cross-platform authorization, don't use the *UserID* property or use the empty string ("") as the user identifier. SDK will assign the unique identifier to user. This identifier will we used until the real cross-platform identifier assigns to the user.

{% hint style="warning" %}
If your application allows user to re-login (changing the user during the working session of application), then the *UserID* property should be called just after the authorization. You don't need to call the SDK initialization one more time.
{% endhint %}

```csharp
/// <summary>
/// Initializes the user with the specified cross-platform identifier
/// property allows to get and to set unique cross-platform user ID used
/// for user identification on your server.</summary>
DevToDev.Analytics.UserId = userId;
```

This property also allows you to see which identifier is used at the moment.
{% endtab %}

{% tab title="Mac OS" %}
This method is used for user initialization in the applications which are the parts of cross-platform project.

We recommend you to apply this method before the SDK initialization, otherwise the user identifier from the previous session will be used since the SDK initialization moment till the *setUserID* method call.

If your cross-platform application supposes to be used without cross-platform authorization, don't use the *setUserID* method or use the empty string ("") as the user identifier. SDK will assign the unique identifier to user. This identifier will we used until the real cross-platform identifier assigns to the user.

{% hint style="warning" %}
If your application allows user to re-login (changing the user during the working session of application), then the *setUserID* method should be called just after the authorization. You don't need to call the SDK initialization one more time.&#x20;
{% endhint %}

```objectivec
/**
* Initializes the user with the specified cross-platform identifier
* @param NSString userId - unique cross-platform user ID used
* for user identification on your server.
*/
[DevToDev setUserId: (NSString *) userId];
```

To see which identifier is used at the moment:

```objectivec
/**
* Returns current cross-platform user id
* @return userId - current cross-platform user id
*/
[DevToDev getUserId];
```

{% endtab %}

{% tab title="Adobe Air" %}
This method is used for user initialization in the applications which are the parts of cross-platform project.

We recommend you to apply this method before the SDK initialization, otherwise the user identifier from the previous session will be used since the SDK initialization moment till the *setUserID* method call.

If your cross-platform application supposes to be used without cross-platform authorization, don't use the *setUserID* method or use the empty string ("") as the user identifier. SDK will assign the unique identifier to user. This identifier will we used until the real cross-platform identifier assigns to the user.

{% hint style="warning" %}
If your application allows user to re-login (changing the user during the working session of application), then the *setUserID* method should be called just after the authorization. You don't need to call the SDK initialization one more time.
{% endhint %}

```javascript
/**
* Initializes the user with the specified cross-platform identifier
* @param userId - unique cross-platform user ID used for user identification on your server.
*/
DevToDev.setUserId(userId:String);
```

To see which identifier is used at the moment:

```javascript
/**
* Returns current cross-platform user id
* @return userId - current cross-platform user id (string or null, if sdk not initialized)
*/
DevToDev.getUserId();
```

{% endtab %}

{% tab title="UE4" %}
This method is used for user initialization in the applications which are the parts of cross-platform project.

We recommend you to apply this method before the SDK initialization, otherwise the user identifier from the previous session will be used since the SDK initialization moment till the setUserID method call.

If your cross-platform application supposes to be used without cross-platform authorization, don't use the setUserID method or use the empty string ("") as the user identifier. SDK will assign the unique identifier to user. This identifier will we used until the real cross-platform identifier assigns to the user.

{% hint style="warning" %}
If your application allows user to re-login (changing the user during the working session of application), then the setUserID method should be called just after the authorization. You don't need to call the SDK initialization one more time.
{% endhint %}

**Blueprint**

![](/files/-LnlSivDHI3bsBDqop9L)

| Field   | Type    | Description                   |
| ------- | ------- | ----------------------------- |
| User Id | FString | Unique cross-platform user id |

**Code**

```cpp
// Initializes the user with the specified cross-platform identifier
// FString activeUserId - unique cross-platform user id

FAnalytics::Get().GetDefaultConfiguredProvider()->SetUserID(FString activeUserId);
```

To see which identifier is used at the moment:

**Blueprint**

![](/files/-LnlSivFOX0jnkRC4uTo)

**Code**

```cpp
// Returns current cross-platform user id

FAnalytics::Get().GetDefaultConfiguredProvider()->GetUserID();
```

{% endtab %}
{% endtabs %}

## Replace Cross-platform user ID

{% tabs %}
{% tab title="iOS" %}
If it is possible to replace the user identifier in your application (for example, to make changes in the login/user id for a particular user), use this method at the moment of replacing the identifier.

{% hint style="danger" %}
Don't use this method if you're going to perform the user's re-login.&#x20;
{% endhint %}

```objectivec
/**
* Replaces current cross-platform user id
* Attention! Don't use this method if you're going to perform the user's relogin.
* @param NSString prevUserId - previous cross-platform user ID
* @param NSString userId - new cross-platform user ID
*/
[DevToDev replaceUserId: (NSString *) prevUserId to: (NSString *) userId];
```

{% endtab %}

{% tab title="Android" %}
If it is possible to replace the user identifier in your application (say, to make changes in the login/user id for particular user), use this method at the moment of replacing the identifier.

{% hint style="danger" %}
Don't use this method if you're going to perform the user's re-login.&#x20;
{% endhint %}

```java
/**
* Replaces current cross-platform user id
* Attention! Don't use this method if you're going to perform the user's relogin.
* @param String prevUserId - previous cross-platform user ID
* @param String userId - new cross-platform user ID
*/
DevToDev.replaceUserId(String prevUserId, String userId);
```

{% endtab %}

{% tab title="Windows 8.1 and 10" %}
If it is possible to replace the user identifier in your application (say, to make changes in the login/user id for particular user), use this method at the moment of replacing the identifier.

{% hint style="danger" %}
Don't use this method if you're going to perform the user's re-login.&#x20;
{% endhint %}

```csharp
/**
* Replaces current cross-platform user id
* Attention! Don't use this method if you're going to perform the user's relogin.
* <param name="prevUserId">Old user identifier</param>
* <param name="userId">New user identifier</param>
*/
DevToDev.SDK.ReplaceUserId(string prevUserId, string userId);
```

{% endtab %}

{% tab title="Web" %}
If it is possible to replace the cross-platform user identifier in your application (say, to make changes in the login/user id for particular user), use this method at the moment of replacing the identifier.

{% hint style="danger" %}
Don't use this method if you're going to perform the user's re-login.&#x20;
{% endhint %}

```javascript
/**
* Replaces current cross-platform user id
* Attention! Don't use this method if you're going to perform the user's relogin.
* @param {string} newCrossPlatformID - new cross-platform user ID
*/

devtodev.replaceCrossplatformUserId(newCrossPlatformID);
```

{% endtab %}

{% tab title="Unity" %}
If it is possible to replace the user identifier in your application (say, to make changes in the login/user id for particular user), use this method at the moment of replacing the identifier.

{% hint style="danger" %}
Don't use this method if you're going to perform the user's re-login.&#x20;
{% endhint %}

```csharp
/// <summary> Replaces current cross-platform user id. 
/// Attention! Don't use this method if you're going to perform the user's relogin.</summary>
/// <param name="prevUserId"> Old user identifier </param>
/// <param name="userId"> New user identifier </param>
DevToDev.Analytics.ReplaceUserId(string prevUserId, string userId);
```

{% endtab %}

{% tab title="Mac OS" %}
If it is possible to replace the user identifier in your application (say, to make changes in the login/user id for particular user), use this method at the moment of replacing the identifier.

{% hint style="danger" %}
Don't use this method if you're going to perform the user's re-login.&#x20;
{% endhint %}

```objectivec
/**
* Replaces current cross-platform user id
* Attention! Don't use this method if you're going to perform the user's relogin.
* @param NSString prevUserId - previous cross-platform user ID
* @param NSString userId - new cross-platform user ID
*/
[DevToDev replaceUserId: (NSString *) prevUserId to: (NSString *) userId];
```

{% endtab %}

{% tab title="Adobe Air" %}
If it is possible to replace the user identifier in your application (say, to make changes in the login/user id for particular user), use this method at the moment of replacing the identifier.&#x20;

{% hint style="danger" %}
Don't use this method if you're going to perform the user's re-login.&#x20;
{% endhint %}

```javascript
/**
* Replaces current cross-platform user id
* Attention! Don't use this method if you're going to perform the user's relogin.
* @param prevUserId - previous cross-platform user ID
* @param userId - new cross-platform user ID
*/
DevToDev.replaceUserId(prevUserId:String, userId:String);
```

{% endtab %}

{% tab title="UE4" %}
If it is possible to replace the user identifier in your application (say, to make changes in the login/user id for particular user), use this method at the moment of replacing the identifier.

{% hint style="danger" %}
Don't use this method if you're going to perform the user's re-login.&#x20;
{% endhint %}

***Blueprint***

![](/files/-LnlSivHuib6ScMRM2JZ)

| Field | Type    | Description     |
| ----- | ------- | --------------- |
| From  | FString | Current user Id |
| To    | FString | New user Id     |

**Code**

```cpp
// Replaces cross-platform user id
// FString from - current user id
// FString to - new user id

UDevToDevBlueprintFunctionLibrary::ReplaceUserId(const FString& from, const FString& to);
```

{% endtab %}
{% endtabs %}

## Current user level

{% tabs %}
{% tab title="iOS" %}
This method is used in cross-platform applications and applications with data synchronization.

This method is required for user's level data initialization. We recommend you to use the *setCurrentLevel* method just after the user initialization (using the *setUserID* method).

{% hint style="warning" %}
Don't use the setCurrentLevel method at the moment of user's level up. We recommend you to use the levelUp method in this case.&#x20;
{% endhint %}

```objectivec
/**
* Initializes the current user level. Required if level feature used in the app.
* @param NSUInteger level - current game level of the player.
*/
[DevToDev setCurrentLevel: (NSUInteger) level];
```

{% endtab %}

{% tab title="Android" %}
This method is used in cross-platform applications and applications with data synchronization.

This method is required for user's level data initialization. We recommend you to use the *setCurrentLevel* method just after the user initialization (using the *setUserID* method).

{% hint style="warning" %}
Don't use the setCurrentLevel method at the moment of user's level up. We recommend you to use the levelUp method in this case.&#x20;
{% endhint %}

```java
/**
* Initializes the current user level. Required if level feature used in the app.
* @param int level - current game level of the player.
*/
DevToDev.setCurrentLevel(int level);
```

{% endtab %}

{% tab title="Windows 8.1 and 10" %}
This method is used in cross-platform applications and applications with data synchronization.

This method is required for user's level data initialization. We recommend you to use the *SetCurrentLevel* method just after the user initialization (using the *UserID* method).

{% hint style="warning" %}
Don't use the SetCurrentLevel method at the moment of user's level up. We recommend you to use the levelUp method in this case.&#x20;
{% endhint %}

```csharp
/**
* Initializes the current user level. Required if level feature used in the app.
* <param name="level">Current game level of the player</param>
*/
DevToDev.SDK.SetCurrentLevel(int level);
```

{% endtab %}

{% tab title="Web" %}
If your app uses the user's level mark, we recommend to use this method after every SDK initialization, as soon as data of user's level is available to the application.

```javascript
/**
* Initializes the current user level. Required if level feature used in the app.
* @param {number} currentUserLevel - current game level of the player.
*/

devtodev.setCurrentLevel(currentUserLevel);
```

{% endtab %}

{% tab title="Unity" %}
This method is used in cross-platform applications and applications with data synchronization.

This method is required for user's level data initialization. We recommend you to use the *SetCurrentLevel* method just after the user initialization (using the *UserID* method).

{% hint style="warning" %}
Don't use the SetCurrentLevel method at the moment of user's level up. We recommend you to use the levelUp method in this case.&#x20;
{% endhint %}

```csharp
/// <summary> Initializes the current user level. Required if level feature used in the app. </summary>
/// <param name="level"> current game level of the player </param>
DevToDev.Analytics.SetCurrentLevel(int level);
```

{% endtab %}

{% tab title="Mac OS" %}
This method is used in cross-platform applications and applications with data synchronization.

This method is required for user's level data initialization. We recommend you to use the *setCurrentLevel* method just after the user initialization (using the *setUserID* method).

{% hint style="warning" %}
Don't use the setCurrentLevel method at the moment of user's level up. We recommend you to use the levelUp method in this case.&#x20;
{% endhint %}

```objectivec
/**
* Initializes the current user level. Required if level feature used in the app.
* @param NSUInteger level - current game level of the player.
*/
[DevToDev setCurrentLevel: (NSUInteger) level];
```

{% endtab %}

{% tab title="Adobe Air" %}
This method is used in cross-platform applications and applications with data synchronization.

This method is required for user's level data initialization. We recommend you to use the *setCurrentLevel* method just after the user initialization (using the *setUserID* method).

{% hint style="warning" %}
Don't use the setCurrentLevel method at the moment of user's level up. We recommend you to use the levelUp method in this case.&#x20;
{% endhint %}

```javascript
/**
* Initializes the current user level. Required if level feature used in the app.
* @param level - current game level of the player.
*/
DevToDev.setCurrentLevel(level:int);
```

{% endtab %}

{% tab title="UE4" %}
This method is used in cross-platform applications and applications with data synchronization.

This method is required for user's level data initialization. We recommend you to use the *setCurrentLevel* method just after the user initialization (using the *setUserID* method).

{% hint style="warning" %}
Don't use the setCurrentLevel method at the moment of user's level up. We recommend you to use the levelUp method in this case.&#x20;
{% endhint %}

**Blueprint**

![](/files/-LnlSivJpUzBrMoXn2Ep)

| Field | Type  | Description        |
| ----- | ----- | ------------------ |
| Level | int32 | Current user level |

**Code**

```cpp
// Initializes the current user level
// int32 level - current user level

UDevToDevBlueprintFunctionLibrary::SetCurrentLevel(int32 level)
```

{% endtab %}
{% endtabs %}

## Cheater

In case you have your own methods of determining cheaters in the application, you can have such users marked. Payments made by them will not be taken into account in the statistics.

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

```objectivec
/**
* Mark user if it's cheater.
* @param BOOL isCheater - true if user is a cheater
*/
DevToDev.activeUser.cheater = isCheater;
```

{% endtab %}

{% tab title="Android" %}

```java
/**
* Mark user if it's cheater.
* @param boolean isCheater - true if user is a cheater
*/
DevToDev.getActivePlayer().setCheater(boolean isCheater);
```

{% endtab %}

{% tab title="Windows 8.1 and 10" %}

```csharp
/**
* Mark user if it's cheater.
* <param name="isCheater">true if user is a cheater</param>
*/
DevToDev.SDK.ActiveUser.SetCheater(boolean isCheater);
```

{% endtab %}

{% tab title="Web" %}

```javascript
/**
* Mark user if it's cheater.
* @param {boolean} isCheater - true if user is a cheater
*/

devtodev.user.cheater(isCheater);
```

{% endtab %}

{% tab title="Unity" %}

```csharp
/// <summary> Mark user if it's cheater. </summary>
/// <param name="isCheater"> true if user is a cheater </param>
DevToDev.Analytics.ActiveUser.Cheater = isCheater;
```

{% endtab %}

{% tab title="Mac OS" %}

```objectivec
/**
* Mark user if it's cheater.
* @param BOOL isCheater - true if user is a cheater
*/
DevToDev.activeUser.cheater = isCheater;
```

{% endtab %}

{% tab title="Adobe Air" %}

```javascript
/**
* Mark user if it's cheater.
* @param isCheater - true if user is a cheater
*/
DevToDev.getActiveUser().SetCheater(isCheater:Boolean);
```

{% endtab %}

{% tab title="UE4" %}
**Blueprint**

![](/files/-LnlSivL2BCr9YbxaOzK)

| Field     | Type | Description               |
| --------- | ---- | ------------------------- |
| isCheater | bool | True if user is a cheater |

**Code**

```cpp
UPeopleLibrary::Cheater(bool cheater);
```

{% endtab %}
{% endtabs %}

## Name

User's name. Default user profile property.

{% hint style="warning" %}
We strongly recommend not to use this property because it refers to [personal data](https://gdpr-info.eu/issues/personal-data/).&#x20;
{% endhint %}

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

```objectivec
/**
* Track user's name
* @param NSString name - User's name.
*/
DevToDev.activeUser.name = name;
```

{% endtab %}

{% tab title="Android" %}

```java
/**
* Track user's name
* @param String name - User's name
*/
DevToDev.getActivePlayer().setName(String name);
```

{% endtab %}

{% tab title="Windows 8.1 and 10" %}

```csharp
/**
* Track user's name
* <param name="name">User's name</param>
*/
DevToDev.SDK.ActiveUser.SetName(string name);
```

{% endtab %}

{% tab title="Web" %}

```javascript
/**
* Track user's name
* @param {string} name - User's name.
*/

devtodev.user.name(name);
```

{% endtab %}

{% tab title="Unity" %}

```csharp
/// <summary> Track user's name </summary>
/// <param name="name"> User's name </param>
DevToDev.Analytics.ActiveUser.Name = name;
```

{% endtab %}

{% tab title="Mac OS" %}

```objectivec
/**
* Track user's name
* @param NSString name - User's name.
*/
DevToDev.activeUser.name = name;
```

{% endtab %}

{% tab title="Adobe Air" %}

```javascript
/**
* Track user's name
* @param name - User's name.
*/
DevToDev.getActiveUser().SetName(name:String);
```

{% endtab %}

{% tab title="UE4" %}
**Blueprint**

\--

| **Field** | **Type** | **Description** |
| --------- | -------- | --------------- |
| Name      | FString  | User's name     |

**Code**

```cpp
UPeopleLibrary::Name(const FString& name);
```

{% endtab %}
{% endtabs %}

## Age

User's age in years. Default user profile property.

{% hint style="warning" %}
We strongly recommend not to use this property because it refers to [personal data](https://gdpr-info.eu/issues/personal-data/).&#x20;
{% endhint %}

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

```objectivec
/**
* Track user's age
* @param NSNumber age - User's age
*/
DevToDev.activeUser.age = age;
```

{% endtab %}

{% tab title="Android" %}

```java
/**
* Track user's age
* @param int age - User's age
*/
DevToDev.getActivePlayer().setAge(int age);
```

{% endtab %}

{% tab title="Windows 8.1 and 10" %}

```csharp
/**
* Track user's age
* <param name="age">User's age</param>
*/
DevToDev.SDK.ActiveUser.SetAge(int age);
```

{% endtab %}

{% tab title="Web" %}

```javascript
/**
* Track user's age
* @param {number} age - User's age.
*/

devtodev.user.age(age);
```

{% endtab %}

{% tab title="Unity" %}

```csharp
/// <summary> Track user's age </summary>
/// <param name="age"> User's age </param>
DevToDev.Analytics.ActiveUser.Age = age;
```

{% endtab %}

{% tab title="Mac OS" %}

```objectivec
/**
* Track user's age
* @param NSNumber age - User's age
*/
DevToDev.activeUser.age = age;
```

{% endtab %}

{% tab title="Adobe Air" %}

```javascript
/**
* Track user's age
* @param age - User's age in years
*/
DevToDev.getActiveUser().SetAge(age:int);
```

{% endtab %}

{% tab title="UE4" %}
**Blueprint**

![](/files/-LnlSivSI2XXFhcBXPRC)

| **Field** | **Type** | **Description**     |
| --------- | -------- | ------------------- |
| Age       | int32    | User's age in years |

**Code**

```cpp
UPeopleLibrary::Age(int32 age);
```

{% endtab %}
{% endtabs %}

## Gender

User's gender. Default user profile property.

{% hint style="warning" %}
We strongly recommend not to use this property because it refers to [personal data](https://gdpr-info.eu/issues/personal-data/).&#x20;
{% endhint %}

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

```objectivec
/**
* Track user's
* @param DTDGender gender - User's gender. (Unknown, Male, Female).
*/
DevToDev.activeUser.gender = gender;
```

{% endtab %}

{% tab title="Android" %}

```java
/**
* Track user's gender
* @param Gender gender - User's gender. (Unknown, Male, Female).
*/
DevToDev.getActivePlayer().setGender(Gender gender);
```

{% endtab %}

{% tab title="Windows 8.1 and 10" %}

```csharp
/**
* Track user's gender.
* <param name="gender">User's gender. (Unknown, Male, Female)</param>
*/
DevToDev.SDK.ActiveUser.SetGender(DevToDev.Gender gender);
```

{% endtab %}

{% tab title="Web" %}

```javascript
/**
* Track user's gender
* @param {number} gender - User's gender. (0 - Unknown, 1 - Male, 2 - Female).
*/

devtodev.user.gender(gender);
```

{% endtab %}

{% tab title="Unity" %}

```csharp
/// <summary> Track user's gender </summary>
/// <param name="gender"> User's gender. (Unknown, Male, Female) </param>
DevToDev.Analytics.ActiveUser.Gender = gender;
```

{% endtab %}

{% tab title="Mac OS" %}

```objectivec
/**
* Track user's
* @param DTDGender gender - User's gender. (Unknown, Male, Female).
*/
DevToDev.activeUser.gender = gender;
```

{% endtab %}

{% tab title="Adobe Air" %}

```javascript
/**
* Track user's
* @param gender - User's gender. (Unknown == 0, Male == 1, Female == 2).
*/
DevToDev.getActiveUser().SetGender(gender:int);
```

{% endtab %}

{% tab title="UE4" %}
**Blueprint**

![](/files/-LnlSivVSZY3bx0r-X1Q)

| **Field** | **Type** | **Description**                             |
| --------- | -------- | ------------------------------------------- |
| Gender    | FString  | User's gender ('male', 'female', 'unknown') |

**Code**

```cpp
UPeopleLibrary::Gender(const FString& InGender);
```

{% endtab %}
{% endtabs %}

## E-mail

User's e-mail. Default user profile property.

{% hint style="warning" %}
We strongly recommend not to use this property because it refers to [personal data](https://gdpr-info.eu/issues/personal-data/).&#x20;
{% endhint %}

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

```objectivec
/**
* Track user's e-mail
* @param NSString email - User's e-mail.
*/
DevToDev.activeUser.email = email;
```

{% endtab %}

{% tab title="Android" %}

```java
/**
* Track user's e-mail
* @param String email - User's e-mail.
*/
DevToDev.getActivePlayer().setEmail(String email);
```

{% endtab %}

{% tab title="Windows 8.1 and 10" %}

```csharp
/**
* Track user's e-mail
* <param name="email">User's e-mail</param>
*/
DevToDev.SDK.ActiveUser.SetEmail(string email);
```

{% endtab %}

{% tab title="Web" %}

```javascript
/**
* Track user's e-mail
* @param {string} email - User's e-mail.
*/
devtodev.user.email(email);
```

{% endtab %}

{% tab title="Unity" %}

```csharp
/// <summary> Track user's e-mail </summary>
/// <param name="email"> User's e-mail </param>
DevToDev.Analytics.ActiveUser.Email = email;
```

{% endtab %}

{% tab title="Mac OS" %}

```objectivec
/**
* Track user's e-mail
* @param NSString email - User's e-mail.
*/
DevToDev.activeUser.email = email;
```

{% endtab %}

{% tab title="Adobe Air" %}

```javascript
/**
* Track user's e-mail
* @param email - User's e-mail.
*/
DevToDev.getActiveUser().SetEmail(email:String);
```

{% endtab %}

{% tab title="UE4" %}
**Blueprint**

![](/files/-LnlSivYLHydfKIMMBxw)

| **Field** | **Type** | **Description** |
| --------- | -------- | --------------- |
| Email     | FString  | User's e-mail   |

**Code**

```cpp
UPeopleLibrary::Email(const FString& email);
```

{% endtab %}
{% endtabs %}

## Phone number

User's phone. Default user profile property.

{% hint style="warning" %}
We strongly recommend not to use this property because it refers to [personal data](https://gdpr-info.eu/issues/personal-data/).&#x20;
{% endhint %}

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

```objectivec
/**
* Track user's phone number
* @param NSString phoneNumber - User's phone number.
*/
DevToDev.activeUser.phone = phoneNumber;
```

{% endtab %}

{% tab title="Android" %}

```java
/**
* Track user's phone number
* @param String phoneNumber - User's phone number.
*/
DevToDev.getActivePlayer().setPhone(String phoneNumber);
```

{% endtab %}

{% tab title="Windows 8.1 and 10" %}

```csharp
/**
* Track user's phone number
* <param name="phoneNumber">User's phone number</param>
*/
DevToDev.SDK.ActiveUser.SetPhone(string phoneNumber);
```

{% endtab %}

{% tab title="Web" %}

```javascript
/**
* Track user's phone number
* @param {string} phone_number - User's phone number.
*/

devtodev.user.phone(phone_number);
```

{% endtab %}

{% tab title="Unity" %}

```csharp
/// <summary> Track user's phone number </summary>
/// <param name="phoneNumber"> User's phone number </param>
DevToDev.Analytics.ActiveUser.Phone = phoneNumber;
```

{% endtab %}

{% tab title="Mac OS" %}

```objectivec
/**
* Track user's phone number
* @param NSString phoneNumber - User's phone number.
*/
DevToDev.activeUser.phone = phoneNumber;
```

{% endtab %}

{% tab title="Adobe Air" %}

```javascript
/**
* Track user's phone number
* @param phoneNumber - User's phone number.
*/
DevToDev.getActiveUser().SetPhone(phoneNumber:String);
```

{% endtab %}

{% tab title="UE4" %}
**Blueprint**

![](/files/-LnlSiv_UDzH-njJXlUj)

| **Field** | **Type** | **Description** |
| --------- | -------- | --------------- |
| Phone     | FString  | User's phone    |

**Code**

```cpp
UPeopleLibrary::Phone(const FString& phone);
```

{% endtab %}
{% endtabs %}

## Photo

User's photo URL. Default user profile property.

{% hint style="warning" %}
We strongly recommend not to use this property because it refers to [personal data](https://gdpr-info.eu/issues/personal-data/).&#x20;
{% endhint %}

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

```objectivec
/**
* Track user's photo URL
* @param NSString photoUrl - User's photo URL.
*/
DevToDev.activeUser.photo = photoUrl;
```

{% endtab %}

{% tab title="Android" %}

```java
/**
* Track user's photo URL
* @param String photoUrl - User's photo url.
*/
DevToDev.getActivePlayer().setPhoto(String photoUrl);
```

{% endtab %}

{% tab title="Windows 8.1 and 10" %}

```csharp
/**
* Track user's photo URL
* <param name="photoUrl">User's photo url</param>
*/
DevToDev.SDK.ActiveUser.SetPhoto(string photoUrl);
```

{% endtab %}

{% tab title="Web" %}

```javascript
/**
* Track user's photo URL
* @param {string} photo_url - User's phone number.
*/

devtodev.user.photo(photo_url);
```

{% endtab %}

{% tab title="Unity" %}

```csharp
/// <summary> Track user's photo URL </summary>
/// <param name="photoUrl"> User's photo url </param>
DevToDev.Analytics.ActiveUser.Photo = photoUrl;
```

{% endtab %}

{% tab title="Mac OS" %}

```objectivec
/**
* Track user's photo URL
* @param NSString photoUrl - User's photo URL.
*/

DevToDev.activeUser.photo = photoUrl;
```

{% endtab %}

{% tab title="Adobe Air" %}

```javascript
/**
* Track user's photo URL
* @param photoUrl - User's photo url.
*/
DevToDev.getActiveUser().SetPhoto(photoUrl:String);
```

{% endtab %}

{% tab title="UE4" %}
**Blueprint**

![](/files/-LnlSivb8KoQ8eyMCS8Q)

| **Field** | **Type** | **Description**   |
| --------- | -------- | ----------------- |
| Photo     | FString  | User's photo URL. |

**Code**

```cpp
UPeopleLibrary::Photo(const FString& photo);
```

{% endtab %}
{% endtabs %}

## Custom user property

Each project in devtodev can have up to 30 custom user properties.Here is how you can set properties on the current user profile:

{% hint style="warning" %}
Attention! We strongly recommend that you do not use these properties to transfer and store data that fits the definition of [personal data](https://gdpr-info.eu/issues/personal-data/)!
{% endhint %}

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

```objectivec
/**
 * Set properties on a user data.
 *
 * ### Usage:
 *     [DevToDev.activeUser setUserDataWithKey:@"Hair color" andValue: @"copper red"];
 *  properties can have string, integer, date or list type
 *
 * @param NSString key - the name of the property
 * @param {*} value -  a value to set on the given property
 */
[DevToDev.activeUser setUserDataWithKey: (NSString *) key andValue: (id) value];

/**
 * Set multiple properties at once
 *
 * ### Usage:
 *     [DevToDev.activeUser setUserData:@{
 *         @"Hair color"   : @"blonde",
 *           @"Last payment" : 100,
 *           @"Last order"   : @[ 
 *             @"Coloring",
 *             @"Hair Straightening"
 *         ],
 *         @"Order date"   : [NSDate date]
 *     }];
 *  properties can have string, integer, date or list type
 *
 * @param NSDictionary userData - an associative array of names and values.
 */
[DevToDev.activeUser setUserData: (NSDictionary *) userData];
```

{% endtab %}

{% tab title="Android" %}

```java
/**
 * Set properties on a user data.
 *
 * ### Usage:
 *     DevToDev.getActivePlayer().setUserData("Hair color", "copper red");
 *  properties can have String, Number or Collection type
 *
 * @param String key - the name of the property
 * @param {*} value -  a value to set on the given property
 */
DevToDev.getActivePlayer().setUserData(String key, Object value);

/**
 * Set multiple properties at once
 *
 * ### Usage:
 *     final Map<String, Object> userData = new HashMap<String, Object>();
 *     userData.put("Hair color", "blonde");
 *     userData.put("Last payment", 100);
 *     final List<Object> lastOrder = new ArrayList<Object>();
 *     lastOrder.add("Coloring");
 *     lastOrder.add("Hair Straightening");
 *     userData.put("Last order", lastOrder);
 *     DevToDev.getActivePlayer().setUserData(userData);
 *  properties can have String, Number or Collection type
 *
 * @param Map<String, Object> userData - an associative array of names and values.
 */
DevToDev.getActivePlayer().setUserData(final Map<String, Object> userData);
```

{% endtab %}

{% tab title="Windows 8.1 and 10" %}

```csharp
/**
 * Set properties on a user data.
 *
 * ### Usage:
 *     DevToDev.SDK.ActiveUser.SetUserData("Hair color", "copper red");
 *  properties can have string, int, double or List<object> type
 *
 * <param name="key">property name</param>
 * <param name="value">a value to set on the given property</param>
 */
DevToDev.SDK.ActiveUser.SetUserData(string key, object value);

/**
 * Set multiple properties at once
 *
 * ### Usage:
 *     Dictionary<string, object> userData = new Dictionary<string, object>();
 *     userData.Add("Hair color", "blonde");
 *       userData.Add("Last payment", 100);
 *     List<object> lastOrder = List<object>();
 *     lastOrder.Add("Coloring");
 *     lastOrder.Add("Hair Straightening");
 *     userData.Add("Last order", lastOrder);
 *     DevToDev.SDK.ActiveUser.SetUserData(userData);
 *  properties can have string, int, double or List<object> type
 *
 * <param name="userData">an associative array of names and values</param>
 */
DevToDev.SDK.ActiveUser.SetUserData(Dictionary<string, object> userData);
```

{% endtab %}

{% tab title="Web" %}

```javascript
/*
 * Set properties on a user data.
 *
 * ### Usage:
 *     devtodev.user.set('Hair color', 'copper red');
 *
 *     // to set multiple properties at once
 *     devtodev.user.set({
 *         'Hair color': 'blonde',
 *            'Last payment': 100,
 *            'Last order': ['Coloring','Hair Straightening'],
 *         'Order date': new Date()
 *     });
 *     // properties can be strings, integers, dates, or lists
 *
 * @param {Object|String} prop If a string, this is the name of the property. If an object, this is an associative array of names and values.
 * @param {*} [val] A value to set on the given property
 */
devtodev.user.set(prop, val);
```

{% endtab %}

{% tab title="Unity" %}

```csharp
/// <summary> Set properties on a user data. </summary>
/// <example> Usage:
/// 
///     DevToDev.Analytics.ActiveUser.SetUserData("Hair color", "copper red");
///     //properties can have string, int, double or List<object> type
/// 
/// </example>
/// <param name="key">property name</param>
/// <param name="value">a value to set on the given property</param>
DevToDev.Analytics.ActiveUser.SetUserData(string key, object value);

/// <summary> Set multiple properties at once. </summary>
/// <example> Usage:
/// 
///     Dictionary<string, object> userData = new Dictionary<string, object>();
///     userData.Add("Hair color", "blonde");
///     userData.Add("Last payment", 100);
///     List<object> lastOrder = List<object>();
///     lastOrder.Add("Coloring");
///     lastOrder.Add("Hair Straightening");
///     userData.Add("Last order", lastOrder);
///     DevToDev.Analytics.ActiveUser.SetUserData(userData);
///     //properties can have string, int, double or List<object> type
/// 
/// </example>
/// <param name="userData">an associative array of names and values</param>
DevToDev.Analytics.ActiveUser.SetUserData(Dictionary<string, object> userData);
```

{% endtab %}

{% tab title="Mac OS" %}

```objectivec
/**
 * Set properties on a user data.
 *
 * ### Usage:
 *     [DevToDev.activeUser setUserDataWithKey:@"Hair color" andValue: @"copper red"];
 *  properties can have string, integer, date or list type
 *
 * @param NSString key - the name of the property
 * @param {*} value -  a value to set on the given property
 */
[DevToDev.activeUser setUserDataWithKey: (NSString *) key andValue: (id) value];

/**
 * Set multiple properties at once
 *
 * ### Usage:
 *     [DevToDev.activeUser setUserData:@{
 *         @"Hair color"   : @"blonde",
 *           @"Last payment" : 100,
 *           @"Last order"   : @[ 
 *             @"Coloring",
 *             @"Hair Straightening"
 *         ],
 *         @"Order date"   : [NSDate date]
 *     }];
 *  properties can have string, integer, date or list type
 *
 * @param NSDictionary userData - an associative array of names and values.
 */
[DevToDev.activeUser setUserData: (NSDictionary *) userData];
```

{% endtab %}

{% tab title="Adobe Air" %}

```javascript
/**
 * Set properties on a user data.
 * ### Usage:
 *     DevToDev.getActiveUser().SetUserData("Hair color", "copper red");
 *  properties can have String, Number or Array type
 *
 * @param key - the name of the property
 * @param value -  a value to set on the given property
 */
DevToDev.getActiveUser().SetUserData(key:String, value:Object);

/**
 * Set multiple properties at once
 *
 * ### Usage:
 *     var userData:Dictionary = new Dictionary();
 *     userData["Hair color"] = "blonde";
 *       userData["Last payment"] = 100;
 *     var lastOrder:Array = new Array();
 *     lastOrder.push("Coloring");
 *     lastOrder.push("Hair Straightening");
 *     userData["Last order"] = lastOrder;
 *     DevToDev.getActiveUser().SetUserDataMany(userData);
 *  properties can have String, Number or Collection type
 *
 * @param userData - an associative array of names and values.
 */
DevToDev.getActiveUser().SetUserDataMany(userData:Dictionary);
```

{% endtab %}

{% tab title="UE4" %}
**Blueprint**

![](/files/-LnlSivfxUvHdGU-tp1Q)

| Field      | Type                         | Description                                                                                          |
| ---------- | ---------------------------- | ---------------------------------------------------------------------------------------------------- |
| Attributes | TArray\<FAnalyticsEventAttr> | Key-value array to set custom property, where key is a user property name, value is a property value |

**Code**

```cpp
UPeopleLibrary::SetUserData(const TArray<FAnalyticsEventAttr>& Attributes);
```

{% endtab %}
{% endtabs %}

## Increment of the custom property

Increments the given numeric properties by the given values.

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

```objectivec
/**
 * Increments or decrements numeric user's properties.
 * ### Usage:
 *     [DevToDev.activeUser incrementWithKey: @"Rounds played" andValue: 1];
 *
 *     // to decrement a counter, pass a negative number
 *     [DevToDev.activeUser incrementWithKey: @"Rounds played" andValue: -1];
 *
 * @param NSString key - the name of the property
 * @param NSNumber value - an amount to increment the given property
 */
[DevToDev.activeUser incrementWithKey: (NSString *) key andValue: (id) value];

/**
 * Increments or decrements multiple numeric user's properties at once.
 *  ### Usage:
 *     [DevToDev.activeUser increment: @{
 *         @"Rounds played"  : 1,
 *         @"Enemies killed" : 6
 *     }];
 *
 * @param NSDictionary values - an associative array of property names and numeric values.
 */
[DevToDev.activeUser increment: (NSDictionary *) values];
```

{% endtab %}

{% tab title="Android" %}

```java
/**
 * Increments or decrements numeric user's properties.
 * ### Usage:
 *     DevToDev.getActivePlayer().increment("Rounds played", 1);
 *
 *     // to decrement a counter, pass a negative number
 *     DevToDev.getActivePlayer().increment("Rounds played", -1);
 *
 * @param String key - the name of the property
 * @param Number value - an amount to increment the given property
 */
DevToDev.getActivePlayer().increment(String key, Number value);

/**
 * Increments or decrements multiple numeric user's properties at once.
 *  ### Usage:
 *     final Map<String, Number> data = new HashMap<String, Number>();
 *     data.put("Rounds played", 1);
 *     data.put("Enemies killed", 6);
 *     DevToDev.getActivePlayer().increment(data);
 *
 * @param Map<String, Number> values - an associative array of property names and numeric values.
 */
DevToDev.getActivePlayer().increment(final Map<String, Number> data);
```

{% endtab %}

{% tab title="Windows 8.1 and 10" %}

```csharp
/**
 * Increments or decrements numeric user's properties.
 * ### Usage:
 *     DevToDev.SDK.ActiveUser.Increment("Rounds played", 1);
 *
 *     // to decrement a counter, pass a negative number
 *     DevToDev.SDK.ActiveUser.Increment("Rounds played", -1);
 *
 * <param name="key">property name</param>
 * <param name="value">an amount to increment the given property(int or double)</param>
 */
DevToDev.SDK.ActiveUser.Increment(string key, object value);

/**
 * Increments or decrements multiple numeric user's properties at once.
 *  ### Usage:
 *     Dictionary<string, object> data = new Dictionary<string, object>();
 *     data.Add("Rounds played", 1);
 *     data.Add("Enemies killed", 6);
 *     DevToDev.SDK.ActiveUser.Increment(data);
 *
 * <param name="values">an associative array of property names and numeric(int, double) values</param>
 */
DevToDev.SDK.ActiveUser.Increment(Dictionary<string, object>  values);
```

{% endtab %}

{% tab title="Web" %}

```javascript
/*
 * Increments or decrements numeric user's properties.
 * ### Usage:
 *     devtodev.user.increment('Rounds played', 1);
 *     // or if you're just incrementing a counter by 1, you can simply do
 *     devtodev.user.increment('Rounds played');
 *
 *     // to decrement a counter, pass a negative number
 *     devtodev.user.increment('Rounds played', -1);
 *
 *     // you can increment multiple properties at once:
 *     devtodev.user.increment({
 *         'Rounds played': 1,
 *         'Enemies killed': 6
 *     });
 * @param {Object|String} prop If a string, this is the name of the property. If an object, this is an associative array of names and numeric values.
 * @param {Number} [val] An amount to increment the given property
 */
devtodev.user.increment(prop, val);
```

{% endtab %}

{% tab title="Unity" %}

```csharp
/// <summary> Increments or decrements numeric user's properties.</summary>
/// <example> Usage:
/// 
///     DevToDev.Analytics.ActiveUser.Increment("Rounds played", 1);
///     //to decrement a counter, pass a negative number
///     DevToDev.Analytics.ActiveUser.Increment("Rounds played", -1);
/// 
/// </example>
/// <param name="key">property name</param>
/// <param name="value">an amount to increment the given property(int or double)</param>
DevToDev.Analytics.ActiveUser.Increment(string key, object value);

/// <summary> Increments or decrements multiple numeric user's properties at once.</summary>
/// <example> Usage:
/// 
///     Dictionary<string, object> data = new Dictionary<string, object>();
///     data.Add("Rounds played", 1);
///     data.Add("Enemies killed", 6);
///     DevToDev.Analytics.ActiveUser.Increment(data);
/// 
/// </example>
/// <param name="values">an associative array of property names and numeric(int, double) values</param>
DevToDev.Analytics.ActiveUser.Increment(Dictionary<string, object>  values);
```

{% endtab %}

{% tab title="Mac OS" %}

```objectivec
/**
 * Increments or decrements numeric user's properties.
 * ### Usage:
 *     [DevToDev.activeUser incrementWithKey: @"Rounds played" andValue: 1];
 *
 *     // to decrement a counter, pass a negative number
 *     [DevToDev.activeUser incrementWithKey: @"Rounds played" andValue: -1];
 *
 * @param NSString key - the name of the property
 * @param NSNumber value - an amount to increment the given property
 */
[DevToDev.activeUser incrementWithKey: (NSString *) key andValue: (id) value];

/**
 * Increments or decrements multiple numeric user's properties at once.
 *  ### Usage:
 *     [DevToDev.activeUser increment: @{
 *         @"Rounds played"  : 1,
 *         @"Enemies killed" : 6
 *     }];
 *
 * @param NSDictionary values - an associative array of property names and numeric values.
 */
[DevToDev.activeUser increment: (NSDictionary *) values];
```

{% endtab %}

{% tab title="Adobe Air" %}

```javascript
/**
 * Increments or decrements numeric user's properties.
 * ### Usage:
 *     DevToDev.getActiveUser().Increment("Rounds played", 1);
 *
 *     // to decrement a counter, pass a negative number
 *     DevToDev.getActiveUser().Increment("Rounds played", -1);
 *
 * @param key - the name of the property
 * @param value - an amount to increment the given property
 */
DevToDev.getActiveUser().Increment(key:String, value:Number);

/**
 * Increments or decrements multiple numeric user's properties at once.
 *  ### Usage:
 *     var data:Dictionary = new Dictionary();
 *     data["Rounds played"] = 1;
 *     data["Enemies killed"] 6;
 *     DevToDev.getActivePlayer().IncrementMany(data);
 *
 * @param values - an associative array of property names and numeric values.
 */
DevToDev.getActiveUser().IncrementMany(data:Dictionary);
```

{% endtab %}

{% tab title="UE4" %}
**Blueprint**

![](/files/-LnlSivjP3NrWx33-sl3)

| Field      | Type                         | Description                                                                 |
| ---------- | ---------------------------- | --------------------------------------------------------------------------- |
| Attributes | TArray\<FAnalyticsEventAttr> | Key-value array, where key is a user property name, value is increment step |

**Code**

```cpp
UPeopleLibrary::IncrementUserData(const TArray<FAnalyticsEventAttr>& Attributes);
```

{% endtab %}
{% endtabs %}

## Append to custom property (deprecated)

Adds values to a list-valued property. If the property does not currently exist, it will be created with the given list as it's value. If the property exists and is not list-valued, the append will be ignored.

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

```objectivec
/**
* Append values to list properties.
* @param NSString key - property name
* @param {NSString|NSNumber|NSNull|NSDictionary|NSDate|NSURL} value - appending value
*/
[DevToDev.activeUser appendWithKey: (NSString *) key andValue: (id) value];

/**
 * Multiple append list-valued properties at once
 * @param NSDictionary values - an associative array of property names and values.
 */
[DevToDev.activeUser append: (NSDictionary *) values];
```

{% endtab %}

{% tab title="Android" %}

```java
/**
* Append values to list properties.
* @param String key - property name
* @param {String|Number|null|Collection|Map|Date|Url} value - appending value
*/
DevToDev.getActivePlayer().append(String key, Object value);

/**
 * Multiple append list-valued properties at once
 * @param Map<String, Object> values - an associative array of property names and values.
 */
DevToDev.getActivePlayer().append(final Map<String, Object> data);
```

{% endtab %}

{% tab title="Windows 8.1 and 10" %}

```csharp
/**
* Append values to list properties.
* <param name="key">property name</param>
* <param name="value">appending value of type {string|int|double|List}</param>
*/
DevToDev.SDK.ActiveUser.Append(string key, object value);

/**
 * Multiple append list-valued properties at once
 * <param name="values">an associative array of property names and values</param>
 */
DevToDev.SDK.ActiveUser.Append(Dictionary<string, object> values);
```

{% endtab %}

{% tab title="Web" %}

{% endtab %}

{% tab title="Unity" %}

```csharp
/// <summary> Append values to list properties. </summary>
/// <param name="key"> Property name </param>
/// <param name="value"> Appending value of type {string|int|double|List} </param>
DevToDev.Analytics.ActiveUser.AppendUserData(string key, object value);

/// <summary> Multiple append list-valued properties at once </summary>
/// <param name="values"> An associative array of property names and values </param>
DevToDev.Analytics.ActiveUser.AppendUserData(Dictionary<string, object> values);
```

{% endtab %}

{% tab title="Mac OS" %}

```objectivec
/**
* Append values to list properties.
* @param NSString key - property name
* @param {NSString|NSNumber|NSNull|NSArray|NSDictionary|NSDate|NSURL} value - appending value
*/
[DevToDev.activeUser appendWithKey: (NSString *) key andValue: (id) value];

/**
 * Multiple append list-valued properties at once
 * @param NSDictionary values - an associative array of property names and values.
 */
[DevToDev.activeUser append: (NSDictionary *) values];
```

{% endtab %}

{% tab title="Adobe Air" %}

```javascript
/**
* Append values to list properties.
* @param key - property name
* @param value - appending value (String|Number|Array)
*/
DevToDev.getActiveUser().AppendUserData(key:String, value:Object);

/**
 * Multiple append list-valued properties at once
 * @param values - an associative array of property names and values.
 */
DevToDev.getActiveUser().AppendUserDataMany(data:Dictionary);
```

{% endtab %}

{% tab title="UE4" %}

{% endtab %}
{% endtabs %}

## Union with custom property (deprecated)

Adds values to a list-valued property only if they are not already present in the list. If the property does not currently exist, it will be created with the given list as it's value. If the property exists and is not list-valued, the union will be ignored.

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

```objectivec
/**
* Union a given list with a list-valued property, excluding duplicate values.
* @param NSString key - property name
* @param {NSString|NSNumber|NSNull|NSDictionary|NSDate|NSURL} value - appending value
*/
[DevToDev.activeUser unionWithKey: (NSString *) key andValue: (id) value];

/**
 * Multiple union of a given lists with a list-valued properties at once
 * @param NSDictionary values - an associative array of property names and values.
 */
[DevToDev.activeUser unionWithData: (NSDictionary *) values];
```

{% endtab %}

{% tab title="Android" %}

```java
/**
* Union a given list with a list-valued property, excluding duplicate values.
* @param String key - property name
* @param {String|Number|null|Collection|Map|Date|Url} value - appending value
*/
DevToDev.getActivePlayer().union(String key, Object value);

/**
 * Multiple union of a given lists with a list-valued properties at once
 * @param Map values - an associative array of property names and values.
 */
```

{% endtab %}

{% tab title="Windows 8.1 and 10" %}

```csharp
/**
* Union a given list with a list-valued property, excluding duplicate values.
* <param name="key">property name</param>
* <param name="value">appending value of type {string|int|double|List}</param>
*/
DevToDev.SDK.ActiveUser.Union(string key, object value);

/**
 * Multiple union of a given lists with a list-valued properties at once
 * <param name="values">an associative array of property names and values</param>
 */
DevToDev.SDK.ActiveUser.Union(Dictionary<string, object> values);
```

{% endtab %}

{% tab title="Web" %}

{% endtab %}

{% tab title="Unity" %}

```csharp
/// <summary> Union a given list with a list-valued property, excluding duplicate values. </summary>
/// <param name="key"> Property name </param>
/// <param name="value"> Appending value of type {string|int|double|List} </param>
DevToDev.Analytics.ActiveUser.AppendUserData(string key, object value);

/// <summary> Multiple union of a given lists with a list-valued properties at once </summary>
/// <param name="values"> An associative array of property names and values </param>
DevToDev.Analytics.ActiveUser.AppendUserData(Dictionary<string, object> values);
```

{% endtab %}

{% tab title="Mac OS" %}

```objectivec
/**
* Union a given list with a list-valued property, excluding duplicate values.
* @param NSString key - property name
* @param {NSString|NSNumber|NSNull|NSArray|NSDictionary|NSDate|NSURL} value - appending value
*/
[DevToDev.activeUser unionWithKey: (NSString *) key andValue: (id) value];

/**
 * Multiple union of a given lists with a list-valued properties at once
 * @param NSDictionary values - an associative array of property names and values.
 */
[DevToDev.activeUser unionWithData: (NSDictionary *) values];
```

{% endtab %}

{% tab title="Adobe Air" %}

```javascript
/**
* Union a given list with a list-valued property, excluding duplicate values.
* @param key - property name
* @param value - appending value (String|Number|Array)
*/
DevToDev.getActiveUser().UnionUserData(key:String, value:Object);

/**
 * Multiple union of a given lists with a list-valued properties at once
 * @param values - an associative array of property names and values.
 */
DevToDev.getActiveUser().UnionUserDataMany(data:Dictionary);
```

{% endtab %}

{% tab title="UE4" %}

{% endtab %}
{% endtabs %}

## Removing of the custom property

Removes a property or a list of properties and their values from the current user's profile.

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

```objectivec
/**
 * Removes property from user data.
 *
 * ### Usage:
 *     [DevToDev.activeUser unsetUserDataWithKey: @"Hair color"];
 *
 * @param NSString key - the name of the property
 */
[DevToDev.activeUser unsetUserDataWithKey: (NSString *) key];

/**
 * Removes multiple properties from user data at once.
 *
 * ### Usage:
 *     [DevToDev.activeUser unsetUserData: @[ @"Hair color", @"blonde", @"Last payment" ]];
 *
 * @param NSArray keys - an array of property names.
 */
[DevToDev.activeUser unsetUserData: (NSArray *) keys];
```

{% endtab %}

{% tab title="Android" %}

```java
/**
 * Removes property from user data.
 *
 * ### Usage:
 *     DevToDev.getActivePlayer().unsetUserData("Hair color");
 *
 * @param String key - the name of the property
 */
DevToDev.getActivePlayer().unsetUserData(String key);

/**
 * Removes multiple properties from user data at once.
 *
 * ### Usage:
 *     final List<String> unsetData = new ArrayList<String>();
 *     unsetData.add("Hair color");
 *     unsetData.add("Last payment");
 *     DevToDev.getActivePlayer().unsetUserData(unsetData);
 *
 * @param List keys - an array of property names.
 */
DevToDev.getActivePlayer().unsetUserData(final List<String> keys);
```

{% endtab %}

{% tab title="Windows 8.1 and 10" %}

```csharp
/**
 * Removes property from user data.
 *
 * ### Usage:
 *     DevToDev.SDK.ActiveUser.UnsetUserData("Hair color");
 *
 * <param name="key">the name of the property</param>
 */
DevToDev.SDK.ActiveUser.UnsetUserData(string key);

/**
 * Removes multiple properties from user data at once.
 *
 * ### Usage:
 *     List<string> unsetData = new List<string>();
 *     unsetData.add("Hair color");
 *     unsetData.add("Last payment");
 *     DevToDev.SDK.ActiveUser.UnsetUserData(unsetData);
 *
 * <param name="keys">an array of property names</param>
 */
DevToDev.SDK.ActiveUser.UnsetUserData(List<string> keys);
```

{% endtab %}

{% tab title="Web" %}

```javascript
/*
 * Removes properties from a user data.
 *
 * ### Usage:
 *     devtodev.user.remove('Hair color');
 *
 *     // to set multiple properties at once
 *     devtodev.user.remove(['Hair color', 'blonde', 'Last payment']);
 *
 * @param {Array|String} prop If a string, this is the name of the property. If an array, this is an array of names.
 */
devtodev.user.remove(prop);
```

{% endtab %}

{% tab title="Unity" %}

```csharp
/// <summary> Removes property from user data. </summary>
/// <example> Usage:
/// 
///     DevToDev.Analytics.ActiveUser.UnsetUserData("Hair color");
/// 
/// </example>
/// <param name="key"> The name of the property </param>
DevToDev.Analytics.ActiveUser.UnsetUserData(string key);

/// <summary> Removes multiple properties from user data at once. </summary>
/// <example> Usage:
/// 
///     List<string> unsetData = new List<string>();
///     unsetData.add("Hair color");
///     unsetData.add("Last payment");
///     DevToDev.Analytics.ActiveUser.UnsetUserData(unsetData);
/// 
/// </example>
/// <param name="keys"> An array of property names </param>
DevToDev.Analytics.ActiveUser.UnsetUserData(List<string> keys);
```

{% endtab %}

{% tab title="Mac OS" %}

```objectivec
/**
 * Removes property from user data.
 *
 * ### Usage:
 *     [DevToDev.activeUser unsetUserDataWithKey: @"Hair color"];
 *
 * @param NSString key - the name of the property
 */
[DevToDev.activeUser unsetUserDataWithKey: (NSString *) key];

/**
 * Removes multiple properties from user data at once.
 *
 * ### Usage:
 *     [DevToDev.activeUser unsetUserData: @[ @"Hair color", @"blonde", @"Last payment" ]];
 *
 * @param NSArray keys - an array of property names.
 */
[DevToDev.activeUser unsetUserData: (NSArray *) keys];
```

{% endtab %}

{% tab title="Adobe Air" %}

```javascript
/**
 * Removes property from user data.
 * ### Usage:
 *     DevToDev.getActiveUser().UnsetUserData("Hair color");
 *
 * @param key - the name of the property
 */
DevToDev.getActiveUser().UnsetUserData(key:String);

/**
 * Removes multiple properties from user data at once.
 * ### Usage:
 *     var unsetData:Array = new Array();
 *     unsetData.push("Hair color");
 *     unsetData.push("Last payment");
 *     DevToDev.getActiveUser().UnsetUserDataMany(unsetData);
 *
 * @param keys - an array of property names.
 */
DevToDev.getActiveUser().UnsetUserDataMany(keys:Array);
```

{% endtab %}

{% tab title="UE4" %}
**Blueprint**

![](/files/-LnlSivpFU2txQbkhig7)

| Field      | Type             | Description                               |
| ---------- | ---------------- | ----------------------------------------- |
| Attributes | TArray\<FString> | An array of property names to be removed. |

**Code**

```cpp
UPeopleLibrary::UnsetUserData(const TArray<FString>& Attributes);
```

{% endtab %}
{% endtabs %}

## Clearing of the all custom properties

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

```objectivec
/**
 * Removes all user's custom personal data from devtodev data base.
 */
[DevToDev.activeUser clearUserData];
```

{% endtab %}

{% tab title="Android" %}

```java
/**
 * Removes all user's custom personal data from devtodev data base.
 */
DevToDev.getActivePlayer().clearUserData();
```

{% endtab %}

{% tab title="Windows 8.1 and 10" %}

```csharp
/**
 * Removes all user's custom personal data from devtodev data base.
 */
DevToDev.SDK.ActiveUser.ClearUserData();
```

{% endtab %}

{% tab title="Web" %}

```javascript
/*
 * Removes all user's custom personal data from devtodev data base.
 */

devtodev.user.clearUser();
```

{% endtab %}

{% tab title="Unity" %}

```csharp
/// <summary> Removes all user's custom personal data from devtodev data base.</summary>
DevToDev.Analytics.ActiveUser.ClearUserData();
```

{% endtab %}

{% tab title="Mac OS" %}

```objectivec
/**
 * Removes all user's custom personal data from devtodev data base.
 */
[DevToDev.activeUser clearUserData];
```

{% endtab %}

{% tab title="Adobe Air" %}

```javascript
/**
 * Removes all user's custom personal data from devtodev data base.
 */
DevToDev.getActiveUser().ClearUserData();
```

{% endtab %}

{% tab title="UE4" %}
**Blueprint**

![](/files/-LnlSivsteoZnAhyQce9)

**Code**

```cpp
UPeopleLibrary::ClearUserData();
```

{% 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.devtodev.com/~/changes/KHSfVuDz62f75T3NzrM9/integration/integration-of-sdk/analytics-intergation/user-profile.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.
