<!-- BusyBot node reference — https://busybot.net/tools/signl4/ -->

> Node: SIGNL4 (`signl4`) · Action (binary) · v1
> Category: Communication · Credentials: SIGNL4 Webhook (`signl4Api`)
> Updated: 2026-08-16

# SIGNL4

> Send and resolve mobile alerts via SIGNL4 with optional file attachments

## Overview

The SIGNL4 tool sends new alerts and resolves existing alerts via the SIGNL4 webhook API (POST https://connect.signl4.com/webhook/{teamSecret}). The "send" operation creates a new alert with a message, optional title, service category, alerting scenario (single_ack or multi_ack), external correlation ID, location coordinates, keyword filtering, and an optional binary file attachment (PNG, JPG, BMP, GIF, MP3, WAV). The "resolve" operation closes a previously sent alert by its external ID. All requests use multipart/form-data. Authentication uses a team secret embedded in the webhook URL path.

**Category:** Communication  
**Tool Name:** `signl4`  
**Version:** 1

**Appearance:** Icon: `lucide-Siren` | Color: `#0080FF`

## Node Type

**Action (Binary)** — handles file/binary data operations

## Input / Output

| Direction | Port(s) |
|-----------|--------|
| Input | `Input` |
| Output | `Output`, `Error` |

## Credentials

This tool requires **SIGNL4 Webhook** credentials.
See the [Credentials Guide](https://busybot.net/credentials/signl4-api/) for setup instructions.

### Resources

| Resource | Value |
|----------|-------|
| Alert | `alert` |

### Operations

| Operation | Value | Description |
|-----------|-------|-------------|
| Alert: Send | `send` | Send a new alert |
| Alert: Resolve | `resolve` | Resolve an existing alert |

### Parameters

#### Alert: Send

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Message | `string` | Yes | — | A more detailed description for the alert. Supports expressions. |
| Additional Fields | `collection` | No | `{}` | Optional fields to send alongside the alert. |
| — Alerting Scenario | `options` | No | `single_ack` | Determines how many people need to acknowledge this alert. |
| | | | | Options: `single_ack` (only one person needs to confirm the alert), `multi_ack` (all on-duty team members must confirm the alert) |
| — Attachment (Binary Property) | `string` | No | — | Name of the binary property containing a file to attach to the alert. Supported formats: PNG, JPG, JPEG, BMP, GIF, MP3, WAV. Leave empty for no attachment. Names are case-sensitive — see the upstream node's Binary Data panel for the exact names to use. |
| — External ID | `string` | No | — | If the event originates from a record in a 3rd party system, pass the unique ID of that record. This ID will be communicated in outbound webhook notifications from SIGNL4. Use the same External ID to resolve the alert later. Supports expressions. |
| — Filtering | `boolean` | No | `false` | Whether to apply event filtering. If true, the event only triggers a notification if it contains at least one keyword from your services and system categories (whitelisted). |
| — Latitude | `string` | No | — | Latitude for geo-location display. Must be provided together with Longitude. Supports expressions. |
| — Longitude | `string` | No | — | Longitude for geo-location display. Must be provided together with Latitude. Supports expressions. |
| — Service | `string` | No | — | Assigns the alert to the service/system category with the specified name. Supports expressions. |
| — Title | `string` | No | — | The title or subject of this alert. Supports expressions. |

#### Alert: Resolve

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| External ID | `string` | Yes | — | The external ID that was used when the alert was originally sent. Must match exactly to resolve the correct alert. Supports expressions. |

#### All Operations

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| Max Concurrency | `number` | No | `5` | Maximum number of items to process concurrently. Keep low for alerting systems to avoid flooding. |

## Output Data

One output item is produced per input item, on the `Output` port, for both `send` and `resolve`. SIGNL4's JSON response — its acknowledgement of the alert, which identifies the event it recorded — is merged onto the item JSON at the top level rather than nested under a wrapper property, so the rest of the incoming item passes through unchanged and response fields are addressed directly by expression. Binary data on the input item is forwarded untouched, including the property you attached to the alert. Neither operation fans out.

A non-2xx reply from the webhook raises an item error carrying the HTTP status and the body SIGNL4 returned. Failures go to the `Error` port in `errorPort` mode, carrying `_error`.

## Usage Examples

- Send a critical alert when server CPU exceeds threshold
- Resolve an existing alert by its external ID
- Send an alert with a screenshot image attached
- Send an alert with geo-location coordinates
- Send an alert with multi-ack requiring all on-duty team members to confirm

## Example Configuration

Raise a plain alert from a monitoring item:

```json
{
  "type": "signl4",
  "parameters": {
    "resource": "alert",
    "operation": "send",
    "message": "Server CPU usage exceeded 90% threshold on {{ $json.host }}"
  }
}
```

Add a title, route the alert to a service category, and give it a correlation ID you can resolve on later:

```json
{
  "type": "signl4",
  "parameters": {
    "resource": "alert",
    "operation": "send",
    "message": "Database connection pool exhausted - immediate attention required",
    "additionalFields": {
      "title": "Critical Database Alert",
      "service": "database-cluster",
      "externalId": "db-alert-{{ $json.incidentId }}",
      "alertingScenario": "single_ack",
      "filtering": true
    }
  }
}
```

Attach a screenshot held in the item's `data` binary property:

```json
{
  "type": "signl4",
  "parameters": {
    "resource": "alert",
    "operation": "send",
    "message": "Dashboard shows a sustained error spike - screenshot attached",
    "additionalFields": {
      "title": "Error Rate Spike",
      "service": "web-application",
      "binaryPropertyName": "data",
      "externalId": "err-spike-{{ $json.runId }}"
    }
  }
}
```

Put the alert on the map and require every on-duty responder to acknowledge it:

```json
{
  "type": "signl4",
  "parameters": {
    "resource": "alert",
    "operation": "send",
    "message": "Fire alarm triggered in data center - evacuation protocol initiated",
    "additionalFields": {
      "title": "EMERGENCY: Fire Alarm Activated",
      "service": "facility-management",
      "externalId": "fire-alarm-dc1",
      "latitude": "40.7128",
      "longitude": "-74.0060",
      "alertingScenario": "multi_ack"
    }
  }
}
```

Close an alert once the underlying condition clears:

```json
{
  "type": "signl4",
  "parameters": {
    "resource": "alert",
    "operation": "resolve",
    "externalId": "{{ $json.externalId }}"
  }
}
```

### Error Handling

| Mode | Behavior |
|------|----------|
| **stop** | Halts workflow on first error |
| **continue** | Skips failed items, passes successful ones through |
| **errorPort** | Routes failed items to Error output port |

## Tips

Send new alerts or resolve existing alerts via the SIGNL4 mobile alerting platform, with optional file attachments.

### Notes

- Resolving matches on External ID alone, so an alert can only be closed from a workflow if you set an External ID in Additional Fields when you sent it. Use a value you can reproduce later, such as an ID carried on the item.
- Latitude and Longitude only take effect as a pair. If either is empty, no location is attached to the alert.
- The attachment is sent only when the item actually carries a binary property under the name you gave. If it does, the file extension must be one of `png`, `jpg`, `jpeg`, `bmp`, `gif`, `mp3` or `wav` — anything else fails the item.
- Keep Max Concurrency low. Each item is a separate alert, and a burst of them reaches every on-duty phone at once.