pfSense Actions
Turn the alerts pfSense Actions sends, such as pfSense going unreachable or a failed action, into ntfy notifications with the app's name before each title.
info
This interpreter reads alerts from the pfSense Actions app. For the notification emails pfSense itself sends, use the pfsense interpreter with an email context.
Input Handling
The interpreter reads the JSON alert that pfSense Actions posts to a destination whose service is ntfy-reverse-proxy. Every field below is required, and fields that aren't listed are ignored.
| Field | Type | Description |
|---|---|---|
version | 1 | Payload format. Any other version fails. |
app | string | The app that sent the alert, which must be pfsense-actions. |
event | string | The event's key, such as pfsense-unreachable, or test for Send test. |
title | string | The alert's title, such as pfSense can't be reached. |
message | string | The alert's text. |
priority | 1-5 | Priority level (1 = min, 3 = default, 5 = max). |
tags | string[] | ntfy tags, such as the emoji shortcode warning. |
occurredAt | string | When the alert happened. |
details | object | Extra data about the alert. |
The notification uses title, message, priority, and tags. The event, occurredAt, and details fields must be present, but they don't appear in it.
Supported Events
pfSense Actions sends these alerts, each with a fixed priority and tags:
| Title | Event Key | Priority | Tags |
|---|---|---|---|
| Saved secrets were removed | secrets-removed | 4 (high) | key, warning |
| Sign-in locked | sign-in-locked | 4 (high) | lock |
| pfSense can't be reached | pfsense-unreachable | 4 (high) | warning |
| pfSense reachable again | pfsense-reachable | 3 (default) | white_check_mark |
| Action failed | action-failed | 3 (default) | x |
| Wake-on-LAN sent | wol-sent | 2 (low) | zap |
| Test notification | test | 3 (default) | bell |
- Off at first — A new destination leaves Action failed and Wake-on-LAN sent unchecked, so check them in its events to get those alerts.
- Test notification — It's what Send test sends, so a destination can't choose it as an event.
Context Setup
- Add an HTTP context — Run
nrp, choose Manage Contexts > Add, pick HTTP, and choose pfSense Actions as the Interpreter. - Deploy — Choose Deploy, then copy the context's URL and token from the Context reference list it prints.
- Add a destination — On pfSense Actions' Notifications page, select Add notification, choose ntfy-reverse-proxy as the Service, and paste the URL into Context URL. Paste the token into Context token if the context has one, enter a Name, and select Add notification to save it.
- Send a test — Select Send test on the destination, and check that
[pfSense Actions] Test notificationarrives on the context's topic.
Under Context URL, the dialog reminds you with Set the context's interpreter to pfsense-actions.
{
"id": "pfsense-actions-example",
"name": "pfSense Actions",
"type": "http",
"interpreter": "pfsense-actions",
"topic": "firewall",
"mode": "send-once",
"show_visitor_info": false,
"primary_server": "primary",
"servers": ["primary"],
"token": "replace_with_auth_token"
}
With this context, pfSense Actions posts its alerts to https://pfsense-actions-example.ntfy.example.com.
Notification Output
- Title:
[pfSense Actions]and the alert'stitle(e.g.,[pfSense Actions] pfSense can't be reached). - Body: The alert's
message, with HTML tags removed as for every interpreter (see HTML Stripping). - Priority: The alert's
priority, unchanged. pfSense Actions sends4for high-priority events,2for Wake-on-LAN sent, and3for the rest. - Tags:
pfsense-actionsfirst, then the alert'stags(e.g.,pfsense-actions,warning).
The interpreter sets no icon, actions, or Markdown.
Example
pfSense Actions posts this alert when two scheduled checks in a row can't sign in to pfSense:
{
"app": "pfsense-actions",
"details": {
"address": "192.0.2.1",
"port": 22
},
"event": "pfsense-unreachable",
"message": "Couldn't sign in to pfSense at 192.0.2.1:22 over SSH in two checks in a row. Actions fail until it answers again.",
"occurredAt": "2026-10-26T12:10:00.000Z",
"priority": 4,
"tags": ["warning"],
"title": "pfSense can't be reached",
"version": 1
}
The proxy publishes it to ntfy with these ntfy headers and body:
X-Title: [pfSense Actions] pfSense can't be reached
X-Priority: 4
X-Tags: pfsense-actions,warning
Couldn't sign in to pfSense at 192.0.2.1:22 over SSH in two checks in a row. Actions fail until it answers again.
ntfy shows the warning tag as an emoji and lists pfsense-actions below the notification.
Wrong App Error
A context reads alerts from one app, so a payload whose app names a different app fails instead of arriving under the wrong name. When that app has a built-in interpreter, the proxy answers with HTTP 422 and names the interpreter to use:
{
"status": "error",
"message": "This context reads pfSense Actions alerts, but the payload came from outpost. Set the context's interpreter to outpost."
}
If app contains an unknown producer key, the error instead says the app is unsupported and lists the supported interpreter keys. It never recommends configuring the unknown value.
- Fix — Set the context's
interpreterto the key the message names, or point that app at a context that uses its own interpreter. - Send test — The sending app reports that the test couldn't be sent, with
HTTP 422and up to 120 characters of this message as the reason. - Error topic — If the context has an
error_topicanderror_eventsincludesinterpretation(or is omitted), the proxy also sends anInterpretation Errorwitherror-debug.jsonto that topic. - Other payloads — A non-empty body that isn't JSON, or JSON that isn't an alert (such as one without
title, or with aversionother than1), also fails with HTTP 422 before the app is checked.
tip
For when each alert is sent, how to manage destinations, and every field in details, see Notifications in the pfSense Actions docs.