API reference

Issues

Issues and alerts, open and resolved

List issue events

GET /v1/issues Try it

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

  • isp string query

    ISP code from GET /isps. Optional when the key reaches exactly one ISP.

  • state one of: "open", "resolved", "all" query

    open (default): active now. resolved: ended at or after since. all: both, open first.

  • since string query

    Resolved 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.

  • type string query

    Comma-separated list of device, backhaul, cpe. Default: all three.

  • metric string query

    Metric name prefix, e.g. Ping: or Wireless:Signal

  • region integer query

    Only issues on things in this region (region_id from GET /regions). Backhauls match on any end.

  • min_severity one of: "info", "warning", "outage", "critical" query

    Leave out rows below this severity: info, warning, outage or critical. outage = would page.

  • include_ignored boolean query

    Also return open issues hidden by the ISP's ignore rules (muted devices, ignored metrics). Default false.

  • flaps one of: "collapse", "expand" query

    collapse (default) folds short repeats of one entity + metric in the same clock hour into one row; expand lists every one.

  • limit integer query

    Rows per page. Default 200 for JSON, 1000 for CSV.

  • cursor string query

    next_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.

  • isp string
  • state one of: "open", "resolved", "all"
  • resolved_since date-time

    The since in effect, given or defaulted

  • flaps one of: "collapse", "expand"
  • count integer
  • issues array of objects

    Open rows first (newest started_at first), then resolved rows (newest ended_at first)

    Each item: 17 fields
    • issue_id string

      Stable per occurrence: the same while the issue is open and once it's resolved. Use it to de-duplicate across polls.

    • isp string
    • state one of: "open", "resolved"
    • type string

      device, backhaul or cpe; more types may be added

    • entity_id integer

      The infid, bhid or cpeid, by type

    • name string

      Device or backhaul name. CPEs: the subscriber's name with the pii scope, otherwise 'CPE <mac> (account <number>)'

    • ip string nullable

      Backhauls: the AP end's IP

    • site object nullable

      The site. Backhauls: the AP end's site; CPEs: their access point's

      3 fields
      • site_id integer
      • code string

        The ISP's short site code

      • name string
    • region object nullable

      The site's region

      2 fields
      • region_id integer
      • name string
    • metric string

      e.g. Ping:Down, Backhaul:Ping Loss, Wireless:Signal

    • severity one of: "info", "warning", "outage", "critical" nullable

      Peak severity reached: info, warning, outage or critical (outage and critical would page). null = recorded before 2026-10-08

    • details string
    • started_at date-time
    • ended_at date-time nullable

      null while open

    • occurrences integer

      Short repeats folded into this row (flaps=collapse); 1 otherwise

    • flapping boolean
    • ignored boolean nullable

      Open rows: hidden by an ignore rule (only returned with include_ignored=true). null on resolved rows

  • next_cursor string nullable

    Pass 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
}