> ## Documentation Index
> Fetch the complete documentation index at: https://cometchat-22654f5b-docs-angular-v5-docs-update.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Add Members

> Add members to CometChat groups with the Android SDK and assign participant, moderator, or admin scopes.

<Accordion title="AI Integration Quick Reference">
  ```kotlin theme={null}
  // Add members to a group
  val members = listOf(
      GroupMember("uid1", CometChatConstants.SCOPE_MODERATOR),
      GroupMember("uid2", CometChatConstants.SCOPE_PARTICIPANT)
  )

  CometChat.addMembersToGroup("GUID", members, null, 
      object : CallbackListener<HashMap<String, String>>() {
          override fun onSuccess(result: HashMap<String, String>) { }
          override fun onError(e: CometChatException) { }
      })
  ```

  **Note:** Only admins and moderators can add members. The result HashMap contains UID as key and "success" or error message as value.
</Accordion>

## Add Members to Group

Use `addMembersToGroup()` with the group GUID, a list of [`GroupMember`](/sdk/reference/entities#groupmember) objects, and an optional list of UIDs to ban.

<Tabs>
  <Tab title="Java">
    ```java theme={null}
    List<GroupMember> members = new ArrayList<>();
    members.add(new GroupMember("uid1",CometChatConstants.SCOPE_MODERATOR));
    members.add(new GroupMember("uid2", CometChatConstants.SCOPE_ADMIN));

    CometChat.addMembersToGroup("GUID", members, null, new CometChat.CallbackListener<HashMap<String, String>>(){
      @Override
      public void onSuccess(HashMap<String, String> successMap) {
        Log.d("CometChatActivity", success);
      }

      @Override
      public void onError(CometChatException e) {
        Toast.makeText(CometChatActivity.this, e.getMessage(),Toast.LENGTH_LONG).show();
      }
    });
    ```
  </Tab>

  <Tab title="Kotlin">
    ```kotlin theme={null}
    val member:MutableList<GroupMember> = arrayListOf()
    member.add(GroupMember(UID,CometChatConstants.SCOPE_PARTICIPANT))

    CometChat.addMembersToGroup(GUID,member,null,object :CometChat.CallbackListener<HashMap<String,String>>(){

      override fun onSuccess(p0: HashMap<String, String>?) {

      }

      override fun onError(p0: CometChatException?) {

      }
    })
    ```
  </Tab>
</Tabs>

In the `onSuccess()` method of the `CallbackListener`, you will receive a HashMap which will contain the `UID` of the users and the value will either be `success` or an error message describing why the operation to add the user to the group or ban the user failed.

## Real-Time Group Member Added Events

When a member is added to a group, existing members receive a real-time event in `onMemberAddedToGroup()` of the `GroupListener` class. The callback provides an [`Action`](/sdk/reference/messages#action) object, the adding [`User`](/sdk/reference/entities#user), the added [`User`](/sdk/reference/entities#user), and the [`Group`](/sdk/reference/entities#group).

<Note>
  When a member is added by another user, `onMemberAddedToGroup()` fires. When a user joins on their own, `onGroupMemberJoined()` fires instead.
</Note>

<Tabs>
  <Tab title="Java">
    ```java theme={null}
    CometChat.addGroupListener("UNIQUE_ID", new CometChat.GroupListener() {
      @Override
      public void onMemberAddedToGroup(Action action, User addedby, User userAdded, Group addedTo) {
        Log.d("onMemberAddedToGroup", action.getMessage());
      }
    });
    ```
  </Tab>

  <Tab title="Kotlin">
    ```kotlin theme={null}
    CometChat.addGroupListener("UNIQUE_ID", object : CometChat.GroupListener() {
      override fun onMemberAddedToGroup(action: Action, addedby: User, userAdded: User, addedTo: Group) {
        Log.d("onMemberAddedToGroup", action.message)
      }
    })
    ```
  </Tab>
</Tabs>

## Member Added to Group event in Message History

When fetching message history, if a member was added to a group the logged-in user is part of, the list will contain an [`Action`](/sdk/reference/messages#action) message with these fields:

1. `action` - `added`
2. `actionOn` - [`User`](/sdk/reference/entities#user) object containing the details of the user who was added to the group
3. `actionBy` - [`User`](/sdk/reference/entities#user) object containing the details of the user who added the member to the group
4. `actionFor` - [`Group`](/sdk/reference/entities#group) object containing the details of the group to which the member was added

<Warning>
  Always remove group listeners when they're no longer needed (e.g., in `onDestroy()` or when navigating away). Failing to remove listeners can cause memory leaks and duplicate event handling.
</Warning>

## GroupMember Payload Structure

<Accordion title="GroupMember Object">
  The [`GroupMember`](/sdk/reference/entities#groupmember) object extends [`User`](/sdk/reference/entities#user) and contains all User fields plus group-specific fields:

  | Parameter       | Type           | Description                                                                    |
  | --------------- | -------------- | ------------------------------------------------------------------------------ |
  | `uid`           | String         | Unique identifier of the user                                                  |
  | `name`          | String         | Display name of the user                                                       |
  | `avatar`        | String         | URL to user's profile picture                                                  |
  | `link`          | String         | URL to user's profile page                                                     |
  | `role`          | String         | User role for access control                                                   |
  | `metadata`      | JSONObject     | Custom data set by developer                                                   |
  | `status`        | String         | User online status. Values: `"online"`, `"offline"`                            |
  | `statusMessage` | String         | Custom status message                                                          |
  | `lastActiveAt`  | long           | Unix timestamp of last activity                                                |
  | `hasBlockedMe`  | boolean        | Whether this user has blocked the logged-in user                               |
  | `blockedByMe`   | boolean        | Whether the logged-in user has blocked this user                               |
  | `tags`          | Array\<String> | List of tags for user identification                                           |
  | `deactivatedAt` | long           | Unix timestamp when user was deactivated (0 if active)                         |
  | `scope`         | String         | Member's scope in the group. Values: `"admin"`, `"moderator"`, `"participant"` |
  | `joinedAt`      | long           | Unix timestamp when member joined the group                                    |

  **Sample GroupMember Object:**

  ```json theme={null}
  {
    "uid": "user_123",
    "name": "John Doe",
    "avatar": "https://example.com/avatar.png",
    "link": "https://example.com/profile",
    "role": "default",
    "metadata": {
      "department": "Engineering",
      "title": "Senior Developer"
    },
    "status": "online",
    "statusMessage": "Available",
    "lastActiveAt": 1699900000,
    "hasBlockedMe": false,
    "blockedByMe": false,
    "tags": ["premium", "verified"],
    "deactivatedAt": 0,
    "scope": "admin",
    "joinedAt": 1699850000
  }
  ```
</Accordion>

***

## Next Steps

<CardGroup cols={2}>
  <Card title="Kick Member" icon="user-minus" href="/sdk/android/group-kick-member">
    Remove members from groups
  </Card>

  <Card title="Change Member Scope" icon="user-shield" href="/sdk/android/group-change-member-scope">
    Update member roles and permissions
  </Card>

  <Card title="Retrieve Members" icon="users" href="/sdk/android/retrieve-group-members">
    Fetch list of group members
  </Card>

  <Card title="Group Listeners" icon="bell" href="/sdk/android/real-time-listeners">
    Handle real-time group events
  </Card>
</CardGroup>
