---
title: "Power up: Webhook"
description: Webhook powerup supporting CAP standard.
---

[Skip to content](https://help.emergent3.com/webhook#main-content)

English

Show submenu for translations

[![E3.logo.black](https://help.emergent3.com/hubfs/E3.logo.black.svg)](https://www.emergent3.com?hsLang=en)

- [Home](https://emergent3.com/)
- Features
  
  Show submenu for Features

    - [Alert](https://emergent3.com/alert)
    - [Check In](https://emergent3.com/checkin)
    - [Smart Maps](https://emergent3.com/smartmap)
    - [Chat](https://emergent3.com/chat)
    - [Reunification](https://emergent3.com/reunification)
    - [Reports](https://emergent3.com/report)
- Who we serve
  
  Show submenu for Who we serve

    - [Local Government](https://emergent3.com/government)
    - [Hospitals & Healthcare](https://emergent3.com/healthcare)
- [Pricing](https://emergent3.com/pricing)
- Resources
  
  Show submenu for Resources

    - [Blog](https://emergent3.com/blog)
- [Company](https://emergent3.com/about-us/)

Open main navigation

Close main navigation

- [Home](https://emergent3.com/)
- Features
  
  Show submenu for Features

    - [Alert](https://emergent3.com/alert)
    - [Check In](https://emergent3.com/checkin)
    - [Smart Maps](https://emergent3.com/smartmap)
    - [Chat](https://emergent3.com/chat)
    - [Reunification](https://emergent3.com/reunification)
    - [Reports](https://emergent3.com/report)
- Who we serve
  
  Show submenu for Who we serve

    - [Local Government](https://emergent3.com/government)
    - [Hospitals & Healthcare](https://emergent3.com/healthcare)
- [Pricing](https://emergent3.com/pricing)
- Resources
  
  Show submenu for Resources

    - [Blog](https://emergent3.com/blog)
- [Company](https://emergent3.com/about-us/)
- English
  
  Show submenu for translations

 Hello. How can we help you?

- There are no suggestions because the search field is empty.

1. [Help Center](https://help.emergent3.com/?hsLang=en)
2. [Integrations & Single Sign-On (SSO)](https://help.emergent3.com/integrations-single-sign-on-sso?hsLang=en)
3. [Third-Party Integrations](https://help.emergent3.com/integrations-single-sign-on-sso?hsLang=en#third-party-integrations)

September 21, 2026

# Power up: Webhook

## When an alert happens in E3 (created, ended, cancelled, or its type is changed), E3 can automatically notify an external system by sending it a message over the internet — this is a webhook.

A webhook lets your workspace push alert activity to another system over the internet. Whenever an alert is started, ended, or has its alert type changed, E3 sends a message (an HTTP POST) to a URL you provide. Typical receivers include access-control platforms, mass-notification hubs, dispatch consoles, logging tools, and partner bridges such as Mutualink.

You can choose the format of that message:

| **Format** | **What it looks like** | **When to use it** |
| --- | --- | --- |
| [**E3 Standard**](https://help.emergent3.com/webhook#E3-Standard) (default) | Simple JSON in E3's own structure | Your receiving system understands E3's own format. |
| [**CAP Standard**](https://help.emergent3.com/webhook#CAP-Standard) | XML following the Common Alerting Protocol (CAP) v1.2 | Your receiving system is an emergency-alert platform (fire panels, mass-notification hubs, government systems) that expects the industry-standard CAP format. |
| [**Custom JSON**](https://help.emergent3.com/webhook#Custom-JSON) | JSON in a shape you design, using a template with placeholders | Your receiving system expects its own JSON layout that is neither E3 Standard nor CAP. |

 

CAP is an international standard used by emergency alerting systems (for example weather alerts and IPAWS) so different systems can understand each other's alerts without custom integration work.

**One-way, outbound only.** E3 sends the message out. It does not receive alerts from anywhere else, and it does not act on the receiving system's reply (the reply is saved in the log for troubleshooting only). Webhooks carry alert start, end and type-change events only, not check-ins, chat, roll call or roster data.

Where to set it up

Workspace → Power-Ups → Webhook

1. Select the alert type you want to connect, then click **Add Webhook**.
2. Enter the **Webhook URL** of the system that should receive the alerts.
3. Choose the **Request format**: E3 Standard, CAP Standard or Custom JSON.
4. If you chose Custom JSON, paste your **Body template** (see the Custom JSON section below).
5. Optional: add a **Basic Auth** username and password, and any **custom headers** your receiver needs.
6. Under **Groups & alerts**, choose which groups and alert types should trigger this webhook.
7. Choose when to send: **Notify on alert** (new alert or type change) and/or **Notify on end** (alert ended). At least one must be on.
8. Make sure **Enabled** is on, then save.

You can add more than one webhook, and each one has its own URL, format and scope. A single webhook uses one format for every event it sends.

**Who can see it:** admins with the Accounts Manage permission can always manage webhooks. Workspace (IT) users can manage them only if an admin has turned on **Grant IT Manager Control** for the workspace.

Choosing which alerts are sent

An alert is sent to a webhook only when all of these are true:

- The webhook is enabled and has a URL.
- The matching switch is on (Notify on alert or Notify on end).
- The alert was launched in a group you selected for that webhook.
- The alert's type is selected for that group (or you chose all alert types for the group).
- a **cancel** message for the old alert type, then
- an **update** message for the new alert type (which points back to the cancelled one in CAP).
- **Write placeholders without quotes.** Use "Status": , not "Status": "". E3 adds the quotes for text, and leaves true/false and numbers as true/false and numbers.
- The finished message must be valid JSON. E3 checks this with sample data when you save.
- An unknown variable name is rejected when you save. It does not silently become blank.
- After filling in the template, E3 removes any key whose value is empty, along with any object left empty. That means you can safely include optional fields such as an email or address.
- Keep static values (such as a partner ID) as normal quoted text in the template.
- The template can be up to 16,000 characters.
- Every message is an HTTP POST to your URL, sent on a high-priority queue so alerts are never held up behind routine work.
- **Retries:** if your receiver returns an error (4xx or 5xx) or times out, E3 tries up to 3 times, 5 seconds apart. Your receiver may therefore see the same message more than once. Make your endpoint idempotent, using the alert ID plus the event as the duplicate check.
- **Logging:** each attempt is logged with the URL, request body, response, status code, duration, alert ID and alert type ID.
- **Content type:** E3 Standard and Custom JSON send application/json; CAP Standard sends application/xml. A custom header cannot override this.
- **Authentication:** messages are not signed. Protect your endpoint with Basic Auth, a shared-secret custom header, or an IP allow-list.
- Accept POST requests over HTTPS at a stable URL.
- Reply with a 2xx status as soon as the message is accepted, and do the real work afterwards. Slow replies delay the alert queue.
- Expect two messages when an alert's type changes: a cancel followed by an update.
- Tolerate new fields being added to messages over time.
- The category, urgency, severity and certainty values come from the **alert type**, not the individual alert. If they are never set, E3 falls back to safe defaults (Safety / Immediate / Severe / Observed) so that every CAP message is valid.
- Webhooks created before alert scoping existed keep sending for all groups until they are saved again. The first save from the screen switches them to the explicit group and alert-type selection.
- This Power-Up covers generic webhooks only. The Vivi integration is separate and has its own settings.

If nothing arrives at your receiver, check these four things first.

How it works

1. An alert is created, ended, or has its type changed in E3.
2. E3 checks the workspace's webhooks and finds the ones that match the alert's group and type.
3. For each match, E3 builds the message in that webhook's format (E3 Standard JSON, CAP XML or your Custom JSON) and POSTs it to your URL.
4. Your system receives it and does whatever it needs to: display it, forward it, sound an alarm, and so on.
5. E3 logs every attempt, successful or not, for troubleshooting.

One quirk: changing an alert's type sends two messages

If an alert's type is changed mid-alert, E3 sends:

This applies to all three formats, so your receiver can always match a retraction with its replacement. Use the alert ID to correlate the two.

Which E3 event sends which message

| **What happened in E3** | **E3 event value** | **CAP msgType (CAP Standard only)** |
| --- | --- | --- |
| New alert created | alert.created | Alert |
| Alert ended | alert.ended | Cancel |
| Alert type changed → old type | alert.cancelled | Cancel |
| Alert type changed → new type | alert.updated | Update |

 

### **Format 1: E3 Standard**

The default. Use this unless your receiver needs something else. Here is what a new-alert message looks like:

{

"event": "alert.created",

"alert": {

"id": 123,

"name": "Fire Drill",

"created\_at": "2026-06-24T10:15:30-05:00",

"account": { "id": 1, "name": "Acme School District" },

"group": { "id": 2, "name": "Main Campus" },

"alert\_type": { "id": 5, "name": "Fire Drill" },

"launched\_by": { "id": 10, "name": "Jane Admin" },

"is\_drill": false,

"is\_external": false

}

}

 

event is one of alert.created, alert.ended, alert.cancelled or alert.updated. On an alert-type change, both messages also include updated\_at, and the alert.updated message adds a previous\_alert\_type object with the ID and name of the type being replaced.

### **Format 2: CAP Standard**

The body is XML in the CAP v1.2 namespace and is sent as application/xml. Here is a real example of what is sent when a new alert is created:

\<?xml version="1.0" encoding="UTF-8"?\>

\<alert xmlns="urn:oasis:names:tc:emergency:cap:1.2"\>

\<identifier\>e3-alert-123-alert.created\</identifier\>

\<sender\>e3-account-1\</sender\>

\<sent\>2026-06-24T10:15:30-05:00\</sent\>

\<status\>Actual\</status\>

\<msgType\>Alert\</msgType\>

\<scope\>Private\</scope\>

\<info\>

\<category\>Safety\</category\>

\<event\>Fire Drill\</event\>

\<urgency\>Immediate\</urgency\>

\<severity\>Severe\</severity\>

\<certainty\>Observed\</certainty\>

\<senderName\>Acme School District\</senderName\>

\<parameter\>\<valueName\>alert\_id\</valueName\>\<value\>123\</value\>\</parameter\>

\<parameter\>\<valueName\>created\_at\</valueName\>\<value\>2026-06-24T10:15:30-05:00\</value\>\</parameter\>

\<parameter\>\<valueName\>account\_id\</valueName\>\<value\>1\</value\>\</parameter\>

\<parameter\>\<valueName\>group\_id\</valueName\>\<value\>2\</value\>\</parameter\>

\<parameter\>\<valueName\>group\_name\</valueName\>\<value\>Main Campus\</value\>\</parameter\>

\<parameter\>\<valueName\>alert\_type\_id\</valueName\>\<value\>5\</value\>\</parameter\>

\<parameter\>\<valueName\>launched\_by\_id\</valueName\>\<value\>10\</value\>\</parameter\>

\<parameter\>\<valueName\>launched\_by\_name\</valueName\>\<value\>Jane Admin\</value\>\</parameter\>

\<parameter\>\<valueName\>is\_drill\</valueName\>\<value\>false\</value\>\</parameter\>

\<parameter\>\<valueName\>is\_external\</valueName\>\<value\>false\</value\>\</parameter\>

\</info\>

\</alert\>

 

The CAP message, field by field

| **Field** | **What it means** |
| --- | --- |
| identifier | A unique ID for this specific message: e3-alert-{alert id}-{event} |
| sender | Which E3 workspace sent it: e3-account-{account id} |
| sent | The exact time the message was sent |
| status | Actual for a real alert, Exercise if it's a drill |
| msgType | What kind of message this is: Alert, Cancel or Update (see the event table above) |
| scope | Always Private. It is sent directly to your configured URL, not broadcast publicly |
| references | Only present on Cancel and Update messages. Points back to the original message being replaced |
| category | The general kind of hazard (Safety, Fire, Security, etc.). Set per alert type; defaults to Safety |
| event | The alert type's name (for example "Fire Drill" or "Lockdown") |
| urgency | How soon action is needed. Defaults to Immediate |
| severity | How serious it is. Defaults to Severe |
| certainty | How confident E3 is that this is really happening. Defaults to Observed |
| senderName | The workspace's display name |
| parameter entries | Extra E3-specific details (alert ID, group, who launched it, whether it is a drill, and so on) added as CAP "parameters" so no data is lost. A type change also carries previous\_alert\_type\_id and previous\_alert\_type\_name |

 

Setting category, urgency, severity and certainty

These four values come from the CAP v1.2 standard itself, not from E3. You set them for each alert type on the Webhook Power-Up detail page for that alert type, and the page shows a live preview of the CAP message that will be sent. Any value you leave unset falls back to **Safety / Immediate / Severe / Observed**, so every message is always valid CAP.

**category**: what kind of hazard this is

| **Value** | **Meaning** |
| --- | --- |
| Geo | Geophysical (earthquake, tsunami, volcano) |
| Met | Meteorological (storm, flood, tornado) |
| Safety | General safety (E3 default) |
| Security | Public or criminal security (intruder, threat) |
| Rescue | Rescue or human danger |
| Fire | Fire |
| Health | Public health (outbreak, contamination) |
| Env | Environmental (spill, pollution) |
| Transport | Transportation (accident, road or transit disruption) |
| Infra | Infrastructure (power, water, communications) |
| CBRNE | Chemical, Biological, Radiological, Nuclear or Explosive |
| Other | Anything else |

 

**urgency**: how soon action is needed

| **Value** | **Meaning** |
| --- | --- |
| Immediate | Responsive action should be taken now (E3 default) |
| Expected | Responsive action should be taken soon (within the next hours) |
| Future | Responsive action should be taken in the future |
| Past | Refers to an event that already occurred (for example a cancellation) |
| Unknown | Urgency not known |

 

**severity**: how serious the event is

| **Value** | **Meaning** |
| --- | --- |
| Extreme | Extraordinary threat to life or property |
| Severe | Significant threat (E3 default) |
| Moderate | Possible threat |
| Minor | Minimal to no known threat |
| Unknown | Severity not known |

 

**certainty**: how confident this is real

| **Value** | **Meaning** |
| --- | --- |
| Observed | Confirmed or already occurring (E3 default) |
| Likely | Likely (more than 50% probability) |
| Possible | Possible but not likely (50% or less) |
| Unlikely | Not expected to occur |
| Unknown | Certainty not known |

 

### **Format 3: Custom JSON**

Choose Custom JSON when your receiver expects its own JSON layout. You write a JSON template that contains placeholders, and E3 fills them in with the real alert details each time it sends a message. The message is sent as application/json.

Template rules Variables you can use

| **Variable** | **Value** |
| --- | --- |
|  | alert.created, alert.ended, alert.cancelled or alert.updated |
|  | Initiated (created), Updated (type change) or Closed (ended or cancelled) |
|  | The alert ID |
|  | The alert type name at the time of sending |
|  | Date and time the alert was created (ISO 8601) |
| / | true or false |
| / | Your workspace |
| / / | The group (site or building) the alert was launched in |
| / | The alert type |
| / / | The person who launched the alert |
| / | Type-change messages only: the type being replaced |

 

**Not available as variables:** the launching user's latitude and longitude, separate city / state / ZIP fields, and partner-specific sub-type codes. If your receiver needs those, type a fixed value into the template or leave the key out.

Example: connecting to Mutualink

1. Open Workspace → Power-Ups → Webhook and select the alert type to connect.
2. Click **Add Webhook** and enter the Mutualink gateway URL.
3. Enter the Basic Auth username and password supplied by Mutualink.
4. Choose **Custom JSON** as the request format.
5. Paste the template below, replacing YOUR\_PARTNER\_ID and YOUR\_REFERENCE\_ID with your own values.
6. Under **Groups & alerts**, choose the groups and alert types to send.
7. Turn on **Notify on alert**, plus **Notify on end** if Mutualink needs to know when alerts close, then save.

{

"partnerId": "YOUR\_PARTNER\_ID",

"referenceId": "YOUR\_REFERENCE\_ID",

"eventId": ,

"Status": ,

"Type": ,

"Drill": ,

"Time": ,

"BuildingId": ,

"BuildingName": ,

"BuildingAddressLine1": ,

"PersonName": ,

"PersonEmail":

}

 

Delivery, retries and security What your receiving system should do Troubleshooting

| **What you see** | **What to check** |
| --- | --- |
| Nothing arrives at the receiver | In order: the webhook is enabled; the matching notify switch is on; the alert's group and type are selected for the webhook. |
| "At least one notification option must be selected when the webhook is enabled." | Both notify switches are off. Turn one on, or disable the webhook. |
| "Select at least one group and alert type for this webhook." | Nothing is selected under Groups & alerts. Choose at least one group and its alert types. |
| "A JSON body template is required for Custom JSON format." | You chose Custom JSON but left the body template empty. |
| "The body template must be valid JSON after variable substitution." | Usually a quoted placeholder, a trailing comma, or a misspelled variable name. Placeholders must not be in quotes. |
| The receiver says the body is malformed | Confirm the format matches what it expects (CAP is XML only, Custom is JSON only). Remember that Custom JSON drops keys whose value is empty. |
| Status code 0 in the webhook log | The request could not be built. Check your custom headers: names may use only standard header characters, and values cannot contain line breaks. |
| The receiver is called twice for one change | Expected when an alert's type changes (cancel, then update). Match them using the alert ID. |
| Duplicate identical messages | A retry after an error or timeout. Make your endpoint idempotent. |
| A workspace user can't see the Webhook Power-Up | An admin needs to turn on **Grant IT Manager Control** for that workspace. |

 

Good to know 

- [Getting Started](https://help.emergent3.com/getting-started?hsLang=en#main-content)

    - [General Onboarding](https://help.emergent3.com/getting-started?hsLang=en#general-onboarding)
    - [Account Setup & Login](https://help.emergent3.com/getting-started?hsLang=en#account-setup-login)
    - [Installing E3](https://help.emergent3.com/getting-started?hsLang=en#installing-e3)
- [IT Resources and Tech Setup](https://help.emergent3.com/it-resources-and-tech-setup?hsLang=en)
- [E3 App User Guide](https://help.emergent3.com/e3-app-user-guide?hsLang=en)
- [Plans & People Management](https://help.emergent3.com/plans-people-management?hsLang=en#main-content)

    - [Plans & Locations](https://help.emergent3.com/plans-people-management?hsLang=en#plans-locations)
    - [User & Role Management](https://help.emergent3.com/plans-people-management?hsLang=en#user-role-management)
- [Notifications & Alerts](https://help.emergent3.com/notifications-alerts?hsLang=en#main-content)

    - [Mobile Notifications](https://help.emergent3.com/notifications-alerts?hsLang=en#mobile-notifications)
    - [Desktop Notifications](https://help.emergent3.com/notifications-alerts?hsLang=en#desktop-notifications)
    - [Notification Troubleshooting](https://help.emergent3.com/notifications-alerts?hsLang=en#notification-troubleshooting)
- [Troubleshooting & Maintenance](https://help.emergent3.com/troubleshooting-maintenance?hsLang=en#main-content)

    - [App Updates & Maintenance](https://help.emergent3.com/troubleshooting-maintenance?hsLang=en#app-updates-maintenance)
    - [Login & Account Issues](https://help.emergent3.com/troubleshooting-maintenance?hsLang=en#login-account-issues)
    - [System Issues](https://help.emergent3.com/troubleshooting-maintenance?hsLang=en#system-issues)
- [Alerts & Incident Management](https://help.emergent3.com/alerts-incident-management?hsLang=en#main-content)

    - [Alert Creation & Management](https://help.emergent3.com/alerts-incident-management?hsLang=en#alert-creation-management)
    - [Responding to Alerts](https://help.emergent3.com/alerts-incident-management?hsLang=en#responding-to-alerts)
    - [Alert Logs & Reports](https://help.emergent3.com/alerts-incident-management?hsLang=en#alert-logs-reports)
- [Admin & Portal Tools](https://help.emergent3.com/admin-portal-tools?hsLang=en#main-content)

    - [Advanced Configuration](https://help.emergent3.com/admin-portal-tools?hsLang=en#advanced-configuration)
- [Communication & Chat](https://help.emergent3.com/communication-chat?hsLang=en#main-content)

    - [Chat Messaging](https://help.emergent3.com/communication-chat?hsLang=en#chat-messaging)
- [Integrations & Single Sign-On (SSO)](https://help.emergent3.com/integrations-single-sign-on-sso?hsLang=en#main-content)

    - [Third-Party Integrations](https://help.emergent3.com/integrations-single-sign-on-sso?hsLang=en#third-party-integrations)
    - [Single Sign-On (SSO) Configuration](https://help.emergent3.com/integrations-single-sign-on-sso?hsLang=en#single-sign-on-sso-configuration)

- Core Features 
    - [Alert](https://emergent3.com/alert)
    - [Check in](https://emergent3.com/checkin)
    - [Smart Map](https://emergent3.com/smartmap)
    - [Chat](https://emergent3.com/chat)
    - [Report](https://emergent3.com/report)
- Company 
    - [About](https://emergent3.com/about-us/)
    - [Contact](https://emergent3.com/contact-us)
    - [Customer Stories](https://emergent3.com/case-studies)
    - [E3 vs Raptor Technologies](https://emergent3.com/e3-vs-raptor-technologies)
- Legal Policy 
    - [Privacy Policy](https://emergent3.com/privacy)
    - [Terms of Service](https://emergent3.com/terms-of-service)
    - [Help Center](https://help.emergent3.com/)

[![Chill listening crop-3](https://help.emergent3.com/hs-fs/hubfs/E3.logo.black.png?width=35&height=39&name=E3.logo.black.png "Chill listening crop-3")](https://emergent3.com?hsLang=en)

Emergent3.com - Help Center

Copyright © 2025, Emergent 3