Skip to main content

Events

Why is Idempotency Important?

Idempotency ensures that your system processes webhook events reliably, even in cases duplicate events due to retries. Webhooks are inherently asynchronous, and network issues or endpoint failures can lead to retries. Without idempotency, the same event could be processed multiple times, causing unintended side effects such as duplicate records, inconsistent states, or incorrect business logic execution.

By implementing idempotency, you can:

Prevent Duplicate Processing: Ensure that the same event is not processed more than once, even if it is retried. Maintain Data Integrity: Avoid creating duplicate records or inconsistent states in your database. Improve System Reliability: Handle retries gracefully and ensure your system behaves predictably under all circumstances. Enhance Debugging and Monitoring: Easily identify and resolve issues related to duplicate or failed events.

Messaging events

message_sent

The hook triggers after the message is sent.

Idempotency Details

  • Key: webhook,trigger,data.message.id
  • Purpose: Ensures the message is processed only once.
{
"trigger": "message_sent",
"data": {
"message": {
"id": "1",
"conversationId": "cometchat-uid-1_user_cometchat-uid-2",
"sender": "cometchat-uid-1",
"receiverType": "user",
"receiver": "cometchat-uid-2",
"category": "message",
"type": "text",
"data": {
"text": "hi",
"entities": {
"sender": {
"entity": {
"uid": "cometchat-uid-1",
"name": "Andrew Joseph",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-1.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1696934440
},
"entityType": "user"
},
"receiver": {
"entity": {
"uid": "cometchat-uid-2",
"name": "George Alan",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-2.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1696934491,
"conversationId": "cometchat-uid-1_user_cometchat-uid-2"
},
"entityType": "user"
}
}
},
"sentAt": 1696934912,
"updatedAt": 1696934912
}
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

message_edited

The hook triggers after the message is edited.

Idempotency Details

  • Key: webhook,trigger,data.message.id & data.message.editedAt
  • Purpose: Tracks edits to ensure the same edit is not processed multiple times.
{
"trigger": "message_edited",
"data": {
"message": {
"id": "2",
"conversationId": "cometchat-uid-1_user_cometchat-uid-2",
"sender": "cometchat-uid-1",
"receiverType": "user",
"receiver": "cometchat-uid-2",
"category": "action",
"type": "message",
"data": {
"action": "edited",
"entities": {
"by": {
"entity": {
"uid": "cometchat-uid-1",
"name": "Andrew Joseph",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-2.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1696934440
},
"entityType": "user"
},
"for": {
"entity": {
"uid": "cometchat-uid-2",
"name": "George Alan",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-2.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1696934491,
"conversationId": "cometchat-uid-1_user_cometchat-uid-2"
},
"entityType": "user"
},
"on": {
"entity": {
"id": "1",
"conversationId": "cometchat-uid-1_user_cometchat-uid-2",
"sender": "cometchat-uid-1",
"receiverType": "user",
"receiver": "cometchat-uid-2",
"category": "message",
"type": "text",
"data": {
"text": "hello",
"entities": {
"sender": {
"entity": {
"uid": "cometchat-uid-1",
"name": "Andrew Joseph",
"role": "default",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-1.webp",
"status": "available",
"lastActiveAt": 1696934440
},
"entityType": "user"
},
"receiver": {
"entity": {
"uid": "cometchat-uid-2",
"name": "George Alan",
"role": "default",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-2.webp",
"status": "available",
"lastActiveAt": 1696934491,
"conversationId": "cometchat-uid-1_user_cometchat-uid-2"
},
"entityType": "user"
}
}
},
"sentAt": 1696934912,
"editedAt": 1696934985,
"editedBy": "cometchat-uid-1",
"deliveredAt": 1696934912,
"readAt": 1696934950,
"updatedAt": 1696934985
},
"entityType": "message"
}
},
},
"sentAt": 1696934985,
"updatedAt": 1696934985
}
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

message_deleted

The hook triggers after the message is deleted.

Idempotency Details

  • Key: webhook,trigger & data.message.id
  • Purpose: Tracks deletions to prevent duplicate processing.
{
"trigger": "message_deleted",
"data": {
"message": {
"id": "3",
"conversationId": "cometchat-uid-1_user_cometchat-uid-2",
"sender": "cometchat-uid-1",
"receiverType": "user",
"receiver": "cometchat-uid-2",
"category": "action",
"type": "message",
"data": {
"action": "deleted",
"entities": {
"by": {
"entity": {
"uid": "cometchat-uid-1",
"name": "Andrew Joseph",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-1.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1696934440
},
"entityType": "user"
},
"for": {
"entity": {
"uid": "cometchat-uid-2",
"name": "George Alan",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-2.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1696934491,
"conversationId": "cometchat-uid-1_user_cometchat-uid-2"
},
"entityType": "user"
},
"on": {
"entity": {
"id": "2",
"conversationId": "cometchat-uid-1_user_cometchat-uid-2",
"sender": "cometchat-uid-1",
"receiverType": "user",
"receiver": "cometchat-uid-2",
"category": "message",
"type": "text",
"data": {
"entities": {
"sender": {
"entity": {
"uid": "cometchat-uid-1",
"name": "Andrew Joseph",
"role": "default",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-1.webp",
"status": "available",
"lastActiveAt": 1696934440
},
"entityType": "user"
},
"receiver": {
"entity": {
"uid": "cometchat-uid-2",
"name": "George Alan",
"role": "default",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-2.webp",
"status": "available",
"lastActiveAt": 1696934491,
"conversationId": "cometchat-uid-1_user_cometchat-uid-2"
},
"entityType": "user"
}
}
},
"sentAt": 1696934912,
"deliveredAt": 1696934912,
"readAt": 1696934950,
"deletedAt": 1696935005,
"updatedAt": 1696935005,
"deletedBy": "cometchat-uid-1"
},
"entityType": "message"
}
},
},
"sentAt": 1696935005,
"updatedAt": 1696935005
}
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

message_delivery_receipt

The hook triggers when the client chat application confirms with Cometchat servers that a message was delivered.

Idempotency Details

  • Key: webhook,trigger,data.body.messageId,data.body.timestamp & data.sender
  • Purpose: Tracks delivery receipts to ensure they are processed only once.
{
"trigger": "message_delivery_receipt",
"data": {
"receiver": "cometchat-uid-1",
"receiverType": "user",
"type": "receipts",
"sender": "cometchat-uid-2",
"messageSender": "cometchat-uid-1",
"body": {
"action": "delivered",
"messageId": "57",
"user": {
"hasBlockedMe": false,
"blockedByMe": false,
"deactivatedAt": 0,
"uid": "cometchat-uid-2",
"name": "George Alan",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-2.webp",
"lastActiveAt": 1696934489,
"role": "default",
"status": "online"
},
"timestamp": 1696934912
}
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

message_read_receipt

The hook triggers when the client chat application confirms with Cometchat servers that a message was read.

Idempotency Details

  • Key: webhook,trigger,data.body.messageId,data.body.timestamp & data.sender
  • Purpose: Tracks read receipts to ensure they are processed only once.
{
"trigger": "message_read_receipt",
"data": {
"receiver": "cometchat-uid-1",
"receiverType": "user",
"type": "receipts",
"sender": "cometchat-uid-2",
"messageSender": "cometchat-uid-1",
"body": {
"action": "read",
"messageId": "57",
"user": {
"hasBlockedMe": false,
"blockedByMe": false,
"deactivatedAt": 0,
"uid": "cometchat-uid-2",
"name": "George Alan",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-2.webp",
"lastActiveAt": 1696934489,
"role": "default",
"status": "online"
},
"timestamp": 1696934950
}
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

message_reaction_added

The hook triggers after a user reacts to a message.

Idempotency Details

  • Key: webhook,trigger,data.reaction.id & data.reaction.uid
  • Purpose: Tracks reactions to ensure they are processed only once.
{
"trigger": "message_reaction_added",
"data": {
"reaction": {
"id": "<reactionId>",
"messageId": "<messageId>",
"reaction": "🏒",
"uid": "cometchat-uid-1",
"reactedAt": 1700655536,
"reactedBy": {
"uid": "cometchat-uid-1",
"name": "Andrew Joseph",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-1.webp",
"status": "offline",
"role": "default",
"lastActiveAt": 1700652818
}
}
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

message_reaction_removed

The hook triggers after a user un-reacts to a message.

Idempotency Details

  • Key: webhook,trigger,data.reaction.id & data.reaction.uid
  • Purpose: Tracks reaction removals to ensure they are processed only once.
{
"trigger": "message_reaction_removed",
"data": {
"reaction": {
"id": "<reactionId>",
"messageId": "<messageId>",
"reaction": "🏒",
"uid": "cometchat-uid-1",
"reactedAt": 1700231289,
"reactedBy": {
"uid": "cometchat-uid-1",
"name": "Andrew Joseph",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-1.webp",
"status": "offline",
"role": "default",
"lastActiveAt": 1700652818
}
}
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

user_mentioned

The hook triggers after a user is mentioned in the message.

Idempotency Details

  • Key: webhook,trigger,data.message.id & data.message.mentions.uid
  • Purpose: Tracks mentions to ensure they are processed only once.
{
"trigger": "user_mentioned",
"data": {
"message": {
"id": "4",
"conversationId": "cometchat-uid-1_user_cometchat-uid-2",
"sender": "cometchat-uid-1",
"receiverType": "user",
"receiver": "cometchat-uid-2",
"category": "message",
"type": "text",
"data": {
"text": "Hi <@uid:cometchat-uid-2>",
"entities": {
"sender": {
"entity": {
"uid": "cometchat-uid-1",
"name": "George Alan",
"status": "offline",
"role": "default",
"createdAt": 1702025699
},
"entityType": "user"
},
"receiver": {
"entity": {
"uid": "cometchat-uid-2",
"name": "cometchat-uid-1",
"status": "available",
"role": "default",
"lastActiveAt": 1702028122,
"createdAt": 1701931840,
"conversationId": "cometchat-uid-1_user_cometchat-uid-2"
},
"entityType": "user"
}
},
"mentions": {
"cometchat-uid-2": {
"uid": "cometchat-uid-2",
"name": "cometchat-uid-1",
"status": "available",
"role": "default",
"lastActiveAt": 1702028122,
"createdAt": 1701931840,
"conversationId": "cometchat-uid-1_user_cometchat-uid-2"
}
}
},
"sentAt": 1702028666,
"updatedAt": 1702028666
}
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

message_delivered_to_all

The hook triggers when the client chat application confirms with Cometchat servers that a message was delivered to all the participants of the group.

Idempotency Details

  • Key: webhook,trigger,data.body.messageId & data.body.timestamp
  • Purpose: Tracks group delivery to ensure it is processed only once.
{
"trigger": "message_delivered_to_all",
"data": {
"receiver": "group__1720436412627",
"receiverType": "group",
"type": "receipts",
"sender": "app_system",
"messageSender": "superhero2",
"body": {
"messageId": "385",
"timestamp": 1722245922,
"action": "deliveredToAll",
"user": {
"uid": "app_system",
"name": "System",
"avatar": "",
"role": "default",
"status": "offline"
}
}
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

message_read_by_all

The hook triggers when the client chat application confirms with Cometchat servers that a message was read by all the participants of a group.

Idempotency Details

  • Key: webhook,trigger,data.body.messageId & data.body.timestamp
  • Purpose: Tracks group read receipts to ensure they are processed only once.
{
"trigger": "message_read_by_all",
"data": {
"receiver": "group__1720436412627",
"receiverType": "group",
"type": "receipts",
"sender": "app_system",
"messageSender": "superhero2",
"body": {
"messageId": "385",
"timestamp": 1722245922,
"action": "readByAll",
"user": {
"uid": "app_system",
"name": "System",
"avatar": "",
"role": "default",
"status": "offline"
}
}
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}
note

The following events will be available only if the Enhanced Messaging Status feature is enabled for your app.

  • message_delivered_to_all,
  • message_read_by_all

user_blocked

The hook triggers when a user blocks another user.

Idempotency Details

  • Key: webhook+trigger+data.users.uid
  • Purpose: Tracks user block events to ensure they are processed only once.
{
"trigger": "user_blocked",
"data": {
"users": {
"cometchat-uid-2": {
"uid": "cometchat-uid-2",
"name": "George Alan",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-2.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1696934491,
"conversationId": "cometchat-uid-1_user_cometchat-uid-2"
}
},
"by": {
"uid": "cometchat-uid-1",
"name": "Andrew Joseph",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-1.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1696935105
}
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

user_unblocked

The hook triggers when a user unblocks another user.

Idempotency Details

  • Key: webhook+trigger+data.users.uid
  • Purpose: Tracks user unblock events to ensure they are processed only once.
{
"trigger": "user_unblocked",
"data": {
"users": {
"cometchat-uid-2": {
"uid": "cometchat-uid-2",
"name": "George Alan",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-2.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1696934491,
"conversationId": "cometchat-uid-1_user_cometchat-uid-2"
}
},
"by": {
"uid": "cometchat-uid-1",
"name": "Andrew Joseph",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-1.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1696935105
}
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

user_connection_status_changed

The hook triggers after a user connects/disconnects from the websocket server.

Idempotency Details

  • Key: webhook+trigger+data.user.uid+data.user.status+data.timestamp
  • Purpose: Tracks user connection status changes to ensure they are processed only once.
{
"trigger": "user_connection_status_changed",
"data": {
"timestamp": 1696935103114,
"user": {
"uid": "cometchat-uid-1",
"name": "Andrew Joseph",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-1.webp",
"status": "offline",
"role": "default",
"lastActiveAt": 1693916686
},
"status": "offline",
"currentConnection": {
"action": "disconnected",
"appInfo": {
"version": "3.0.12",
"apiVersion": "v3.0",
"origin": "http://localhost:5173",
"uts": 1696934440846,
"clientIp": "3.128.113.92"
},
"platform": "javascript",
"userAgent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
"connectedAt": 1696934440982
},
"userPresenceChanged": true
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

Group events

group_member_banned

This hooks triggers after members are banned from a group.

Idempotency Details

  • Key: webhook+trigger+data.group.guid+data.members.uid+data.group.updatedAt
  • Purpose: Tracks group member bans to ensure they are processed only once.
{
"trigger": "group_member_banned",
"data": {
"group": {
"guid": "cometchat-guid-1",
"name": "Hiking Group",
"type": "public",
"membersCount": 1,
"conversationId": "group_group__1696932914913",
"createdAt": 1696932915,
"owner": "cometchat-uid-1",
"updatedAt": 1696933533,
"onlineMembersCount": 1
},
"members": {
"cometchat-uid-2": {
"uid": "cometchat-uid-2",
"name": "George Alan",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-2.webp",
"status": "offline",
"role": "default",
"lastActiveAt": 1695751453,
"conversationId": "cometchat-uid-1_user_cometchat-uid-2"
}
},
"by": {
"uid": "cometchat-uid-1",
"name": "Andrew Joseph",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-1.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1696932834
}
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

group_member_unbanned

The hook triggers after members are unbanned from a group.

Idempotency Details

  • Key: webhook+trigger+data.group.guid+data.members.uid+data.group.updatedAt
  • Purpose: Tracks group member unbans to ensure they are processed only once.
{
"trigger": "group_member_unbanned",
"data": {
"members": {
"cometchat-uid-2": {
"uid": "cometchat-uid-2",
"name": "George Alan",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-2.webp",
"status": "offline",
"role": "default",
"lastActiveAt": 1695751453,
"conversationId": "cometchat-uid-1_user_cometchat-uid-2"
}
},
"group": {
"guid": "cometchat-guid-1",
"name": "Hiking Group",
"type": "public",
"membersCount": 1,
"conversationId": "group_cometchat-guid-1",
"createdAt": 1696932915,
"owner": "cometchat-uid-1",
"updatedAt": 1696933533,
"onlineMembersCount": 1
},
"by": {
"uid": "cometchat-uid-1",
"name": "Andrew Joseph",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-1.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1696932834
}
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

group_member_scope_changed

The hook triggers if the scope of a member changes in a group.

Idempotency Details

  • Key: webhook+trigger+data.group.guid+data.members.uid+data.group.updatedAt
  • Purpose: Tracks group member scope changes to ensure they are processed only once.
{
"trigger": "group_member_scope_changed",
"data": {
"members": {
"cometchat-uid-2": {
"uid": "cometchat-uid-2",
"name": "George Alan",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-2.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1696933928,
"conversationId": "cometchat-uid-1_user_cometchat-uid-2",
"scope": "admin",
"oldScope": "participant"
}
},
"group": {
"guid": "cometchat-guid-1",
"name": "Hiking Group",
"type": "public",
"membersCount": 2,
"conversationId": "group_cometchat-guid-1",
"createdAt": 1695722891,
"owner": "cometchat-uid-1",
"updatedAt": 1696933925,
"onlineMembersCount": 2
},
"by": {
"uid": "cometchat-uid-1",
"name": "Andrew Joseph",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-1.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1696933934
}
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

group_created

The hook triggers after the group is created.

Idempotency Details

  • Key: webhook+trigger+data.group.guid+data.group.createdAt
  • Purpose: Tracks group creation to ensure it is processed only once.
{
"trigger":"group_created",
"data":{
"group":{
"guid":"cometchat-guid-1",
"name":"Hiking Group",
"type":"public",
"scope":"admin",
"membersCount":1,
"joinedAt":1696932915,
"conversationId":"group_cometchat-guid-1",
"hasJoined":true,
"createdAt":1696932915,
"owner":"cometchat-uid-1"
},
"members":{
"cometchat-uid-1":{
"uid":"cometchat-uid-1",
"name":"Andrew Joseph",
"status":"available",
"role":"default",
"lastActiveAt":1696932834
}
}
},
"appId":"<appId>",
"region":"<region>",
"webhook":"<webhookID>"
}

group_updated

The hook triggers after the group is updated.

Idempotency Details

  • Key: webhook+trigger+data.group.guid+data.group.updatedAt
  • Purpose: Tracks group updates to ensure they are processed only once.
{
"trigger": "group_updated",
"data": {
"group": {
"guid": "cometchat-guid-1",
"name": "Hiking Group",
"type": "public",
"membersCount": 2,
"conversationId": "group_cometchat-guid-1",
"createdAt": 1695728507,
"owner": "cometchat-uid-2",
"updatedAt": 1696934048,
"updatedBy": "cometchat-uid-1",
"onlineMembersCount": 2
}
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

group_deleted

The hook triggers after the group is deleted.

Idempotency Details

  • Key: webhook+trigger+data.group.guid+data.group.createdAt
  • Purpose: Tracks group deletions to ensure they are processed only once.
{
"trigger": "group_deleted",
"data": {
"group": {
"guid": "cometchat-guid-1",
"name": "1234",
"type": "public",
"membersCount": 1,
"conversationId": "group_cometchat-guid-1",
"createdAt": 1695722912,
"owner": "cometchat-uid-1",
"updatedAt": 1695817083,
"updatedBy": "cometchat-uid-1",
"onlineMembersCount": 1
}
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

group_member_joined

The hook triggers after a user joins a group.

Idempotency Details

  • Key: webhook+trigger+data.group.guid+data.members.uid+data.group.updatedAt
  • Purpose: Tracks group member joins to ensure they are processed only once.
{
"trigger": "group_member_joined",
"data": {
"members": {
"cometchat-uid-2": {
"uid": "cometchat-uid-2",
"name": "George Alan",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-2.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1696933689
}
},
"group": {
"guid": "cometchat-guid-1",
"name": "Hiking Group",
"type": "public",
"membersCount": 2,
"conversationId": "group_cometchat-guid-1",
"createdAt": 1695728507,
"owner": "cometchat-uid-1",
"updatedAt": 1696933691,
"onlineMembersCount": 1
}
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

group_member_left

The hook triggers after a user leaves the group.

Idempotency Details

  • Key: webhook+trigger+data.group.guid+data.members.uid+data.group.updatedAt
  • Purpose: Tracks group member departures to ensure they are processed only once.
{
"trigger": "group_member_left",
"data": {
"members": {
"cometchat-uid-2": {
"uid": "cometchat-uid-2",
"name": "George Alan",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-2.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1696933689
}
},
"group": {
"guid": "cometchat-guid-1",
"name": "Hiking Group",
"type": "public",
"membersCount": 1,
"conversationId": "group_cometchat-guid-1",
"createdAt": 1695722891,
"owner": "cometchat-uid-1",
"updatedAt": 1696933827,
"onlineMembersCount": 1
}
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

group_member_added

The hook triggers after members are added to a group.

Idempotency Details

  • Key: webhook+trigger+data.group.guid+data.members.uid+data.group.updatedAt
  • Purpose: Tracks group member additions to ensure they are processed only once.
{
"trigger": "group_member_added",
"data": {
"group": {
"guid": "cometchat-guid-1",
"name": "Hiking Group",
"type": "public",
"membersCount": 2,
"conversationId": "group_cometchat-guid-1",
"createdAt": 1696932915,
"owner": "cometchat-uid-1",
"onlineMembersCount": 1
},
"members": {
"cometchat-uid-2": {
"uid": "cometchat-uid-2",
"name": "George Alan",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-2.webp",
"status": "offline",
"role": "default",
"lastActiveAt": 1695751453,
"conversationId": "cometchat-uid-1_user_cometchat-uid-2"
}
},
"by": {
"uid": "cometchat-uid-1",
"name": "Andrew Joseph",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-1.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1696932834
}
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

group_member_kicked

This hook triggers after members are kicked from a group.

Idempotency Details

  • Key: webhook+trigger+data.group.guid+data.members.uid+data.group.updatedAt
  • Purpose: Tracks group member removals to ensure they are processed only once.
{
"trigger": "group_member_kicked",
"data": {
"members": {
"cometchat-uid-2": {
"uid": "cometchat-uid-2",
"name": "George Alan",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-2.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1696933689,
"conversationId": "cometchat-uid-1_user_cometchat-uid-2"
}
},
"group": {
"guid": "cometchat-guid-1",
"name": "Hiking Group",
"type": "public",
"membersCount": 1,
"conversationId": "group_cometchat-guid-1",
"createdAt": 1695722891,
"owner": "cometchat-uid-1",
"updatedAt": 1696933889,
"onlineMembersCount": 8
},
"by": {
"uid": "cometchat-uid-1",
"name": "Andrew Joseph",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-1.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1696933881
}
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

group_owner_transferred

The hook triggers if the owner of the group is changed.

Idempotency Details

  • Key: webhook+trigger+data.group.guid+data.group.updatedAt
  • Purpose: Tracks group ownership transfers to ensure they are processed only once.
{
"trigger": "group_owner_transferred",
"data": {
"group": {
"guid": "cometchat-guid-1",
"name": "Hiking Group",
"type": "public",
"membersCount": 2,
"conversationId": "group_cometchat-guid-1",
"createdAt": 1695728507,
"owner": "cometchat-uid-2",
"updatedAt": 1696933737,
"updatedBy": "cometchat-uid-1",
"onlineMembersCount": 2,
"oldOwner": "cometchat-uid-1"
}
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

Call & Meeting events

call_initiated

The hook triggers when the call is initiated.

Idempotency Details

  • Key: webhook+trigger+data.call.id+data.call.sentAt
  • Purpose: Tracks call initiation to ensure it is processed only once.
{
"trigger": "call_initiated",
"data": {
"call": {
"id": "52",
"conversationId": "cometchat-uid-1_user_cometchat-uid-5",
"sender": "cometchat-uid-1",
"receiverType": "user",
"receiver": "cometchat-uid-5",
"category": "call",
"type": "audio",
"data": {
"action": "initiated",
"entities": {
"by": {
"entity": {
"uid": "cometchat-uid-1",
"name": "Andrew Joseph",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-1.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1696933934
},
"entityType": "user"
},
"for": {
"entity": {
"uid": "cometchat-uid-5",
"name": "John Paul",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-5.webp",
"status": "offline",
"role": "default",
"conversationId": "cometchat-uid-1_user_cometchat-uid-5"
},
"entityType": "user"
},
"on": {
"entity": {
"sessionid": "<sessionId>",
"conversationId": "cometchat-uid-1_user_cometchat-uid-5",
"sender": "cometchat-uid-1",
"receiverType": "user",
"receiver": "cometchat-uid-5",
"status": "initiated",
"type": "audio",
"data": {
"entities": {
"sender": {
"entity": {
"uid": "cometchat-uid-1",
"name": "Andrew Joseph",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-1.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1696933934
},
"entityType": "user"
},
"receiver": {
"entity": {
"uid": "cometchat-uid-5",
"name": "John Paul",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-5.webp",,
"status": "offline",
"role": "default",
"conversationId": "cometchat-uid-1_user_cometchat-uid-5"
},
"entityType": "user"
}
}
},
"initiatedAt": 1696934199,
"joinedAt": 1696934199
},
"entityType": "call"
}
},
"resource": "WEB-3_0_12-acfa8397-42f0-4f19-bc28-bc7db316ecaf-1696933879599"
},
"sentAt": 1696934199,
"updatedAt": 1696934199
}
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

call_started

The hook triggers when the call is started.

Idempotency Details

  • Key: webhook+trigger+data.sessionId+data.created_at
  • Purpose: Tracks call start events to ensure they are processed only once.
{
"trigger": "call_started",
"data": {
"created_at": 1696934572,
"sessionId": "<sessionId>"
},
"type": "call",
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

call_participant_joined

The hook triggers when a participant joins the call.

Idempotency Details

  • Key: webhook+trigger+data.sessionId+data.occupant.joined_at
  • Purpose: Tracks participant joins to ensure they are processed only once.
{
"trigger": "call_participant_joined",
"data": {
"occupant": {
"joined_at": 1696934573,
"audio_call": "true",
"name": "Andrew Joseph"
},
"initial_config": {
"is_video_muted": "false",
"start_recording_on_call_start": "false",
"call_version": "2.3.0",
"is_audio_muted": "false",
"sdk": "react",
"mode": "DEFAULT",
"platform": "web",
"is_audio_only": "true"
},
"sessionId": "<sessionId>"
},
"type": "call",
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

call_participant_left

The hook triggers when a participant leaves the call.

Idempotency Details

  • Key: webhook+trigger+data.sessionId+data.occupant.left_at
  • Purpose: Tracks participant departures to ensure they are processed only once.
{
"trigger": "call_participant_left",
"data": {
"occupant": {
"joined_at": 1696934501,
"audio_call": "true",
"left_at": 1696934553,
"name": "George Alan"
},
"sessionId": "<sessionId>"
},
"type": "call",
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

call_ended

The hook triggers when the call is ended.

Idempotency Details

  • Key: webhook+trigger+data.sessionId+data.destroyed_at
  • Purpose: Tracks call end events to ensure they are processed only once.
{
"trigger": "call_ended",
"data": {
"all_occupants": [
{
"joined_at": 1696934501,
"audio_call": "true",
"left_at": 1696934553,
"name": "George Alan"
},
{
"joined_at": 1696934501,
"audio_call": "true",
"left_at": 1696934551,
"name": "Andrew Joseph"
}
],
"destroyed_at": 1696934553,
"created_at": 1696934501,
"sessionId": "<sessionId>"
},
"type": "call",
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

call_busy

This hook is triggered when a 1-on-1 call cannot be connected because the recipient is already on another call (i.e., their line is busy). Note: This event is exclusive to 1-on-1 calls. In group calls, all participants can join at any time, so a "busy" state does not apply.

Idempotency Details

  • Key: webhook+trigger+data.call.id+data.call.sentAt
  • Purpose: Tracks call busy events to ensure they are processed only once.
{
"trigger": "call_busy",
"data": {
"call": {
"id": "43414",
"conversationId": "superhero1_user_superhero3",
"sender": "superhero3",
"receiverType": "user",
"receiver": "superhero1",
"category": "call",
"type": "audio",
"data": {
"action": "busy",
"entities": {
"by": {
"entity": {
"uid": "superhero3",
"name": "Spiderman",
"status": "available",
"role": "default",
"lastActiveAt": 1744959907
},
"entityType": "user"
},
"for": {
"entity": {
"uid": "superhero1",
"name": "Iron Man New 2",
"metadata": {
"metadata": "updated_653"
},
"status": "available",
"lastActiveAt": 1744960245,
"conversationId": "superhero1_user_superhero3"
},
"entityType": "user"
},
"on": {
"entity": {
"sessionid": "v1.us.258520c054f20343.1744960250fba0641a3d6f635262e35c07dca5acfb6fa94127",
"conversationId": "superhero1_user_superhero3",
"sender": "superhero1",
"receiverType": "user",
"receiver": "superhero3",
"status": "busy",
"type": "audio",
"data": {
"entities": {
"receiver": {
"entity": {
"conversationId": "superhero1_user_superhero3",
"lastActiveAt": 1744959907,
"name": "Spiderman",
"role": "default",
"status": "available",
"uid": "superhero3"
},
"entityType": "user"
},
"sender": {
"entity": {
"lastActiveAt": 1744960245,
"metadata": {
"metadata": "updated_653"
},
"name": "Iron Man New 2",
"status": "available",
"uid": "superhero1"
},
"entityType": "user"
}
}
},
"initiatedAt": 1744960250
},
"entityType": "call"
}
},
"resource": "WEB-4_0_10-942b534c-b606-4d44-90c3-878c60eb3a63-1744959889623"
},
"sentAt": 1744960250,
"updatedAt": 1744960250
}
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookId>"
}

call_cancelled

The hook triggers when the call is cancelled.

Idempotency Details

  • Key: webhook+trigger+data.call.id+data.call.sentAt
  • Purpose: Tracks call cancelled events to ensure they are processed only once.
{
"trigger": "call_cancelled",
"data": {
"call": {
"id": "43408",
"conversationId": "superhero3_user_superhero4",
"sender": "superhero4",
"receiverType": "user",
"receiver": "superhero3",
"category": "call",
"type": "audio",
"data": {
"action": "cancelled",
"entities": {
"by": {
"entity": {
"uid": "superhero4",
"name": "Wolverine",
"status": "available",
"role": "default",
"lastActiveAt": 1744959814
},
"entityType": "user"
},
"for": {
"entity": {
"uid": "superhero3",
"name": "Spiderman",
"status": "available",
"role": "default",
"lastActiveAt": 1744959907,
"conversationId": "superhero3_user_superhero4"
},
"entityType": "user"
},
"on": {
"entity": {
"sessionid": "v1.us.258520c054f20343.1744960108582f85230d0552516bdac185a6bd862eeac55f78",
"conversationId": "superhero3_user_superhero4",
"sender": "superhero4",
"receiverType": "user",
"receiver": "superhero3",
"status": "cancelled",
"type": "audio",
"data": {
"entities": {
"receiver": {
"entity": {
"conversationId": "superhero3_user_superhero4",
"lastActiveAt": 1744959907,
"name": "Spiderman",
"role": "default",
"status": "available",
"uid": "superhero3"
},
"entityType": "user"
},
"sender": {
"entity": {
"lastActiveAt": 1744959814,
"name": "Wolverine",
"role": "default",
"status": "available",
"uid": "superhero4"
},
"entityType": "user"
}
}
},
"initiatedAt": 1744960108
},
"entityType": "call"
}
},
"resource": "WEB-4_0_10-837115e3-f277-4105-8f1f-4e19a1a7f2be-1744959734040"
},
"sentAt": 1744960111,
"updatedAt": 1744960111
}
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookId>"
}

call_rejected

This hook is triggered when a 1-on-1 call is explicitly rejected by the recipient. In group calls, this event is not triggered—since the call remains active as long as at least one member joins, even if others reject it.

Idempotency Details

  • Key: webhook+trigger+data.call.id+data.call.sentAt
  • Purpose: Tracks call rejected events to ensure they are processed only once.
{
"trigger": "call_rejected",
"data": {
"call": {
"id": "43406",
"conversationId": "superhero3_user_superhero4",
"sender": "superhero3",
"receiverType": "user",
"receiver": "superhero4",
"category": "call",
"type": "audio",
"data": {
"action": "rejected",
"entities": {
"by": {
"entity": {
"uid": "superhero3",
"name": "Spiderman",
"status": "available",
"role": "default",
"lastActiveAt": 1744959907
},
"entityType": "user"
},
"for": {
"entity": {
"uid": "superhero4",
"name": "Wolverine",
"status": "available",
"role": "default",
"lastActiveAt": 1744959814,
"conversationId": "superhero3_user_superhero4"
},
"entityType": "user"
},
"on": {
"entity": {
"sessionid": "v1.us.258520c054f20343.1744960087681ed39d02b69199ee4e0cf9d9173dc6c643461e",
"conversationId": "superhero3_user_superhero4",
"sender": "superhero4",
"receiverType": "user",
"receiver": "superhero3",
"status": "rejected",
"type": "audio",
"data": {
"entities": {
"receiver": {
"entity": {
"conversationId": "superhero3_user_superhero4",
"lastActiveAt": 1744959907,
"name": "Spiderman",
"role": "default",
"status": "available",
"uid": "superhero3"
},
"entityType": "user"
},
"sender": {
"entity": {
"lastActiveAt": 1744959814,
"name": "Wolverine",
"role": "default",
"status": "available",
"uid": "superhero4"
},
"entityType": "user"
}
}
},
"initiatedAt": 1744960087
},
"entityType": "call"
}
},
"resource": "WEB-4_0_10-942b534c-b606-4d44-90c3-878c60eb3a63-1744959889623"
},
"sentAt": 1744960092,
"updatedAt": 1744960092
}
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookId>"
}

call_unanswered

This hook is triggered when a call goes unanswered. For group calls, the call is considered unanswered only if none of the members join.

Idempotency Details

  • Key: webhook+trigger+data.call.id+data.call.sentAt
  • Purpose: Tracks call unanswered events to ensure they are processed only once.
{
"trigger": "call_unanswered",
"data": {
"call": {
"id": "43410",
"conversationId": "superhero3_user_superhero4",
"sender": "superhero4",
"receiverType": "user",
"receiver": "superhero3",
"category": "call",
"type": "audio",
"data": {
"action": "unanswered",
"entities": {
"by": {
"entity": {
"uid": "superhero4",
"name": "Wolverine",
"status": "available",
"role": "default",
"lastActiveAt": 1744959814
},
"entityType": "user"
},
"for": {
"entity": {
"uid": "superhero3",
"name": "Spiderman",
"status": "available",
"role": "default",
"lastActiveAt": 1744959907,
"conversationId": "superhero3_user_superhero4"
},
"entityType": "user"
},
"on": {
"entity": {
"sessionid": "v1.us.258520c054f20343.17449601247f75e0a5c7b9601b32e9fb26645c34975bc6c93d",
"conversationId": "superhero3_user_superhero4",
"sender": "superhero4",
"receiverType": "user",
"receiver": "superhero3",
"status": "unanswered",
"type": "audio",
"data": {
"entities": {
"receiver": {
"entity": {
"conversationId": "superhero3_user_superhero4",
"lastActiveAt": 1744959907,
"name": "Spiderman",
"role": "default",
"status": "available",
"uid": "superhero3"
},
"entityType": "user"
},
"sender": {
"entity": {
"lastActiveAt": 1744959814,
"name": "Wolverine",
"role": "default",
"status": "available",
"uid": "superhero4"
},
"entityType": "user"
}
}
},
"initiatedAt": 1744960124
},
"entityType": "call"
}
},
"resource": "WEB-4_0_10-837115e3-f277-4105-8f1f-4e19a1a7f2be-1744959734040"
},
"sentAt": 1744960170,
"updatedAt": 1744960170
}
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookId>"
}

meeting_started

The hook triggers when a meeting is started.

Idempotency Details

  • Key: webhook+trigger+data.sessionId+data.created_at
  • Purpose: Tracks meeting start events to ensure they are processed only once.
{
"trigger": "meeting_started",
"data": {
"created_at": 1696934692,
"sessionId": "<sessionId>"
},
"type": "meet",
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

recording_generated

The hook triggers when the recording is generated.

Idempotency Details

  • Key: webhook+trigger+data.sessionId+data.startTime
  • Purpose: Tracks recording generation to ensure it is processed only once.
{
"trigger": "recording_generated",
"data": {
"recordingDate": "2023-10-10",
"duration": "21.433000",
"startTime": "1696937627",
"sessionId": "<sessionId>",
"recording_url": "<recording_url>"
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

meeting_participant_joined

The hook triggers when a participant joins the meeting.

Idempotency Details

  • Key: webhook+trigger+data.sessionId+data.occupant.joined_at
  • Purpose: Tracks participant joins in meetings to ensure they are processed only once.
{
"trigger": "meeting_participant_joined",
"data": {
"occupant": {
"joined_at": 1696934692,
"audio_call": "false",
"name": "Andrew Joseph"
},
"initial_config": {
"is_video_muted": "false",
"start_recording_on_call_start": "false",
"call_version": "2.3.0",
"is_audio_muted": "false",
"sdk": "react",
"mode": "DEFAULT",
"platform": "web",
"is_audio_only": "false"
},
"sessionId": "<sessionId>"
},
"type": "meet",
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

meeting_participant_left

The hook triggers when a participant leaves the meeting.

Idempotency Details

  • Key: webhook+trigger+data.sessionId+data.occupant.left_at
  • Purpose: Tracks participant departures in meetings to ensure they are processed only once.
{
"trigger": "meeting_participant_left",
"data": {
"occupant": {
"joined_at": 1696934692,
"audio_call": "false",
"left_at": 1696934730,
"name": "Andrew Joseph"
},
"sessionId": "<sessionId>"
},
"type": "meet",
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

meeting_ended

The hook triggers when the meeting is ended.

Idempotency Details

  • Key: webhook+trigger+data.sessionId+data.destroyed_at
  • Purpose: Tracks meeting end events to ensure they are processed only once.
{
"trigger": "meeting_ended",
"data": {
"all_occupants": [
{
"joined_at": 1696934692,
"audio_call": "false",
"left_at": 1696934730,
"name": "Andrew Joseph"
}
],
"destroyed_at": 1696934730,
"created_at": 1696934692,
"sessionId": "<sessionId>"
},
"type": "meet",
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

Moderation Events

moderation_engine_approved

The hook triggers when a message is marked as approved by the moderation engine.

Idempotency Details

  • Key: webhook+trigger+data.message.id+data.message.sentAt
  • Purpose: Tracks moderation approvals to ensure they are processed only once.
{
"trigger": "moderation_engine_approved",
"data": {
"message": {
"id": "38437",
"muid": "_4b6na3agb",
"conversationId": "cometchat-uid-1_user_cometchat-uid-2",
"sender": "cometchat-uid-2",
"receiverType": "user",
"receiver": "cometchat-uid-1",
"category": "message",
"type": "text",
"data": {
"text": "hello",
"resource": "WEB-4_0_10-a10f2a72-8d27-4fbc-aceb-05a2258e98f4-1738586366602",
"entities": {
"sender": {
"entity": {
"uid": "cometchat-uid-2",
"name": "George Alan",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-2.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1738589887
},
"entityType": "user"
},
"receiver": {
"entity": {
"uid": "cometchat-uid-1",
"name": "Andrew Joseph",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-1.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1738589887,
"conversationId": "cometchat-uid-1_user_cometchat-uid-2"
},
"entityType": "user"
}
}
},
"sentAt": 1738591120,
"updatedAt": 1738591120
}
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

Filter Failure and Message Approval

When a moderation rule is configured to block messages based on conditions and filters, the conditions may be met, but the filters may not. In such cases, the message is approved, and the system will provide details on the filter that caused the rule to fail. This ensures transparency and helps administrators understand why a message was not blocked despite matching the primary rule condition.

For example, a rule might specify that the message containing badWord should only be blocked if it is sent by a specific user (e.g., user-1).

Scenario:

  • Rule Condition: Block messages containing badWord.
  • Filter Condition: The sender's UID must be user-1.

Example

  1. User Action: user-2 sends a message containing badWord.
  2. Rule Evaluation:
    • The message contains badWord, satisfying the rule condition.
    • However, the sender's UID is user-2, which does not match the filter condition (user-1).
  3. Outcome:
    • Since the filter condition is not met, the message is approved and not blocked.
{
"trigger": "moderation_engine_approved",
"data": {
"message": {
"id": "38446",
"muid": "_4j800i3f9",
"conversationId": "cometchat-uid-1_user_cometchat-uid-2",
"sender": "cometchat-uid-2",
"receiverType": "user",
"receiver": "cometchat-uid-1",
"category": "message",
"type": "text",
"data": {
"text": "duffer",
"resource": "WEB-4_0_10-a10f2a72-8d27-4fbc-aceb-05a2258e98f4-1738586366602",
"entities": {
"sender": {
"entity": {
"uid": "cometchat-uid-2",
"name": "George Alan",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-2.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1738596587
},
"entityType": "user"
},
"receiver": {
"entity": {
"uid": "cometchat-uid-1",
"name": "Andrew Joseph",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-1.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1738589887,
"conversationId": "cometchat-uid-1_user_cometchat-uid-2"
},
"entityType": "user"
}
}
},
"sentAt": 1738601210,
"updatedAt": 1738601210
},
"moderation": [
{
"filter": {
"entity": "user",
"operand": "uid",
"operator": "equals",
"value": "cometchat-uid-1",
"type": "sender",
"_id": "67a0f23442ec6ee218670893"
},
"rule": {
"id": "moderation",
"name": "moderation",
"revisionId": "253614a48756a6a0_moderation_2",
"action": [
"blockMessage"
],
"blockedAt": 1738601211
}
}
]
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

moderation_engine_blocked

The hook triggers when a message is marked as disapproved by the moderation engine.

Idempotency Details

  • Key: webhook+trigger+data.message.id+data.message.updatedAt
  • Purpose: Tracks moderation blocks to ensure they are processed only once.
{
"trigger": "moderation_engine_blocked",
"data": {
"message": {
"id": "38439",
"muid": "_zhovsxqdo",
"conversationId": "cometchat-uid-1_user_cometchat-uid-2",
"sender": "cometchat-uid-2",
"receiverType": "user",
"receiver": "cometchat-uid-1",
"category": "message",
"type": "text",
"data": {
"text": "andrew@gmail.com",
"resource": "WEB-4_0_10-a10f2a72-8d27-4fbc-aceb-05a2258e98f4-1738586366602",
"entities": {
"sender": {
"entity": {
"uid": "cometchat-uid-2",
"name": "George Alan",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-2.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1738589887
},
"entityType": "user"
},
"receiver": {
"entity": {
"uid": "cometchat-uid-1",
"name": "Andrew Joseph",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-1.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1738589887,
"conversationId": "cometchat-uid-1_user_cometchat-uid-2"
},
"entityType": "user"
}
}
},
"sentAt": 1738591286,
"updatedAt": 1738591286
},
"moderation": [
{
"condition": {
"entity": "message",
"operand": "text",
"category": "pattern",
"operator": "contains",
"value": [
"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"
],
"message": "Text message contains a pattern matching an email address"
},
"rule": {
"id": "email_filter",
"name": "Email filter",
"revisionId": "2531882e5e289115_contact_email_filter_7",
"action": [
"blockMessage"
],
"blockedAt": 1738591286
}
}
]
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}

moderation_manual_approved

The hook triggers when a blocked message is manually marked as approved.

Idempotency Details

  • Key: webhook+trigger+data.message.id+data.message.updatedAt
  • Purpose: Tracks manual moderation approvals to ensure they are processed only once.
{
"trigger": "moderation_manual_approved",
"data": {
"message": {
"id": "38439",
"muid": "_zhovsxqdo",
"conversationId": "cometchat-uid-1_user_cometchat-uid-2",
"sender": "cometchat-uid-2",
"receiverType": "user",
"receiver": "cometchat-uid-1",
"category": "message",
"type": "text",
"data": {
"text": "andrew@gmail.com",
"resource": "WEB-4_0_10-a10f2a72-8d27-4fbc-aceb-05a2258e98f4-1738586366602",
"entities": {
"sender": {
"entity": {
"uid": "cometchat-uid-2",
"name": "George Alan",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-2.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1738589887
},
"entityType": "user"
},
"receiver": {
"entity": {
"uid": "cometchat-uid-1",
"name": "Andrew Joseph",
"avatar": "https://assets.cometchat.io/sampleapp/v2/users/cometchat-uid-1.webp",
"status": "available",
"role": "default",
"lastActiveAt": 1738589887,
"conversationId": "cometchat-uid-1_user_cometchat-uid-2"
},
"entityType": "user"
}
}
},
"sentAt": 1738591286,
"updatedAt": 1738591286
},
"moderation": [
{
"condition": {
"entity": "message",
"operand": "text",
"category": "pattern",
"operator": "contains",
"value": [
"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"
],
"message": "Text message contains a pattern matching an email address"
},
"rule": {
"id": "email_filter",
"name": "Email filter",
"revisionId": "2531882e5e289115_contact_email_filter_7",
"action": [
"blockMessage"
],
"blockedAt": 1738591286
}
}
]
},
"appId": "<appId>",
"region": "<region>",
"webhook": "<webhookID>"
}