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

# Send messages with the CometChat JavaScript SDK

> Send text, media, custom, and interactive chat messages to users and groups with the CometChat JavaScript SDK, including metadata and delivery callbacks.

Using CometChat, you can send three types of messages:

1. [Text Message](/sdk/javascript/send-message#text-message) is the most common and standard message type.
2. [Media Message](/sdk/javascript/send-message#media-message) for sending photos, videos and files.
3. [Custom Message](/sdk/javascript/send-message#custom-message), for sending completely custom data using JSON structures.
4. [Interactive Messages](/sdk/javascript/interactive-messages), for sending end-user interactive messages of type form, card and custom Interactive

You can also send metadata along with a text, media or custom message. Think, for example, if you'd want to share the user's location with every message, you can use the metadata field

## Text Message

Send a text message using `CometChat.sendMessage()` with a [`TextMessage`](/sdk/reference/messages#textmessage) object.

<Tabs>
  <Tab title="TypeScript (User)">
    ```typescript theme={null}
    let receiverID: string = "UID",
      messageText: string = "Hello world!",
      receiverType: string = CometChat.RECEIVER_TYPE.USER,
      textMessage: CometChat.TextMessage = new CometChat.TextMessage(
        receiverID,
        messageText,
        receiverType
      );

    CometChat.sendMessage(textMessage).then(
    (message: CometChat.TextMessage) => {
    console.log("Message sent successfully:", message);
    },
    (error: CometChat.CometChatException) => {
    console.log("Message sending failed with error:", error);
    }
    );

    ```
  </Tab>

  <Tab title="JavaScript (User)">
    ```javascript theme={null}
    let receiverID = "UID";
    let messageText = "Hello world!";
    let receiverType = CometChat.RECEIVER_TYPE.USER;
    let textMessage = new CometChat.TextMessage(
      receiverID,
      messageText,
      receiverType
    );

    CometChat.sendMessage(textMessage).then(
      (message) => {
        console.log("Message sent successfully:", message);
      },
      (error) => {
        console.log("Message sending failed with error:", error);
      }
    );
    ```

    Alternatively, you can use the `async/await` syntax:

    ```javascript theme={null}
    try {
      const receiverID = "UID";
      const messageText = "Hello world!";
      const receiverType = CometChat.RECEIVER_TYPE.USER;
      const textMessage = new CometChat.TextMessage(
        receiverID,
        messageText,
        receiverType
      );

      const message = await CometChat.sendMessage(textMessage);
      console.log("Message sent successfully:", message);
    } catch (error) {
      console.log("Message sending failed with error:", error);
    }
    ```
  </Tab>

  <Tab title="TypeScript (Group)">
    ```typescript theme={null}
    let receiverID: string = "GUID",
      messageText: string = "Hello world!",
      receiverType: string = CometChat.RECEIVER_TYPE.GROUP,
      textMessage: CometChat.TextMessage = new CometChat.TextMessage(
        receiverID,
        messageText,
        receiverType
      );

    CometChat.sendMessage(textMessage).then(
    (message: CometChat.TextMessage) => {
    console.log("Message sent successfully:", message);
    },
    (error: CometChat.CometChatException) => {
    console.log("Message sending failed with error:", error);
    }
    );

    ```
  </Tab>

  <Tab title="JavaScript (Group)">
    ```javascript theme={null}
    let receiverID = "GUID";
    let messageText = "Hello world!";
    let receiverType = CometChat.RECEIVER_TYPE.GROUP;
    let textMessage = new CometChat.TextMessage(
      receiverID,
      messageText,
      receiverType
    );

    CometChat.sendMessage(textMessage).then(
      (message) => {
        console.log("Message sent successfully:", message);
      },
      (error) => {
        console.log("Message sending failed with error:", error);
      }
    );
    ```
  </Tab>
</Tabs>

The [`TextMessage`](/sdk/reference/messages#textmessage) class constructor takes the following parameters:

| Parameter      | Description                                                       | Required |
| -------------- | ----------------------------------------------------------------- | -------- |
| `receiverID`   | UID of the user or GUID of the group receiving the message        | Yes      |
| `messageText`  | The text message content                                          | Yes      |
| `receiverType` | `CometChat.RECEIVER_TYPE.USER` or `CometChat.RECEIVER_TYPE.GROUP` | Yes      |

On success, `sendMessage()` method returns a [`TextMessage`](/sdk/reference/messages#textmessage) | [`MediaMessage`](/sdk/reference/messages#mediamessage) | [`CustomMessage`](/sdk/reference/messages#custommessage) | [`BaseMessage`](/sdk/reference/messages#basemessage) object depending on the input message type.

## Media Message

Send images, videos, audio, or files using `CometChat.sendMediaMessage()`.

There are two ways to send media messages:

1. **Upload a file** — Pass a file object and CometChat uploads it automatically
2. **Send a URL** — Provide a URL to media hosted on your server or cloud storage

### Upload a File

Get the file from an input element and pass it to [`MediaMessage`](/sdk/reference/messages#mediamessage):

```html theme={null}
<input type="file" name="img_file" id="img_file" />
```

<Tabs>
  <Tab title="TypeScript (User)">
    ```typescript theme={null}
    let receiverID: string = "UID",
      messageType: string = CometChat.MESSAGE_TYPE.IMAGE,
      receiverType: string = CometChat.RECEIVER_TYPE.USER,
      file: File = (document.getElementById("img_file") as HTMLInputElement).files![0];

    let mediaMessage: CometChat.MediaMessage = new CometChat.MediaMessage(
    receiverID,
    file,
    messageType,
    receiverType
    );

    CometChat.sendMediaMessage(mediaMessage).then(
    (message: CometChat.MediaMessage) => {
    console.log("Media message sent successfully", message);
    },
    (error: CometChat.CometChatException) => {
    console.log("Media message sending failed with error", error);
    }
    );

    ```
  </Tab>

  <Tab title="JavaScript (User)">
    ```javascript theme={null}
    let receiverID = "UID";
    let messageType = CometChat.MESSAGE_TYPE.IMAGE;
    let receiverType = CometChat.RECEIVER_TYPE.USER;
    let file = document.getElementById("img_file").files[0];

    let mediaMessage = new CometChat.MediaMessage(
      receiverID,
      file,
      messageType,
      receiverType
    );

    CometChat.sendMediaMessage(mediaMessage).then(
      (message) => {
        console.log("Media message sent successfully", message);
      },
      (error) => {
        console.log("Media message sending failed with error", error);
      }
    );
    ```
  </Tab>

  <Tab title="TypeScript (Group)">
    ```typescript theme={null}
    let receiverID: string = "GUID",
      messageType: string = CometChat.MESSAGE_TYPE.IMAGE,
      receiverType: string = CometChat.RECEIVER_TYPE.GROUP,
      file: File = (document.getElementById("img_file") as HTMLInputElement).files![0];

    let mediaMessage: CometChat.MediaMessage = new CometChat.MediaMessage(
    receiverID,
    file,
    messageType,
    receiverType
    );

    CometChat.sendMediaMessage(mediaMessage).then(
    (message: CometChat.MediaMessage) => {
    console.log("Media message sent successfully", message);
    },
    (error: CometChat.CometChatException) => {
    console.log("Media message sending failed with error", error);
    }
    );

    ```
  </Tab>

  <Tab title="JavaScript (Group)">
    ```javascript theme={null}
    let receiverID = "GUID";
    let messageType = CometChat.MESSAGE_TYPE.IMAGE;
    let receiverType = CometChat.RECEIVER_TYPE.GROUP;
    let file = document.getElementById("img_file").files[0];

    let mediaMessage = new CometChat.MediaMessage(
      receiverID,
      file,
      messageType,
      receiverType
    );

    CometChat.sendMediaMessage(mediaMessage).then(
      (message) => {
        console.log("Media message sent successfully", message);
      },
      (error) => {
        console.log("Media message sending failed with error", error);
      }
    );
    ```
  </Tab>
</Tabs>

### Send a URL

Send media hosted on your server or cloud storage using the [`Attachment`](/sdk/reference/auxiliary#attachment) class:

<Tabs>
  <Tab title="TypeScript (User)">
    ```typescript theme={null}
    let receiverID: string = "UID",
      messageType: string = CometChat.MESSAGE_TYPE.IMAGE,
      receiverType: string = CometChat.RECEIVER_TYPE.USER,
      mediaMessage: CometChat.MediaMessage = new CometChat.MediaMessage(
        receiverID,
        "",
        messageType,
        receiverType
      );

    let file: Object = {
    name: "mario",
    extension: "png",
    mimeType: "image/png",
    url: "https://pngimg.com/uploads/mario/mario_PNG125.png",
    };

    let attachment: CometChat.Attachment = new CometChat.Attachment(file);
    mediaMessage.setAttachment(attachment);

    CometChat.sendMediaMessage(mediaMessage).then(
    (message: CometChat.MediaMessage) => {
    console.log("Media message sent successfully", message);
    },
    (error: CometChat.CometChatException) => {
    console.log("Media message sending failed with error", error);
    }
    );

    ```
  </Tab>

  <Tab title="JavaScript (User)">
    ```javascript theme={null}
    let receiverID = "UID";
    let messageType = CometChat.MESSAGE_TYPE.IMAGE;
    let receiverType = CometChat.RECEIVER_TYPE.USER;
    let mediaMessage = new CometChat.MediaMessage(
      receiverID,
      "",
      messageType,
      receiverType
    );

    let file = {
      name: "mario",
      extension: "png",
      mimeType: "image/png",
      url: "https://pngimg.com/uploads/mario/mario_PNG125.png",
    };

    let attachment = new CometChat.Attachment(file);
    mediaMessage.setAttachment(attachment);

    CometChat.sendMediaMessage(mediaMessage).then(
      (message) => {
        console.log("Media message sent successfully", message);
      },
      (error) => {
        console.log("Media message sending failed with error", error);
      }
    );
    ```
  </Tab>

  <Tab title="TypeScript (Group)">
    ```typescript theme={null}
    let receiverID: string = "GUID",
      messageType: string = CometChat.MESSAGE_TYPE.IMAGE,
      receiverType: string = CometChat.RECEIVER_TYPE.GROUP,
      mediaMessage: CometChat.MediaMessage = new CometChat.MediaMessage(
        receiverID,
        "",
        messageType,
        receiverType
      );

    let file: Object = {
    name: "mario",
    extension: "png",
    mimeType: "image/png",
    url: "https://pngimg.com/uploads/mario/mario_PNG125.png",
    };

    let attachment: CometChat.Attachment = new CometChat.Attachment(file);
    mediaMessage.setAttachment(attachment);

    CometChat.sendMediaMessage(mediaMessage).then(
    (message: CometChat.MediaMessage) => {
    console.log("Media message sent successfully", message);
    },
    (error: CometChat.CometChatException) => {
    console.log("Media message sending failed with error", error);
    }
    );

    ```
  </Tab>

  <Tab title="JavaScript (Group)">
    ```javascript theme={null}
    let receiverID = "GUID";
    let messageType = CometChat.MESSAGE_TYPE.IMAGE;
    let receiverType = CometChat.RECEIVER_TYPE.GROUP;
    let mediaMessage = new CometChat.MediaMessage(
      receiverID,
      "",
      messageType,
      receiverType
    );

    let file = {
      name: "mario",
      extension: "png",
      mimeType: "image/png",
      url: "https://pngimg.com/uploads/mario/mario_PNG125.png",
    };

    let attachment = new CometChat.Attachment(file);
    mediaMessage.setAttachment(attachment);

    CometChat.sendMediaMessage(mediaMessage).then(
      (message) => {
        console.log("Media message sent successfully", message);
      },
      (error) => {
        console.log("Media message sending failed with error", error);
      }
    );
    ```
  </Tab>
</Tabs>

The [`MediaMessage`](/sdk/reference/messages#mediamessage) class constructor takes the following parameters:

| Parameter      | Description                                                 | Required |
| -------------- | ----------------------------------------------------------- | -------- |
| `receiverID`   | UID of the user or GUID of the group                        | Yes      |
| `file`         | File object to upload, or empty string if using URL         | Yes      |
| `messageType`  | `CometChat.MESSAGE_TYPE.IMAGE`, `VIDEO`, `AUDIO`, or `FILE` | Yes      |
| `receiverType` | `CometChat.RECEIVER_TYPE.USER` or `GROUP`                   | Yes      |

On success, `sendMediaMessage()` returns a [MediaMessage](/sdk/reference/messages#mediamessage) object.

### Add Caption

Add text along with the media:

<Tabs>
  <Tab title="TypeScript">
    `typescript mediaMessage.setCaption("Check out this photo!"); `
  </Tab>

  <Tab title="JavaScript">
    `javascript mediaMessage.setCaption("Check out this photo!"); `
  </Tab>
</Tabs>

### Add Metadata and Tags

Same as text messages:

```javascript theme={null}
mediaMessage.setMetadata({ location: "Paris" });
mediaMessage.setTags(["vacation"]);
mediaMessage.setQuotedMessageId(10);
```

The `sendMediaMessage()` method returns a [`MediaMessage`](/sdk/reference/messages#mediamessage) object.

## Multiple Attachments in a Media Message

Starting version 3.0.9 & above the SDK supports sending multiple attachments in a single media message. As in the case of a single attachment in a media message, there are two ways you can send Media Messages using the CometChat SDK:

1. **By providing an array of files:** You can now share an array of files while creating an object of the MediaMessage class. When the media message is sent using the `sendMediaMessage()` method, the files are uploaded to the CometChat servers & the URL of the files is sent in the success response of the `sendMediaMessage()` method.

Getting files:

<Tabs>
  <Tab title="html">
    ```html theme={null}
    <html>
      <body>
        <input type="file" name="img_file" id="img_file" />
        <script>
          const UID = "UID";
          const files = document.getElementById("img_file").files;
          const fileType = MESSAGE_TYPE.IMAGE;
          const userType = CometChat.RECEIVER_TYPE.USER;
          const mediaMessage = new MediaMessage(UID, files, fileType, userType);
        </script>
      </body>
    </html>
    ```
  </Tab>
</Tabs>

<Tabs>
  <Tab title="TypeScript (User)">
    ```typescript theme={null}
    let receiverID: string = "UID",
      messageType: string = CometChat.MESSAGE_TYPE.FILE,
      receiverType: string = CometChat.RECEIVER_TYPE.USER,
      files: FileList = (document.getElementById("img_file") as HTMLInputElement).files!;

    let mediaMessage: CometChat.MediaMessage = new CometChat.MediaMessage(
    receiverID,
    files,
    messageType,
    receiverType
    );

    CometChat.sendMediaMessage(mediaMessage).then(
    (message: CometChat.MediaMessage) => {
    console.log("Media message sent successfully", message);
    },
    (error: CometChat.CometChatException) => {
    console.log("Media message sending failed with error", error);
    }
    );

    ```
  </Tab>

  <Tab title="JavaScript (User)">
    ```javascript theme={null}
    let receiverID = "UID";
    let messageType = CometChat.MESSAGE_TYPE.FILE;
    let receiverType = CometChat.RECEIVER_TYPE.USER;
    let mediaMessage = new CometChat.MediaMessage(
      receiverID,
      files,
      messageType,
      receiverType
    );

    CometChat.sendMediaMessage(mediaMessage).then(
      (message) => {
        console.log("Media message sent successfully", message);
      },
      (error) => {
        console.log("Media message sending failed with error", error);
      }
    );
    ```
  </Tab>

  <Tab title="TypeScript (Group)">
    ```typescript theme={null}
    let receiverID: string = "GUID",
      messageType: string = CometChat.MESSAGE_TYPE.FILE,
      receiverType: string = CometChat.RECEIVER_TYPE.GROUP,
      files: FileList = (document.getElementById("img_file") as HTMLInputElement).files!;

    let mediaMessage: CometChat.MediaMessage = new CometChat.MediaMessage(
    receiverID,
    files,
    messageType,
    receiverType
    );

    CometChat.sendMediaMessage(mediaMessage).then(
    (message: CometChat.MediaMessage) => {
    console.log("Media message sent successfully", message);
    },
    (error: CometChat.CometChatException) => {
    console.log("Media message sending failed with error", error);
    }
    );

    ```
  </Tab>

  <Tab title="JavaScript (Group)">
    ```javascript theme={null}
    let receiverID = "GUID";
    let messageType = CometChat.MESSAGE_TYPE.FILE;
    let receiverType = CometChat.RECEIVER_TYPE.GROUP;
    let files = document.getElementById("img_file").files;

    let mediaMessage = new CometChat.MediaMessage(
      receiverID,
      files,
      messageType,
      receiverType
    );

    CometChat.sendMediaMessage(mediaMessage).then(
      (message) => {
        console.log("Media message sent successfully", message);
      },
      (error) => {
        console.log("Media message sending failed with error", error);
      }
    );
    ```
  </Tab>
</Tabs>

### Send Multiple URLs

<Tabs>
  <Tab title="TypeScript (User)">
    ```typescript theme={null}
    let receiverID: string = "UID",
      messageType: string = CometChat.MESSAGE_TYPE.IMAGE,
      receiverType: string = CometChat.RECEIVER_TYPE.USER,
      mediaMessage: CometChat.MediaMessage = new CometChat.MediaMessage(
        receiverID,
        "",
        messageType,
        receiverType
      );

    let attachment1: Object = {
    name: "mario",
    extension: "png",
    mimeType: "image/png",
    url: "https://pngimg.com/uploads/mario/mario_PNG125.png",
    };

    let attachment2: Object = {
    name: "jaguar",
    extension: "png",
    mimeType: "image/png",
    url: "https://pngimg.com/uploads/jaguar/jaguar_PNG20759.png",
    };

    let attachments: Array<CometChat.Attachment> = [];
    attachments.push(new CometChat.Attachment(attachment1));
    attachments.push(new CometChat.Attachment(attachment2));

    mediaMessage.setAttachments(attachments);

    CometChat.sendMediaMessage(mediaMessage).then(
    (message: CometChat.MediaMessage) => {
    console.log("Media message sent successfully", message);
    },
    (error: CometChat.CometChatException) => {
    console.log("Media message sending failed with error", error);
    }
    );

    ```
  </Tab>

  <Tab title="JavaScript (User)">
    ```javascript theme={null}
    let receiverID = "UID";
    let messageType = CometChat.MESSAGE_TYPE.IMAGE;
    let receiverType = CometChat.RECEIVER_TYPE.USER;
    let mediaMessage = new CometChat.MediaMessage(
      receiverID,
      "",
      messageType,
      receiverType
    );

    let attachment1 = {
      name: "mario",
      extension: "png",
      mimeType: "image/png",
      url: "https://pngimg.com/uploads/mario/mario_PNG125.png",
    };

    let attachment2 = {
      name: "jaguar",
      extension: "png",
      mimeType: "image/png",
      url: "https://pngimg.com/uploads/jaguar/jaguar_PNG20759.png",
    };

    let attachments = [];
    attachments.push(new CometChat.Attachment(attachment1));
    attachments.push(new CometChat.Attachment(attachment2));

    mediaMessage.setAttachments(attachments);

    CometChat.sendMediaMessage(mediaMessage).then(
      (message) => {
        console.log("Media message sent successfully", message);
      },
      (error) => {
        console.log("Media message sending failed with error", error);
      }
    );
    ```
  </Tab>

  <Tab title="TypeScript (Group)">
    ```typescript theme={null}
    let receiverID: string = "GUID",
      messageType: string = CometChat.MESSAGE_TYPE.IMAGE,
      receiverType: string = CometChat.RECEIVER_TYPE.GROUP,
      mediaMessage: CometChat.MediaMessage = new CometChat.MediaMessage(
        receiverID,
        "",
        messageType,
        receiverType
      );

    let attachment1: Object = {
    name: "mario",
    extension: "png",
    mimeType: "image/png",
    url: "https://pngimg.com/uploads/mario/mario_PNG125.png",
    };

    let attachment2: Object = {
    name: "jaguar",
    extension: "png",
    mimeType: "image/png",
    url: "https://pngimg.com/uploads/jaguar/jaguar_PNG20759.png",
    };

    let attachments: Array<CometChat.Attachment> = [];
    attachments.push(new CometChat.Attachment(attachment1));
    attachments.push(new CometChat.Attachment(attachment2));

    mediaMessage.setAttachments(attachments);

    CometChat.sendMediaMessage(mediaMessage).then(
    (message: CometChat.MediaMessage) => {
    console.log("Media message sent successfully", message);
    },
    (error: CometChat.CometChatException) => {
    console.log("Media message sending failed with error", error);
    }
    );

    ```
  </Tab>

  <Tab title="JavaScript (Group)">
    ```javascript theme={null}
    let receiverID = "GUID";
    let messageType = CometChat.MESSAGE_TYPE.IMAGE;
    let receiverType = CometChat.RECEIVER_TYPE.GROUP;
    let mediaMessage = new CometChat.MediaMessage(
      receiverID,
      "",
      messageType,
      receiverType
    );

    let attachment1 = {
      name: "mario",
      extension: "png",
      mimeType: "image/png",
      url: "https://pngimg.com/uploads/mario/mario_PNG125.png",
    };

    let attachment2 = {
      name: "jaguar",
      extension: "png",
      mimeType: "image/png",
      url: "https://pngimg.com/uploads/jaguar/jaguar_PNG20759.png",
    };

    let attachments = [];
    attachments.push(new CometChat.Attachment(attachment1));
    attachments.push(new CometChat.Attachment(attachment2));

    mediaMessage.setAttachments(attachments);

    CometChat.sendMediaMessage(mediaMessage).then(
      (message) => {
        console.log("Media message sent successfully", message);
      },
      (error) => {
        console.log("Media message sending failed with error", error);
      }
    );
    ```
  </Tab>
</Tabs>

## Custom Message

Send structured data that doesn't fit text or media categories — like location coordinates, polls, or game moves.

<Tabs>
  <Tab title="TypeScript (User)">
    ```typescript theme={null}
    let receiverID: string = "UID",
      customData: Object = {
        latitude: "50.6192171633316",
        longitude: "-72.68182268750002",
      },
      customType: string = "location",
      receiverType: string = CometChat.RECEIVER_TYPE.USER,
      customMessage: CometChat.CustomMessage = new CometChat.CustomMessage(
        receiverID,
        receiverType,
        customType,
        customData
      );

    CometChat.sendCustomMessage(customMessage).then(
    (message: CometChat.CustomMessage) => {
    console.log("Custom message sent successfully", message);
    },
    (error: CometChat.CometChatException) => {
    console.log("Custom message sending failed with error", error);
    }
    );

    ```
  </Tab>

  <Tab title="JavaScript (User)">
    ```javascript theme={null}
    let receiverID = "UID";
    let customData = {
      latitude: "50.6192171633316",
      longitude: "-72.68182268750002",
    };
    let customType = "location";
    let receiverType = CometChat.RECEIVER_TYPE.USER;

    let customMessage = new CometChat.CustomMessage(
      receiverID,
      receiverType,
      customType,
      customData
    );

    CometChat.sendCustomMessage(customMessage).then(
      (message) => {
        console.log("Custom message sent successfully", message);
      },
      (error) => {
        console.log("Custom message sending failed with error", error);
      }
    );
    ```
  </Tab>

  <Tab title="TypeScript (Group)">
    ```typescript theme={null}
    let receiverID: string = "GUID",
      customData: Object = {
        latitude: "50.6192171633316",
        longitude: "-72.68182268750002",
      },
      customType: string = "location",
      receiverType: string = CometChat.RECEIVER_TYPE.GROUP,
      customMessage: CometChat.CustomMessage = new CometChat.CustomMessage(
        receiverID,
        receiverType,
        customType,
        customData
      );

    CometChat.sendCustomMessage(customMessage).then(
    (message: CometChat.CustomMessage) => {
    console.log("Custom message sent successfully", message);
    },
    (error: CometChat.CometChatException) => {
    console.log("Custom message sending failed with error", error);
    }
    );

    ```
  </Tab>

  <Tab title="JavaScript (Group)">
    ```javascript theme={null}
    let receiverID = "GUID";
    let customData = {
      latitude: "50.6192171633316",
      longitude: "-72.68182268750002",
    };
    let customType = "location";
    let receiverType = CometChat.RECEIVER_TYPE.GROUP;

    let customMessage = new CometChat.CustomMessage(
      receiverID,
      receiverType,
      customType,
      customData
    );

    CometChat.sendCustomMessage(customMessage).then(
      (message) => {
        console.log("Custom message sent successfully", message);
      },
      (error) => {
        console.log("Custom message sending failed with error", error);
      }
    );
    ```
  </Tab>
</Tabs>

The [`CustomMessage`](/sdk/reference/messages#custommessage) class constructor takes the following parameters:

| Parameter      | Description                                            | Required |
| -------------- | ------------------------------------------------------ | -------- |
| `receiverID`   | UID of the user or GUID of the group                   | Yes      |
| `receiverType` | `CometChat.RECEIVER_TYPE.USER` or `GROUP`              | Yes      |
| `customType`   | Your custom type string (e.g., `"location"`, `"poll"`) | Yes      |
| `customData`   | JSON object with your custom data                      | Yes      |

On success, `sendCustomMessage()` returns a [CustomMessage](/sdk/reference/messages#custommessage) object.

### Add Tags

```javascript theme={null}
customMessage.setTags(["starredMessage"]);
```

### Quote a Message

```javascript theme={null}
customMessage.setQuotedMessageId(10);
```

### Control Conversation Update

By default, custom messages update the conversation's last message. To prevent this:

```javascript theme={null}
customMessage.shouldUpdateConversation(false);
```

### Custom Notification Text

Set custom text for push, email, and SMS notifications:

```javascript theme={null}
customMessage.setConversationText("Shared a location");
```

The `sendCustomMessage()` method returns a [`CustomMessage`](/sdk/reference/messages#custommessage) object.

***

## Card Message

A [`CardMessage`](/sdk/reference/messages#cardmessage) (category `card`) is a rich, structured card rendered from Card Schema JSON.

<Note>
  **Card messages cannot be sent through the SDK.** `CardMessage` is
  **receive-only** — there is no `sendCardMessage()` method. Cards are created
  server-side via the [Platform (REST) API](/rest-api/messages/send-message) or
  the **Dashboard Bubble Builder**, and delivered to clients through the
  `onCardMessageReceived` callback of the `MessageListener`.
</Note>

To receive and render cards, see the [Card Messages guide](/sdk/javascript/card-messages).

***

## Next Steps

<CardGroup cols={2}>
  <Card title="Receive Messages" icon="inbox" href="/sdk/javascript/receive-message">
    Listen for incoming messages in real-time
  </Card>

  <Card title="Edit Message" icon="pen" href="/sdk/javascript/edit-message">
    Edit previously sent messages
  </Card>

  <Card title="Delete Message" icon="trash" href="/sdk/javascript/delete-message">
    Delete sent messages
  </Card>
</CardGroup>
