Skip to content

API Reference

Two REST surfaces:

  • Node API — the firewall-plus daemon on each Wings host (default http://127.0.0.1:8472/api/v1), called by the panel and by operators.
  • Client API — panel-side endpoints under the Pterodactyl client API, used by the server firewall UI and any integrations.

Node API

Base URL: http://<node>:8472/api/v1 · Auth: Authorization: Bearer <64-hex token> (from /etc/firewall-plus/token) plus the allowedIps IP whitelist. Exceeding a rate limit returns 429 with Retry-After.

RouteRate limit (per source IP)
POST /firewall/apply10/min
POST /firewall/flush*, DELETE /smart/mitigation/*5/min
GET /health60/min
Other protected routes30/min

Health

http
GET /api/v1/health

Reports daemon version and capabilities — the panel uses this for the ONLINE/OFFLINE badge and version display:

json
{
  "success": true,
  "data": { "input_jump_style": "per-port-dport-v2", "geoip_available": true },
  "meta": { "version": "1.0.4" }
}

Firewall apply & lifecycle

MethodPathDescription
POST/api/v1/firewall/applyQueue an atomic apply for a server (rules + ipsets + optional smart block). Processed serially by the queue worker with snapshot + rollback.
GET/api/v1/firewall/queueInspect the apply queue (pending/processing entries).
GET/api/v1/firewall/status/:serverIdLast apply status for a server (the panel polls this).
POST/api/v1/firewall/syncPush full desired state for reconciliation.
GET/api/v1/firewall/syncInspect the node's current view of synced state.
POST/api/v1/firewall/verifyRun drift verification — compares live iptables/ipset state against the stored desired config and reports differences.
POST/api/v1/firewall/flush/:serverIdRemove all FWP-* chains and fwp-* ipsets for one server.
POST/api/v1/firewall/flush-rule-types/:serverIdFlush only specific rule types for a server (used by emergency per-type disables).

Apply payloads carry an X-Correlation-ID that shows up in node logs and panel audit entries — trace a single apply panel → queue → node with it:

bash
journalctl -u firewall-plus | grep '<correlation-uuid>'

SMART endpoints

MethodPathDescription
GET/api/v1/smart/status/:serverIdMonitor state for a server (baseline, current level, active mitigation).
GET/api/v1/smart/eventsRecent attack events from the node log (the panel syncs these every 2 minutes).
POST/api/v1/smart/events/ackAcknowledge events by id.
POST/api/v1/smart/eventRecord an externally-detected event (used by integrations/testing).
DELETE/api/v1/smart/mitigation/:serverIdManually clear the active mitigation for a server.

Metrics endpoints

MethodPathDescription
GET/api/v1/metrics/:serverId/summaryAggregate counters (packets/bytes dropped, passed) for a server. 60/min.
GET/api/v1/metrics/:serverId/timeseriesTime-bucketed series for charts. 30/min.
GET/api/v1/metrics/:serverId/rulesPer-rule hit counters. 30/min.
GET/api/v1/metrics/:serverId/sourcesTop source IPs. 30/min.
POST/api/v1/metrics/batchBatch metric ingest. 20/min.
POST/api/v1/metrics/:serverId/resetReset one server's counters. 10/min.
POST/api/v1/metrics/node/reset-allReset all counters on the node. 5/min.
GET/api/v1/metrics/node/summaryNode-wide aggregate. 30/min.

Client API (panel)

Base URL: /api/client/servers/{server}/v1/firewall — authenticated with a normal Pterodactyl client API key, subject to subuser permissions (firewall.read, firewall.manage, firewall.abusedb).

Use the /v1/ prefix

The canonical namespace is /api/client/servers/{server}/v1/firewall/.... The unprefixed /firewall/... routes are a deprecated back-compat alias that emits RFC 8594 headers (Deprecation: true, Sunset: Fri, 01 Jan 2027 00:00:00 GMT, and a Link: ...; rel="successor-version"). New code must use /v1/.

Response envelope on every endpoint:

json
{ "success": true, "data": { }, "error": null, "meta": { } }

Every response includes an X-Correlation-ID header — include it in bug reports; it's stored in the audit log and forwarded to the node on applies.

Rate limits (per user + server)

BucketLimitCovers
firewall-apply3/minPOST .../firewall/apply
firewall-mutations20/minRule/preset/SMART mutations, event ack
firewall-lists30/minWhitelist/blacklist add & delete
firewall-list-uploadsthrottled separatelyBulk list imports

Read endpoints (firewall.read)

MethodPathDescription
GET/firewallDashboard payload (state, counts, sync status).
GET/firewall/apply/statusPoll the in-flight apply.
GET/firewall/statsTraffic/drop stats.
GET/firewall/logsActivity + SMART event log for the server.
GET/firewall/smartSMART config and status.
GET/firewall/rulesList rules.
GET/firewall/whitelist · /firewall/blacklistList entries.
GET/firewall/presetsSystem + user presets.
GET/firewall/metrics/summary · /timeseries · /rules · /sourcesChart data for the dashboard.

Mutations (firewall.manage + ToS accepted)

Mutations additionally pass through firewall.tos (Terms must be accepted), firewall.emergency (blocked while emergency mode is on), and firewall.owner_addon checks.

MethodPathDescription
POST/firewall/tos/acceptAccept the Terms of Service.
PUT/firewall/enabledToggle Firewall-Plus for this server (addon_enabled). Off = node flush job.
POST/firewall/rulesCreate a rule.
PUT/firewall/rules/{id}Update a rule.
PATCH/firewall/rules/{id}/enabledEnable/disable a rule without deleting it.
DELETE/firewall/rules/{id}Delete a rule.
POST/firewall/applyQueue an apply to the node (firewall-apply throttle, 3/min).
PUT/firewall/smartUpdate SMART settings (requires admin SMART grant).
PUT/firewall/smart/webhookSet the per-server owner Discord webhook.
POST/firewall/smart/events/{id}/ackAcknowledge a SMART event.
POST/firewall/whitelist · /blacklistAdd an entry.
POST/firewall/whitelist/bulk · /blacklist/bulkBulk import (paste/upload many entries).
DELETE/firewall/whitelist/{id} · /blacklist/{id}Remove an entry.
POST/firewall/presetsSave a user preset.
POST/firewall/presets/{preset}/applyInstantiate a preset's rules.
DELETE/firewall/presets/{preset}Delete a user preset.
POST/firewall/metrics/resetReset the server's metric counters.

AbuseIPDB endpoints (firewall.abusedb)

MethodPathDescription
GET/firewall/abusedb/statusWhether a key is configured and the feature is enabled.
POST/firewall/abusedb/verify-keyValidate & store the user's AbuseIPDB API key.
DELETE/firewall/abusedb/keyRemove the stored key.
POST/firewall/abusedb/checkRun a lookup against an IP.
POST/firewall/abusedb/savedSave a lookup.
GET/firewall/abusedb/saved · /saved/{id}List / show saved lookups.
DELETE/firewall/abusedb/saved/{id}Delete a saved lookup.

Grant subusers access in the server's Users tab: Firewall → Read / Manage / AbuseDB Access. Manage implies read.