> For the complete documentation index, see [llms.txt](https://docs.ggwp.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.ggwp.com/webhooks/webhook-events.md).

# Webhook Events

## 1. **Player Sanctioned**

Triggered when a sanction gets administered to a player and their `user_status` has been updated.&#x20;

*Event Type:* `player-sanctioned`

*Applicable for:* Chat, Voice, Game and Discord

*Trigger:* When player is sanctioned via one of the following

* GGWP's automod
* Directly via dashboard

*Note:* The event is not triggered if [update status API](/api-docs-contextual-information/player-status.md) is used to change the status of the player.

*Payload description:*

* **type**: webhook event type. Defaults to `player-sanctioned` for this event.
* **event\_id**: unique identifier for the event.
* **created\_at**: timestamp at which the event was triggered in YYYY-MM-DD HH:MM:SS format, in UTC.
* **data**: dictionary containing additional event details. It includes:&#x20;
  * **session\_id**: identifier of the session where the sanction originated, when applicable.
  * **incident\_id**: identifier of the incident that triggered the player sanction, when applicable.
  * **user\_id**: identifier for the sanctioned player.
  * **username**: display name of the sanctioned player.
  * **reputation\_score**: player reputation score (between 150 and 850).
  * **timestamp**: time when the sanction took place in YYYY-MM-DD HH:MM:SS format, in UTC.
  * **channel**: indicates where the sanction was applied. Supported channels are `chat`, `voice`, `game` and `discord`.
  * **incident\_types**: list of incident types associated with the incident that triggered the player sanction, when applicable.
  * **severity**: severity of the incident that triggered the player sanction, when applicable. Possible values are `low`, `medium`, `high`.
  * **confidence**: confidence in the incident that triggered the player sanction, when applicable. Possible values are `low`, `medium`, `high`, `very high`.
  * **messages**: list of dictionaries containing message details related to the incident, when applicable. It includes:
    * **message\_id**: identifier of the message that triggered the incident creation.
    * **audio\_id**: identifier of an audio clip that triggered the incident creation, when applicable.
    * **message**: message that triggered the incident creation.
    * **filtered\_message**: message version with masked inappropriate content as returned by the chat API.
    * **timestamp**: time when the message is sent in YYYY-MM-DD HH:MM:SS format, in UTC.
    * **language**: language of the message. For a full list of supported languages, see <https://docs.ggwp.com/api-docs-chat#language-support>.
    * **metadata**: metadata of the message associated with the incident, when applicable.
  * **player\_sanction**: dictionary describing the sanction applied. It includes:
    * **status**: updated player status. Possible values are `session-muted` and `muted`.
    * **duration**: duration of the sanction, in seconds. If the sanction is applied indefinitely, this value will be `null`.
    * **expiry\_at**: time when the sanction expires. This should be the result of adding the sanction duration to the trigger timestamp. If the sanction is applied indefinitely, this value will be `null`.
  * **reporters:** a list of players who reported the sanctioned player during the last two weeks. It is an array of JSON objects containing their `user_id` and `username`.
  * **sanctioned\_by:** dictionary describing who sanctioned the player. It includes:
    * **type:** can be either `humanmod` (if a moderator sanctioned manually) or `automod` (if automatically sanctioned by the Automod service).
    * **email:** email of the moderator who sanctioned the player. *Note: the key `email` is absent if `type == automod` .*
    * **name:** name of the moderator who sanctioned the player. It can be `null` if name is not available. *Note: the key `name` is absent if `type == automod` .*
  * **ladder\_level\_change:** dictionary containing the information of the changes to ladder level when the player was sanctioned. The value of `ladder_level_change` can be `null` if the game has not subscribed to Automod service.

    * **current\_ladder\_level:** Holds an integer reflecting the ladder level upon application of sanction.&#x20;
    * **previous\_ladder\_level:** Holds an integer reflecting the ladder level just before application of sanction.

    *Note:*

    * The value 0 signifies that the player is not in the ladder yet.
    * Both values can be the same if the sanction didn't lead to any ladder level change.
  * **incident\_count:** dictionary containing counts of all negative non-zero incidents of the player in the last 30 days, grouped by source (e.g., `chat`, `player_reports`, `voice`, etc) and incident\_type (e.g., `profanity`, `verbal_abuse`, etc).&#x20;

    *Note:*&#x20;

    * An incident can be associated with multiple incident categories. The count represents incidents grouped under the given category.
    * The key `incident_count` **r**eturns an empty dictionary when no incidents are recorded
  * **source***(optional)***:** holds the source of the incident. *Note: this is an optional key sent only when `incident_id` is present.*

#### Sample Payload&#x20;

{% code overflow="wrap" %}

```json
{
  "type": "player-sanctioned",
  "event_id": "edce24d3-bf56-46b4-b5ea-40266mnaa5a84",
  "created_at": "2022-06-02 16:49:00",
  "data": {
    "session_id": "freeforallsession_o34u2",
    "incident_id": "20230629051500.000000-1aaf864e-1cdc-4c10-b1f2-ec90bfd4b244",
    "user_id": "12aladf91",
    "username": "sharonsfakeaccount",
    "reputation_score": 150,
    "timestamp": "2022-06-02 16:49:00",
    "channel": "chat",
    "incident_types": ["identity_hate", "chat_verbal_abuse"],
    "severity": "high",
    "confidence": "high",
    "messages": [
      {
        "message_id": "20240905234945.804840-19ea0a90-ecf8-4daa-849c-b9e0ef7cc705",
        "message": "no ur a b*tch",
        "filtered_message": "no ur a *****",
        "timestamp": "2024-09-05 23:49:45",
        "language": "english",
        "metadata": {
          "position": {
            "x": 154,
            "y": 112,
            "z": 77
          }
        }
      }
    ],
    "player_sanction": {
      "status": "muted",
      "duration": 86400,
      "expiry_at": "2022-06-03 16:49:00"
    },
    "reporters": [
      {
        "username": "satish0521",
        "user_id": "101628273075088104"
      },
      {
        "username": "krishnan_ggwp_001",
        "user_id": "100730037617480092"
      },
      {
        "username": "sunandaisro",
        "user_id": "100901564882486072"
      }
    ],
    "sanctioned_by": {
      "type": "humanmod",
      "email": "sahil@fakeaccount.com",
      "name": "sahil"
    },
    "ladder_level_change": {
      "current_ladder_level": 1,
      "previous_ladder_level": 0
    },
    "incident_count": {
      "chat": {
        "chat_severe_verbal_abuse": 2,
        "identity_hate": 2,
        "threat": 2,
        "verbally_abusive_language": 2
      },
      "player_reports": {
        "cheating": 1,
        "exploiting": 1,
        "griefing": 1
      },
      "voice": {
        "sexual_reference": 2,
        "threat": 2,
        "verbally_abusive_language": 2
      }
    },
    "source": "chat"
  }
}
```

{% endcode %}

## **2. Player Reinstated**

A player who was previously sanctioned is now active.

*Event Type:* `player-reinstated`

*Applicable for:* Chat, Voice, Game and Discord

*Trigger:* When a player's status changes back to active. This can be due to

* A moderator reinstates the player
* A player has completed the sanction

*Note:* The event is not triggered if [update status API](/api-docs-contextual-information/player-status.md) is used to change the status of the player.

*Payload description:*

* **type**: webhook event type. Defaults to `player-reinstated` for this event.
* **event\_id**: unique identifier for the event.
* **created\_at**: timestamp at which the event was triggered in YYYY-MM-DD HH:MM:SS format, in UTC.
* **data**: dictionary containing additional event details. It includes:&#x20;
  * **user\_id**: identifier of the reinstated player.
  * **username**: display name of the reinstated player.
  * **reputation\_score**: player reputation score (between 150 and 850).
  * **timestamp**: time when the reinstatement took place in YYYY-MM-DD HH:MM:SS format, in UTC.
  * **channel**: indicates where the reinstatement occurred. Supported channels are `chat`, `voice`, `game` and `discord`.
  * **status**: updated player status. It defaults to `active` for this event.
  * **reinstated\_by:** dictionary describing who reinstated the player. It includes:
    * **type:** can be either `humanmod` (if a moderator reinstated manually) or `automod` (when automatically reinstated by the Automod service upon sanction completion).
    * **email:** email of the moderator who reinstated the player. *Note: the key `email` is absent if `type == automod` .*
    * **name:** name of the moderator who reinstated the player. It can be `null` if name is not available. *Note: the key `name` is absent if `type == automod` .*

#### Sample Payload&#x20;

{% code overflow="wrap" %}

````json
{
  "type": "player-reinstated",
  "event_id": "edce24d3-bf56-46b4-b5ea-40266mnaa5a84",
  "created_at": "2022-06-02 16:49:00",
  "data": {
    "user_id": "12aladf91",
    "username": "sharonsfakeaccount",
    "reputation_score": 150,
    "timestamp": "2022-06-02 16:49:00",
    "channel": "chat",
    "status": "active",
    "reinstated_by": {
      "type": "humanmod",
      "email": "sunanda@ggwp.com",
      "name": "sunanda"
    }
```
  }
}
````

{% endcode %}

## **3. Warning**

A player is displaying toxic behavior, and GGWP wants to recommend a warning to be sent to them in order to de-escalate their toxicity.

*Event Type:* `player-warning`

*Applicable for:* Chat, Voice and Game

*Trigger:* If automod reduces a player's reputation score from a medium+ confidence incident

*Note:* This event gets generated only for the customers subscribed to automod.

*Payload description:*

* **type**: webhook event type. Defaults to `player-warning` for this event.
* **event\_id**: unique identifier for the event.
* **created\_at**: timestamp at which the event was triggered in YYYY-MM-DD HH:MM:SS format, in UTC.
* **data**: dictionary containing additional event details. It includes:&#x20;
  * **session\_id**: identifier of the session where the warning originated.
  * **incident\_id**: identifier of the incident that triggered the warning.
  * **messages**: list of dictionaries containing message details related to the incident, when applicable. It includes:
    * **message\_id**: identifier of the message that triggered the incident creation.
    * **audio\_id**: identifier of an audio clip that triggered the incident creation, when applicable.
    * **message**: message that triggered the incident creation.
    * **filtered\_message**: message version with masked inappropriate content as returned by the chat API.
    * **timestamp**: time when the message is sent in YYYY-MM-DD HH:MM:SS format, in UTC.
    * **language**: language of the message. For a full list of supported languages, see <https://docs.ggwp.com/api-docs-chat#language-support>.
    * **metadata**: metadata of the message associated with the incident, when applicable.
  * **user\_id**: identifier for the warned player.
  * **username**: display name of the warned player.
  * **reputation\_score**: player reputation score (between 150 and 850).
  * **timestamp**: time when the warning was issued in YYYY-MM-DD HH:MM:SS format, in UTC.
  * **channel**: indicates where the sanction was applied. Supported channels are `chat`, `voice` and `game` .
  * **incident\_types**: list of incident types associated with the incident that triggered the warning, when applicable.
  * **severity**: severity of the incident that triggered the warning, when applicable. Possible values are `low`, `medium`, `high`.
  * **confidence**: confidence in the incident that triggered the warning, when applicable. Possible values are `low`, `medium`, `high`, `very high`.
  * **warned\_by:** dictionary describing who issued the warning. It includes:
    * **type:** can be either `humanmod` (if a moderator issued the warning manually) or `automod` (if automatically issued by the Automod service).
    * **email:** email of the moderator who issued the warning.\
      *Note: the key `email` is absent if `type == automod`.*
    * **name:** name of the moderator who issued the warning. It can be null if name is not available.\
      *Note: the key `name` is absent if `type == automod`.*
  * **recommended\_warning**: suggested message to include in the player notification.

#### Sample Payload&#x20;

{% code overflow="wrap" %}

```json
{
  "type": "player-warning",
  "event_id": "edce24d3-bf56-46b4-b5ea-40266mnaa5a84",
  "created_at": "2022-06-02 16:49:00",
  "data": {
    "session_id": "freeforallsession_o34u2",
    "incident_id": "20230629051500.000000-1aaf864e-1cdc-4c10-b1f2-ec90bfd4b244",
    "messages": [
      {
        "message_id": "20240905234945.804840-19ea0a90-ecf8-4daa-849c-b9e0ef7cc705",
        "message": "no ur a b*tch",
        "filtered_message": "no ur a *****",
        "timestamp": "2024-09-05 23:49:45",
        "language": "english",
        "metadata": {
          "position": {
            "x": 154,
            "y": 112,
            "z": 77
          }
        }
      }
    ],
    "user_id": "12aladf91",
    "username": "sharonsfakeaccount",
    "reputation_score": 150,
    "timestamp" : "2022-06-02 16:49:00",
    "channel": "chat", 
    "incident_types": ["identity_hate", "chat_verbal_abuse"],
    "severity": "high",
    "confidence": "high",
    "warned_by": {
      "type": "humanmod",
      "email": "moderator@example.com",
      "name": "John"
    },
    "recommended_warning": "This is a warning based on your recent chat behavior. Please refrain from sending anymore offensive messages in order to prevent being muted."
  }
}
```

{% endcode %}

## **4. Workflow Integrations**

Any workflow property of an incident is changed from the dashboard.

*Event Type:* `incident-updated`

*Trigger:* When value of any of the following attributes related to an incident changes

* `status` -> `not-reviewed`, `reviewed`,`in-process`, `archived`, `escalated-for-deeper-review`
* `confidence` -> `very_low`, `low`, `medium`, `high`, `very high`
* `severity` -> `low`, `medium`, `high`
* `accuracy` -> `not-confirmed`, `confirm-accurate`, `mark-inaccurate`, `dismiss-incident`
* `incident_assignee` -> Email ID of the assignee. If no assignee exists then value is `null`
* `incident_types`

*Payload description:*

* **type**: webhook event type. Defaults to `incident-updated` for this event.
* **event\_id**: unique identifier for the event.
* **created\_at**: timestamp at which the event was triggered in YYYY-MM-DD HH:MM:SS format, in UTC.
* **data**: dictionary containing additional event details. It includes:&#x20;
  * **incident\_id**: identifier of the incident that was updated.
  * **timestamp**: time when the incident was updated in YYYY-MM-DD HH:MM:SS format, in UTC.
  * **user\_id**: identifier for the sanctioned player.
  * **username**: display name of the sanctioned player.
  * **reputation\_score**: player reputation score (between 150 and 850).
  * **incident\_details**: dictionary describing the incident updates. It includes:
    * **user**: information about the moderator/admin who updated the incident's attributes.
    * **source:** indicates where the incident was applied. Supported sources are `chat`, `voice`, `player_reports` , `discord` , `usernames`  and `image` .
    * **session\_id**: identifier of the session where the incident originated, when applicable.
    * **changelog**: dictionary with old and new incident details. It includes:
      * **from**: dictionary of old values before the update was applied.
      * **to**: dictionary of new values after the update was applied.
  * **messages**: list of dictionaries containing message details related to the incident, when applicable. It includes:&#x20;
    * **message\_id**: identifier of the message that triggered the incident creation.
    * **audio\_id**: identifier of an audio clip that triggered the incident creation, when applicable.
    * **message**: message that triggered the incident creation.
    * **filtered\_message**: message version with masked inappropriate content as returned by the chat API.
    * **timestamp**: time when the message is sent in YYYY-MM-DD HH:MM:SS format, in UTC.
    * **language**: language of the message. For a full list of supported languages, see <https://docs.ggwp.com/api-docs-chat#language-support>.
    * **metadata**: metadata of the message associated with the incident, when applicable.

#### Sample Payload&#x20;

* When a moderator is assigned to a ticket

{% code overflow="wrap" %}

```json
{
  "type": "incident-updated",
  "event_id": "edce24d3-bf56-46b4-b5ea-40266mnaa5a84",
  "created_at": "2022-06-02 16:49:00",
  "data": {
    "incident_id": "20230629051500.000000-1aaf864e-1cdc-4c10-b1f2-ec90bfd4b244",
    "timestamp" : "2022-06-02 16:49:00", 
    "user_id": "12aladf91",
    "username": "sharonsfakeaccount",
    "reputation_score": 150,
    "incident_details": {
      "user": "appuser@ggwp.com",
      "source": "chat",
      "session_id": "sessio9999999",
      "changelog": {
	"from": {"incident_assignee": null},
	"to": {"incident_assignee": "newmoderator@ggwp.com"}
      }
    },
    "messages": [
      {
        "message_id": "20240905234945.804840-19ea0a90-ecf8-4daa-849c-b9e0ef7cc705",
        "message": "no ur a b*tch",
        "filtered_message": "no ur a *****",
        "timestamp": "2024-09-05 23:49:45",
        "language": "english",
        "metadata": {
          "position": {
            "x": 154,
            "y": 112,
            "z": 77
          }
        }
      }
    ]
  }
}
```

{% endcode %}

* When an incident is marked as accurate, there by changing the confidence level

{% code overflow="wrap" %}

```json
{
  "type": "incident-updated",
  "event_id": "182a35b0-5e5c-49d3-9d91-210aaaf51497",
  "created_at": "2024-02-23 10:41:03",
  "data": {
    "incident_id": "20240223094326.000000-ee79cba4-be6d-4d50-bfa9-cec5efe64f21",
    "timestamp": "2024-02-23 10:41:03",
    "user_id": "12aladf91",
    "username": "sharonsfakeaccount",
    "reputation_score": 150,
    "incident_details": {
      "user": "appuser@ggwp.com",
      "source": "chat",
      "session_id": "sessio9999999",
      "changelog": {
        "from": {
          "status": "not-reviewed",
          "confidence": "medium",
          "accuracy": "not-confirmed"
        },
        "to": {
          "status": "reviewed",
          "confidence": "very high",
          "accuracy": "confirm-accurate"
        }
      }
    },
    "messages": [
      {
        "message_id": "20240905234945.804840-19ea0a90-ecf8-4daa-849c-b9e0ef7cc705",
        "message": "no ur a b*tch",
        "filtered_message": "no ur a *****",
        "timestamp": "2024-09-05 23:49:45",
        "language": "english",
        "metadata": {
          "position": {
            "x": 154,
            "y": 112,
            "z": 77
          }
        }
      }
    ]
  }
}
```

{% endcode %}

* When an incident is marked as inaccurate and its incident types are changed. Please note, the confidence gets changed to `very high` because of human intervention.

{% code overflow="wrap" %}

```json
{
  "type": "incident-updated",
  "event_id": "383a9aae-1845-4448-b485-ff72d1afee2e",
  "created_at": "2024-02-23 10:41:33",
  "data": {
    "incident_id": "20240223094326.000000-ee79cba4-be6d-4d50-bfa9-cec5efe64f21",
    "timestamp": "2024-02-23 10:41:33",
    "user_id": "12aladf91",
    "username": "sharonsfakeaccount",
    "reputation_score": 150,
    "incident_details": {
      "user": "appuser@ggwp.com",
      "source": "chat",
      "session_id": "sessio9999999",
      "changelog": {
        "from": {
          "status": "reviewed",
          "confidence": "very high",
          "incident_types": [
            "chat_offensive_language",
            "profanity"
          ],
          "accuracy": "confirm-accurate"
        },
        "to": {
          "status": "reviewed",
          "confidence": "very high",
          "incident_types": [
            "chat_verbal_abuse"
          ],
          "accuracy": "mark-inaccurate"
        }
      }
    },
    "messages": [
      {
        "message_id": "20240905234945.804840-19ea0a90-ecf8-4daa-849c-b9e0ef7cc705",
        "message": "no ur a b*tch",
        "filtered_message": "no ur a *****",
        "timestamp": "2024-09-05 23:49:45",
        "language": "english",
        "metadata": {
          "position": {
            "x": 154,
            "y": 112,
            "z": 77
          }
        }
      }
    ]
  }
}
```

{% endcode %}

## 5. **Incident Detected**

Triggered when a new incident is detected.

*Event Type:* `incident-detected`

*Applicable for:* Chat, Voice, Player Reports, Discord, Usernames and Image.

*Trigger:* When an incident is created through one of the following

* Chat message
* Voice transcription
* Player report
* Discord message
* Username creation
* Image

*Payload description:*

* **type**: webhook event type. Defaults to `incident-detected` for this event.
* **event\_id**: unique identifier for the event.
* **created\_at**: timestamp at which the event was triggered in YYYY-MM-DD HH:MM:SS format, in UTC.
* **data**: dictionary containing additional event details. It includes:&#x20;
  * **session\_id**: identifier of the session where the incident originated, when applicable (n*ot applicable for usernames*)
  * **incident\_id**: identifier of the incident.
  * **messages**: list of dictionaries containing message details related to the incident, when applicable (a*pplicable for chat, voice, discord only*). It includes:
    * **message\_id**: identifier of the message that triggered the incident creation.
    * **audio\_id**: identifier of an audio clip that triggered the incident creation, when applicable.
    * **message**: message that triggered the incident creation.
    * **filtered\_message**: message version with masked inappropriate content as returned by the chat API.
    * **timestamp**: time when the message is sent in YYYY-MM-DD HH:MM:SS format, in UTC.
    * **language**: language of the message. For a full list of supported languages, see <https://docs.ggwp.com/api-docs-chat#language-support>.
    * **metadata**: metadata of the message associated with the incident, when applicable.
  * **user\_id**: identifier for the player who sent the toxic message (Chat, Voice, Discord and Usernames) or identifier for the player who got reported through Player Reports.
  * **username**: display name of the player ( `null` for users without usernames or for invalid users during username creation).
  * **reputation\_score**: player reputation score (between 150 and 850) (not applicable for usernames)
  * **timestamp**: time when the incident is detected in YYYY-MM-DD HH:MM:SS format, in UTC.
  * **source**: indicates where the incident was applied. Supported sources are `chat`, `voice`, `player_reports` , `discord` , `usernames` and `image` .
  * **incident\_types**: list of incident types associated with the incident.
  * **severity**: severity of the incident. Possible values are `low`, `medium`, `high`.
  * **confidence**: confidence in the incident. Possible values are `low`, `medium`, `high`, `very high`.
  * **reporters**: list of reporters, when applicable (a*pplicable for player\_reports only*). It includes:
    * **user\_id**: identifier of the player who sent the report.
    * **username**: display name of the player who sent the report.
    * **comment**: comment explaining the need for the report, when applicable.
  * **flagged\_usernames**: List of flagged usernames *(applicable only for  usernames).* It includes:
    * **username\_id**: Unique identifier of the flagged username that triggered the incident creation.
    * **username**: The username that triggered the incident creation.
    * **timestamp**: time when the username is sent in YYYY-MM-DD HH:MM:SS format, in UTC.
  * **flagged\_images**: List of flagged images *(applicable only for  image).* It includes:
    * **image\_id**: Unique identifier of the flagged image that triggered the incident creation.
    * **timestamp**: time when the image is sent in YYYY-MM-DD HH:MM:SS format, in UTC.

#### Sample Payload&#x20;

* When a chat incident is detected

{% code overflow="wrap" %}

```json
{
  "type": "incident-detected",
  "event_id": "09152afb-7a61-4348-9959-6d1938f7f044",
  "created_at": "2024-09-05 23:49:45",
  "data": {
    "session_id": "sessio9999999",
    "incident_id": "20240905234945.804840-b9da93e1-82e0-47b4-adce-ac9ee3cd8cde",
    "user_id": "12aladf91",
    "username": "sharonsfakeaccount",
    "reputation_score": 345,
    "timestamp": "2024-09-05 23:49:45",
    "incident_types": [
      "chat_verbal_abuse",
      "identity_hate"
    ],
    "severity": "high",
    "confidence": "medium",
    "source": "chat",
    "messages": [
      {
        "message_id": "20240905234945.804840-19ea0a90-ecf8-4daa-849c-b9e0ef7cc705",
        "message": "no ur a b*tch",
        "filtered_message": "no ur a *****",
        "timestamp": "2024-09-05 23:49:45",
        "language": "english",
        "metadata": {
          "position": {
            "x": 154,
            "y": 112,
            "z": 77
          }
        }
      }
    ]
  }
}
```

{% endcode %}

* When a voice incident is detected

{% code overflow="wrap" %}

```json
{
  "type": "incident-detected",
  "event_id": "09152afb-7a61-4348-9959-6d1938f7f044",
  "created_at": "2024-04-10 05:50:39",
  "data": {
    "session_id": "sessio9999999",
    "incident_id": "20240410054953.222782-b9da93e1-82e0-47b4-adce-ac9ee3cd8cde",
    "user_id": "12aladf91",
    "username": "sharonsfakeaccount",
    "reputation_score": 345,
    "timestamp": "2024-09-05 23:49:45",
    "incident_types": [
      "chat_verbal_abuse",
      "identity_hate"
    ],
    "severity": "high",
    "confidence": "medium",
    "source": "voice",
    "messages": [
      {
        "message_id": "20240410054953.222782-2072ec67-f3b6-4c2d-bfa4-9cc13f81b7a8",
        "audio_id": "fe8ef39c-0d70-417f-9087-6f4cf7ad5308",
        "message": "no you are a bitch",
        "filtered_message": "no you are a *****",
        "timestamp": "2024-04-10 05:49:53",
        "language": "english"
      }
    ]
  }
}
```

{% endcode %}

* When a discord incident is detected

```json
{
  "type": "incident-detected",
  "event_id": "13f219b9-2a09-4736-91ec-d783df5f5bf9",
  "created_at": "2024-09-05 23:49:45",
  "data": {
    "session_id": "1008833492383178872_1025355886220288060",
    "incident_id": "20240905234945.804840-c9f36850-0ea3-41b3-831c-647c2a81e737",
    "user_id": "8e6eebe7-944f-4209-a94e-9a79e1cb7a41",
    "username": "clive",
    "reputation_score": 450,
    "timestamp": "2024-09-05 23:49:45",
    "incident_types": [
      "chat_offensive_language",
      "criticizing_gameplay"
    ],
    "severity": "low",
    "confidence": "medium",
    "source": "discord",
    "messages": [
      {
        "message_id": "20240905234945.804840-19ea0a90-ecf8-4daa-849c-b9e0ef7cc705",
        "message": "you guys suck",
        "filtered_message": "you guys ****",
        "timestamp": "2024-09-05 23:49:45",
        "language": "english"
      }
    ]
  }
}
```

* When a player reports incident is detected

```json
{
  "type": "incident-detected",
  "event_id": "c8476d6b-fcd4-4254-b762-8b1b825d4995",
  "created_at": "2024-04-10 07:17:27",
  "data": {
    "session_id": "1008833492383178872_1025355886220288060",
    "incident_id": "12b2e6cd-7d5b-5f30-9b29-a61dc631351f",
    "user_id": "12aladf91",
    "username": "sharonsfakeaccount",
    "reputation_score": 212,
    "timestamp": "2024-04-10 07:14:51",
    "incident_types": [
      "cheating"
    ],
    "severity": "low",
    "confidence": "low",
    "source": "player_reports",
    "reporters": [
      {
        "username": "clive",
        "user_id": "8e6eebe7-944f-4209-a94e-9a79e1cb7a41",
        "comment": "Swearing in game"
      }
    ]
  }
}
```

* When a usernames incident is detected

```json
{
  "type": "incident-detected",
  "event_id": "9fcea299-13d7-42e4-9317-c4a431b7a877",
  "created_at": "2025-05-27 23:39:32",
  "data": {
    "incident_id": "20250527233727-2c9b5c4f-105e-4d8c-aaa1-e3122c80f703",
    "user_id": "user1234",
    "username": null,
    "timestamp": "2025-05-27 23:37:27",
    "incident_types": [
      "sexual_content",
      "verbal_abuse"
    ],
    "severity": "low",
    "confidence": "high",
    "source": "usernames",
    "flagged_usernames": [
      {
        "username_id": "20250527233727-3db17bf0-4748-488c-a187-b409a9a73155",
        "username": "BigCock",
        "timestamp": "2025-05-27 23:37:27"
      }
    ]
  }
}
```

* When a image incident is detected

```json
{
  "type": "incident-detected",
  "event_id": "3954725b-1cb8-44dc-9827-bd839f3848bd",
  "created_at": "2026-06-18 04:13:52",
  "data": {
    "incident_id": "20260618041318.965248-14a03030-e573-4920-9e53-c9155d003b57",
    "user_id": "user1234",
    "username": null,
    "timestamp": "2026-06-18 04:13:18",
    "incident_types": [
      "alcohol_drugs"
    ],
    "severity": "low",
    "confidence": "high",
    "source": "image",
    "flagged_images": [
      {
        "image_id": "20260618041318.965248-732f7827-a53d-49c0-8f04-34e96fb7940f",
        "timestamp": "2026-06-18 04:13:18"
      }
    ]
  }
}
```

## 6. Player Reputation Score Batch

Triggered when Reputation Score Batch csv is ready to be downloaded, post the call to [Reputation Batch API](/api-docs-reputation/reputation-score-batch.md).&#x20;

*Event Type:* `player-reputation-batch-export`

*Trigger:* Triggered when Reputation Score Batch csv is ready to be downloaded

*Payload description:*

* **type**: webhook event type. Defaults to `player-reputation-batch-export` for this event.
* **event\_id**: unique identifier for the event.
* **created\_at**: timestamp at which the event was triggered in YYYY-MM-DD HH:MM:SS format, in UTC.
* **data**: dictionary containing additional event details. It includes:&#x20;
  * csv\_urls: urls for the CSVs with data for all users reputation score.

#### Sample Payload

{% code overflow="wrap" %}

```json
{
  "type": "player-reputation-batch-export",
  "event_id": "6dd903ba-c464-4a78-9706-88c9d5ee455e",
  "created_at": "2024-10-08 05:18:48",
  "data": {
    "csv_urls": [
      "https://ggwp-list-export.com/dev/91012e3b8a27426a95a43a3d84bad440-players.csv?AWSAccessKeyId=ASIAQEFB2&Signature=xP8B%2Bw2F1O8rFHYhfJ8Vj7p0KkI%3D&x-amz-security-token=IQoJbRjURp%3D&Expires=1728366528"
    ]
  }
}
```

{% endcode %}

**Note:** In cases the number of users exceeds 1,000,000, the data will be split across multiple CSV files.

## 7. Grooming Alert

*Event Type:* `grooming-alert`

*Applicable for:* Chat, Voice, and Discord

*Trigger:* When a new grooming flag is created based on a player's patterns of communication

*Payload description:*

* **type**: webhook event type. Defaults to `grooming-alert` for this event.
* **event\_id**: unique identifier for the event.
* **created\_at**: timestamp at which the event was triggered in YYYY-MM-DD HH:MM:SS format, in UTC.
* **data**: dictionary containing additional event details. It includes:&#x20;
  * **user\_id:** unique identifier of the player flagged for potential grooming.
  * **username:** display name of the player.
  * **date:** time when the event is detected in YYYY-MM-DD format.
  * **source:** source where the incident was detected. Supported values: `chat`, `voice`, `discord`.
  * **risk\_level:** measures the confidence of the alert based on aggregated indicators. Possible values: `low`, `medium`, `high`.&#x20;
  * **top\_risk\_indicators:** indicators contributing the most to this alert. These represent behavioral signals where the flagged user exhibited patterns outside the ordinary compared to typical user communication. Possible values include:
    * Age Request - Attempts to determine the target's age.
    * Flirtatious Behavior - Compliments about the target's appearance.
    * Gender Request - Attempts to determine the target's gender.
    * PII Solicitation - Soliciting personally identifiable information.
    * Privacy Invasion - Probing into the target's living situation or relationship status.
    * Request for Pictures - Requests for images or video of the target's body.
    * Request to Meet - Attempts to arrange an in-person meeting.
    * Secretive Language - Language encouraging the target to keep the conversation hidden from others.
    * Sexual Content - Undirected sexually explicit language or content.
    * Sexual Harassment - Directed sexual language or behavior intended to sexualize, objectify, insult, pressure, or demean.
    * Sexual Violence - Sexual language that references, threatens, glorifies, or describes sexual acts involving violence, force, coercion, or lack of consent.
  * **reputation\_score:** player's reputation score (between 150 and 850).

#### Sample Payload

{% code overflow="wrap" %}

```json
{
  "type": "grooming-alert",
  "event_id": "a914c763-22b8-4f65-b7b2-46a912e1df0a",
  "created_at": "2025-07-03 09:12:27",
  "data": {
    "user_id": "plr_5829zb",
    "username": "crimsonvale",
    "date": "2025-07-03",
    "source": "chat",
    "risk_level": "high",
    "top_risk_indicators": [
      "Flirtatious Behavior", 
      "Privacy Invasion",
      "Age Request"
    ],
    "reputation_score": 657
  }
}
```

{% endcode %}

## 8. Mental Health Alert

*Event Type:* `mental-health-alert`

*Applicable for:* Chat, Voice, and Discord

*Trigger:* When a new mental health flag is created based on a player's patterns of communication

*Payload description:*

* **type**: webhook event type. Defaults to `mental-health-alert` for this event.
* **event\_id**: unique identifier for the event.
* **created\_at**: timestamp at which the event was triggered in YYYY-MM-DD HH:MM:SS format, in UTC.
* **data**: dictionary containing additional event details. It includes:&#x20;
  * **user\_id:** unique identifier of the player flagged for potential mental health risk.
  * **username:** display name of the player.
  * **date:** time when the event is detected in YYYY-MM-DD format.
  * **source:** source where the incident was detected. Supported values: `chat`, `voice`, `discord`.
  * **risk\_level:** measures the confidence of the alert based on aggregated indicators. Possible values: `low`, `medium`, `high`.&#x20;
  * **top\_risk\_indicators: i**ndicators contributing the most to this alert. These represent communication patterns where the flagged user exhibited signs of potential distress or abnormal emotional behavior compared to typical user interactions. Possible values include:
    * Domestic Conflict - References to abuse, strained family relationships, household arguments, or loss of family support systems.
    * Economic Hardship - References to financial struggles such as inability to afford food, housing, or basic day-to-day necessities.
    * Educational Stress - Distress related to academic pressure, burnout, dropping out, or social difficulties in a school or university setting.
    * Relationship Distress - Emotional distress tied to a romantic relationship, including feelings of being unloved, conflict with a partner, or fear of abandonment.
    * Self Harm - Declarations of intent to physically hurt themselves, or references to past or ongoing self-harm behaviors.
    * Self Loathing - Expressions of deep self-hatred, feeling undeserving of love or belonging, or that their existence has no value.
    * Suicide Ideation - Expressions of wanting to die, feeling the world would be better without them, or actively contemplating suicide.
  * **reputation\_score:** player reputation score (between 150 and 850).

#### Sample Payload

{% code overflow="wrap" %}

```json
{
  "type": "mental-health-alert",
  "event_id": "f913d2e1-4b8e-4f0b-a1b7-8e4a930cd3d6",
  "created_at": "2025-08-22 11:39:28",
  "data": {
    "user_id": "plr_6729qw",
    "username": "nova_ember",
    "date": "2025-08-22",
    "source": "chat",
    "risk_level": "medium",
    "top_risk_indicators": [
      "Suicide Ideation", 
      "Self Harm", 
      "Domestic Conflict"
    ],
    "reputation_score": 328
  }
}
```

{% endcode %}

## 9. Player Churn Risk

A player is showing early signs of disengagement based on behavioral indicators and may be at high risk of churn. Handling this event enables proactive interventions by Customer Support or Live Ops—such as nudges, offers, or reviews—before a player drops off completely.

*Event Type:* `player-churn-risk`

*Applicable for:* Chat

*Trigger:* When a player's recent behavior crosses defined thresholds for churn risk, based on multiple engagement factors. Only high-risk tiers will trigger this event.

*Payload description:*

* **type**: Webhook event type. Defaults to `player-churn-risk` for this event.
* **event\_id**: Unique identifier for the event.
* **created\_at**: Timestamp at which the event was triggered in YYYY-MM-DD HH:MM:SS format, in UTC.
* **data**: Container for all additional event details.
  * **user\_id**: Unique identifier of the player at risk.
  * **username**: Display name of the player.
  * **timestamp**: Time of the churn risk determination (UTC).
  * **risk\_factors**: List of engagement dimensions contributing to churn risk. Only the most relevant indicators are included in each event. Possible values include:
    * `Sparse Activity`
    * `Low Social Interaction`
    * `Declining Engagement`
    * `Reduced Message Effort`
    * `New Player`
    * `Weak Collaboration`
    * `Limited Positivity`
    * `Unclear Language`
    * `Conflict Signals`
    * `Technical Issues`
  * **reports\_filed**: Summary of player-submitted reports in the last 30 days. Including a dictionary of report counts by type (e.g., harassment, cheating)
  * **reports\_received**: Summary of reports filed against the player in the last 30 days. Including a dictionary of report counts by type (e.g., abuse, spamming)

#### Sample Payload

{% code overflow="wrap" %}

```json
{
  "type": "player-churn-risk",
  "event_id": "b328e182-d4fc-4f2b-b302-d0f9152bb08a",
  "created_at": "2025-06-12 18:45:00",
  "data": {
    "user_id": "plr_8391xa",
    "username": "runefirex",
    "timestamp": "2025-06-12 18:44:50",
    "risk_factors": [
      "Declining Engagement", 
      "Weak Collaboration", 
      "Technical Issues"
    ],
    "sessions_with_flagged_players": 15,
    "reports_filed": {
      "cheating": 4,
      "bullying": 6
    },
    "reports_received": {
      "abusing": 4,
      "cheating": 1
    }
  }
}
```

{% endcode %}

## 10. **Message Feedback**&#x20;

*Event Type:* `message-feedback`

*Applicable for:* Chat, Voice and Discord

*Trigger:* When the moderator submits feedback for a non-negative incident or a message.

*Payload description:*

* **type**: webhook event type. Defaults to `message-feedback` for this event.
* **event\_id**: unique identifier for the event.
* **created\_at**: timestamp at which the event was triggered in YYYY-MM-DD HH:MM:SS format, in UTC.
* **data**: dictionary containing additional event details. It includes:&#x20;
  * **incident\_id**: Identifier of the incident associated with the feedback - either an existing non-negative incident or a newly created incident for the message.
  * **session\_id**: identifier of the session where the incident originated, when applicable
  * **timestamp**: time when the feedback was submitted in YYYY-MM-DD HH:MM:SS format, in UTC.
  * **user\_id**: identifier for the player who sent the message.
  * **username**: display name of the player who sent the message.
  * **reputation\_score**: player reputation score (between 150 and 850).
  * **source**: indicates the source of the incident/message. Supported sources are `chat`, `voice`, `discord`.
  * **severity**: severity of the incident for which the feedback was submitted. Possible values are `low`, `medium`, `high`.
  * **confidence**: confidence in the incident for which the feedback was submitted. Possible values are `low`, `medium`, `high`, `very high`.
  * **score\_change**: change in player score caused by the submitted feedback
  * **incident\_types**: list of incident types in the feedback submitted by the moderator.
  * **feedback**: feedback message submitted by the moderator
  * **submitted\_by**: email of the moderator who submitted the feedback, when applicable
  * **message\_details**: dictionary containing message details related to the incident, when applicable. It includes:
    * **message\_id**: identifier of the message for which feedback was submitted.
    * **audio\_id**: identifier of an audio clip for which feedback was submitted, when applicable.
    * **message**: message for which feedback was submitted.
    * **filtered\_message**: message version with masked inappropriate content as returned by the chat API.
    * **timestamp**: time when the message is sent in YYYY-MM-DD HH:MM:SS format, in UTC.
    * **language**: language of the message. For a full list of supported languages, see <https://docs.ggwp.com/api-docs-chat#language-support>.
    * **metadata**: metadata of the message associated with the incident, when applicable.

#### Sample Payload&#x20;

{% code overflow="wrap" %}

```json
{
  "type": "message-feedback",
  "event_id": "c0af414d-5bc8-4176-a574-e2e511a31980",
  "created_at": "2026-01-21 11:55:05",
  "data": {
    "incident_id": "20260121113632.810202-c49d9cc9-00a1-4246-8945-624b78818d0c",
    "session_id": "jan_20_2026_s05",
    "timestamp": "2026-01-21 11:55:05",
    "user_id": "jan_20_2026_u05",
    "username": "jan_20_2026_u05",
    "reputation_score": 450,
    "source": "chat",
    "severity": "medium",
    "confidence": "very high",
    "score_change": -10,
    "incident_types": [
      "bullying"
    ],
    "feedback": "bullying message",
    "user": "krishnan@ggwp.com",
    "message_details": {
      "message_id": "20260121113632.810202-3e95db1f-fccc-4c60-8638-f01449e69a57",
      "message": "hey fella",
      "filtered_message": "hey fella",
      "timestamp": "2026-01-21 11:36:32",
      "language": "english"
    }
  }
}
```

{% endcode %}
