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

# Delete Message

> Delete sent messages in one-on-one or group conversations using the CometChat Android SDK.

<Accordion title="AI Integration Quick Reference">
  ```kotlin theme={null}
  // Delete a message by ID
  val messageId = 1234

  CometChat.deleteMessage(messageId, object : CometChat.CallbackListener<BaseMessage>() {
      override fun onSuccess(message: BaseMessage) {
          // message.deletedAt contains deletion timestamp
      }
      override fun onError(e: CometChatException) { }
  })

  // Listen for delete events
  CometChat.addMessageListener("LISTENER_ID", object : CometChat.MessageListener() {
      override fun onMessageDeleted(message: BaseMessage?) { }
  })
  ```
</Accordion>

Deleting a message is straightforward. Receiving delete events has two parts:

1. Adding a listener for [real-time deletes](#real-time-message-delete-events) when your app is running
2. Fetching [missed deletes](#missed-message-delete-events) when your app was offline

## Delete a Message

Use `deleteMessage()` with the message ID.

<Tabs>
  <Tab title="Java">
    ```java theme={null}
    private int messageId = 1234;

    CometChat.deleteMessage(messageId, new CometChat.CallbackListener<BaseMessage>() {
      @Override
      public void onSuccess(BaseMessage message) {
        Log.d(TAG, "Message deleted successfully at : " + message.getDeletedAt());
      }

      @Override
      public void onError(CometChatException e) {
        Log.d(TAG, e.getMessage());
      }
    });
    ```
  </Tab>

  <Tab title="Kotlin">
    ```kotlin theme={null}
    private val messageId = 1234

    CometChat.deleteMessage(messageId,object : CometChat.CallbackListener<BaseMessage>(){
      override fun onSuccess(message: BaseMessage) {
        Log.d(TAG, "deleteMessage onSuccess : " + message.deletedAt)
      }

      override fun onError(e: CometChatException) {
        Log.d(TAG, "deleteMessage onError : "+e.message)
      }
    })
    ```
  </Tab>
</Tabs>

| Field     | Getter           | Return Type | Description                             |
| --------- | ---------------- | ----------- | --------------------------------------- |
| deletedAt | `getDeletedAt()` | `long`      | Timestamp when the message was deleted  |
| deletedBy | `getDeletedBy()` | `String`    | UID of the user who deleted the message |

Once the message is deleted, In the `onSuccess()` callback, you get an object of the [`BaseMessage`](/sdk/reference/messages#basemessage) class, with the `deletedAt` field set with the timestamp of the time the message was deleted. Also, the `deletedBy` field is set. These two fields can be used to identify if the message is deleted while iterating through a list of messages.

By default, CometChat allows certain roles to delete a message.

| User Role       | Conversation Type       | Deletion Capabilities     |
| --------------- | ----------------------- | ------------------------- |
| Message Sender  | One-on-one Conversation | Messages they've sent     |
| Message Sender  | Group Conversation      | Messages they've sent     |
| Group Admin     | Group Conversation      | All messages in the group |
| Group Moderator | Group Conversation      | All messages in the group |

## Real-time Message Delete Events

Use `onMessageDeleted` in `MessageListener` to receive real-time delete events.

<Tabs>
  <Tab title="Java">
    ```java theme={null}
    CometChat.addMessageListener(listenerID, new CometChat.MessageListener() {
      @Override
      public void onMessageDeleted(BaseMessage message) {
        Log.d(TAG, "Message Edited");
      }
    });
    ```
  </Tab>

  <Tab title="Kotlin">
    ```kotlin theme={null}
    CometChat.addMessageListener(listenerID, object : CometChat.MessageListener() {
      override fun onMessageDeleted(message: BaseMessage?) {
        Log.d(TAG, "Message Edited")
      }
    })
    ```
  </Tab>
</Tabs>

| Field     | Getter           | Return Type | Description                             |
| --------- | ---------------- | ----------- | --------------------------------------- |
| deletedAt | `getDeletedAt()` | `long`      | Timestamp when the message was deleted  |
| deletedBy | `getDeletedBy()` | `String`    | UID of the user who deleted the message |

<Warning>
  Always remove 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.

  ```kotlin theme={null}
  CometChat.removeMessageListener("LISTENER_ID")
  ```
</Warning>

## Missed Message Delete Events

When fetching message history, deleted messages have `deletedAt` and `deletedBy` fields set. Additionally, an [`Action`](/sdk/reference/messages#action) message is created when a message is deleted.

For the message deleted event, in the [`Action`](/sdk/reference/messages#action) object received, the following fields can help you get the relevant information-

1. `action` - `deleted`
2. `actionOn` - Updated message object which was deleted.
3. `actionBy` - User object containing the details of the user who has deleted the message.
4. `actionFor` - User/group object having the details of the receiver to which the message was sent.

<Note>
  In order to delete a message, you need to be either the sender of the message or the admin/moderator of the group in which the message was sent.
</Note>

***

***

## Next Steps

<CardGroup cols={2}>
  <Card title="Edit Message" icon="pen" href="/sdk/android/edit-message">
    Modify text and custom messages after sending
  </Card>

  <Card title="Send Message" icon="paper-plane" href="/sdk/android/send-message">
    Send text, media, and custom messages
  </Card>

  <Card title="Receive Messages" icon="envelope" href="/sdk/android/receive-messages">
    Handle real-time message events with listeners
  </Card>

  <Card title="Message Structure" icon="list" href="/sdk/android/message-structure-and-hierarchy">
    Understand message types and properties
  </Card>
</CardGroup>
