API reference
Issues
Issues and alerts, open and resolved
- List issue events
GET /v1/issues
List issue events
Open and resolved issues as one event log. What's wrong now and what happened since a time, in one feed: one row per issue occurrence, open rows first, then resolved ones. issue_id stays the same from the moment an issue opens until it resolves, so a poller can de-duplicate across polls. A paging poller wants state=all&since=<last poll>; a report wants state=resolved&since=<period start>. Issues hidden by the ISP's ignore rules are left out unless include_ignored=true.
Parameters
-
ispstring queryISP code from GET /isps. Optional when the key reaches exactly one ISP.
-
stateone of: "open", "resolved", "all" queryopen (default): active now. resolved: ended at or after since. all: both, open first.
-
sincestring queryResolved rows: ended at or after this time. ISO 8601 with Z or an offset, "YYYY-MM-DD HH:MM:SS" (UTC), or unix seconds. Default: 24 hours ago.
-
typestring queryComma-separated list of device, backhaul, cpe. Default: all three.
-
metricstring queryMetric name prefix, e.g. Ping: or Wireless:Signal
-
regioninteger queryOnly issues on things in this region (region_id from GET /regions). Backhauls match on any end.
-
min_severityone of: "info", "warning", "outage", "critical" queryLeave out rows below this severity: info, warning, outage or critical. outage = would page.
-
include_ignoredboolean queryAlso return open issues hidden by the ISP's ignore rules (muted devices, ignored metrics). Default false.
-
flapsone of: "collapse", "expand" querycollapse (default) folds short repeats of one entity + metric in the same clock hour into one row; expand lists every one.
-
limitinteger queryRows per page. Default 200 for JSON, 1000 for CSV.
-
cursorstring querynext_cursor from the previous page (also in the Link header)
Response
Also available as CSV: add format=csv. Columns follow the field order below, with nested fields as dotted columns
(ap.name).
Paged: pass next_cursor back as cursor for the next page.
-
ispstring -
stateone of: "open", "resolved", "all" -
resolved_sincedate-timeThe since in effect, given or defaulted
-
flapsone of: "collapse", "expand" -
countinteger -
issuesarray of objectsOpen rows first (newest started_at first), then resolved rows (newest ended_at first)
Each item: 17 fields
-
issue_idstringStable per occurrence: the same while the issue is open and once it's resolved. Use it to de-duplicate across polls.
-
ispstring -
stateone of: "open", "resolved" -
typestringdevice, backhaul or cpe; more types may be added
-
entity_idintegerThe infid, bhid or cpeid, by type
-
namestringDevice or backhaul name. CPEs: the subscriber's name with the pii scope, otherwise 'CPE <mac> (account <number>)'
-
ipstring nullableBackhauls: the AP end's IP
-
siteobject nullableThe site. Backhauls: the AP end's site; CPEs: their access point's
3 fields
-
site_idinteger -
codestringThe ISP's short site code
-
namestring
-
-
regionobject nullableThe site's region
2 fields
-
region_idinteger -
namestring
-
-
metricstringe.g. Ping:Down, Backhaul:Ping Loss, Wireless:Signal
-
severityone of: "info", "warning", "outage", "critical" nullablePeak severity reached: info, warning, outage or critical (outage and critical would page). null = recorded before 2026-10-08
-
detailsstring -
started_atdate-time -
ended_atdate-time nullablenull while open
-
occurrencesintegerShort repeats folded into this row (flaps=collapse); 1 otherwise
-
flappingboolean -
ignoredboolean nullableOpen rows: hidden by an ignore rule (only returned with include_ignored=true). null on resolved rows
-
-
next_cursorstring nullablePass as cursor to get the next page; null on the last page
Example
curl -H "Authorization: Bearer $SWIFTFOX_KEY" \
"https://api.swiftfox.net/v1/issues?isp=yourisp" Response (example data):
{
"isp": "riverbend",
"state": "all",
"resolved_since": "2026-10-08T00:00:00Z",
"flaps": "collapse",
"count": 2,
"issues": [
{
"issue_id": "8c1f2e9a0b7d4c36",
"isp": "riverbend",
"state": "open",
"type": "device",
"entity_id": 230,
"name": "Hilltop Sector 1",
"ip": "10.10.7.21",
"site": {
"site_id": 7,
"code": "HT",
"name": "Hilltop Tower"
},
"region": {
"region_id": 2,
"name": "North"
},
"metric": "Health:Temperature",
"severity": "warning",
"details": "Warning - 71 deg C",
"started_at": "2026-10-08T21:40:12Z",
"ended_at": null,
"occurrences": 1,
"flapping": false,
"ignored": false
},
{
"issue_id": "5e0a9d3b71c2f846",
"isp": "riverbend",
"state": "resolved",
"type": "backhaul",
"entity_id": 12,
"name": "RB-HT",
"ip": "10.10.0.1",
"site": {
"site_id": 3,
"code": "RB-CORE",
"name": "Riverbend Data Centre"
},
"region": {
"region_id": 1,
"name": "Riverbend"
},
"metric": "Backhaul:Ping Latency",
"severity": "warning",
"details": "Warning - 12.8 ms avg latency",
"started_at": "2026-10-08T20:44:10Z",
"ended_at": "2026-10-08T20:46:11Z",
"occurrences": 1,
"flapping": false,
"ignored": null
}
],
"next_cursor": null
}