API reference
Devices
Infrastructure devices (routers, APs, backhaul radios, switches): detail, live health and config history
- List devices
GET /v1/devices - Get a device
GET /v1/devices/{infid} - List config changes
GET /v1/devices/{infid}/configs - Get a device's health
GET /v1/devices/{infid}/health - Get an interface's traffic
GET /v1/devices/{infid}/traffic - Get a config revision
GET /v1/devices/{infid}/configs/{revision} - Diff two config revisions
GET /v1/devices/{infid}/configs/diff - Get the latest config
GET /v1/devices/{infid}/configs/latest - Get a device's history
GET /v1/devices/{infid}/history/{series} - Collect a config now
POST /v1/devices/{infid}/config-collections
List devices
Your infrastructure devices: routers, access points, backhaul radios, switches and so on (customer radios are in list_cpes). Filter by site, region, the pingbox they're pinged from, device class or hardware type, or search names and IP addresses with q. get_device has a device's interfaces, addresses and live health.
Parameters
-
ispstring queryISP code from GET /isps. Optional when the key reaches exactly one ISP.
-
siteinteger or string queryRestrict to one site: site_id or site code from
list_sites -
regioninteger queryRestrict to sites in this region: region_id from
list_regions -
pingboxinteger queryRestrict to devices pinged from this pingbox: a pingboxid from
list_pingboxes -
device_classstring queryExact device class, e.g. Router, AP, Switch
-
hardware_typestring queryA hardware_type id, e.g. mikrotik, ubiquiti, cambium, snmp
-
qstring querySubstring match on device name or IP address
-
limitinteger queryMax rows (default 200, max 500)
-
cursorstring querynext_cursor from the previous page
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.
-
countinteger -
next_cursorstring nullablePass as cursor to get the next page; null on the last page
-
devicesarray of objectsEach item: 9 fields
-
infidinteger -
namestring -
device_classstringe.g. Router, AP, Switch, Backhaul AP
-
hardware_typeobject nullableThe kind of device, which decides how Swift Fox collects from it
2 fields
-
idstringe.g. mikrotik, ubiquiti, cambium, snmp (any standard-SNMP device), generic
-
namestringAs the app shows it
-
-
modelstring nullable -
ipstring nullableManagement IPv4 address
-
siteobject nullableThe site
3 fields
-
site_idinteger -
codestringThe ISP's short site code
-
namestring
-
-
pingboxobjectThe pingbox this device is pinged from (
list_pingboxes)2 fields
-
pingboxidinteger -
namestring
-
-
parentobject nullableThe device it hangs off in the network map
2 fields
-
infidinteger -
namestring
-
-
Example
curl -H "Authorization: Bearer $SWIFTFOX_KEY" \
"https://api.swiftfox.net/v1/devices?isp=yourisp" Response (example data):
{
"count": 3,
"next_cursor": "eyJ2IjoxLCJvIjozfQ",
"devices": [
{
"infid": 101,
"name": "Core Router",
"device_class": "Router",
"hardware_type": {
"id": "mikrotik",
"name": "Mikrotik"
},
"model": "CCR2116-12G-4S+",
"ip": "10.10.0.1",
"site": {
"site_id": 3,
"code": "RB-CORE",
"name": "Riverbend Data Centre"
},
"pingbox": {
"pingboxid": 0,
"name": "Riverbend Cloud"
},
"parent": null
},
{
"infid": 214,
"name": "Hilltop Router",
"device_class": "Router",
"hardware_type": {
"id": "mikrotik",
"name": "Mikrotik"
},
"model": "CCR2004-16G-2S+",
"ip": "10.10.7.1",
"site": {
"site_id": 7,
"code": "HT",
"name": "Hilltop Tower"
},
"pingbox": {
"pingboxid": 1,
"name": "Hilltop"
},
"parent": {
"infid": 101,
"name": "Core Router"
}
},
{
"infid": 230,
"name": "Hilltop Sector 1",
"device_class": "AP",
"hardware_type": {
"id": "cambium",
"name": "Cambium"
},
"model": "ePMP 4500",
"ip": "10.10.7.21",
"site": {
"site_id": 7,
"code": "HT",
"name": "Hilltop Tower"
},
"pingbox": {
"pingboxid": 1,
"name": "Hilltop"
},
"parent": {
"infid": 214,
"name": "Hilltop Router"
}
}
]
} Get a device
Everything about one infrastructure device: what and where it is, its parent device, its interfaces and IP addresses, and its live health. Health has an entry for each metric the device reports, with the latest value, its threshold state and severity, and any open issue. A metric with several values on one device, like signal per radio chain, repeats with a sub naming each one. Entries with has_history have history in get_device_history (series = the metric name), and each interface's traffic is in get_interface_traffic. value_ttl_seconds is how long until a value counts as stale (-1 means it doesn't expire). Interface names that carry a subscriber's login (PPPoE and similar) and staff comments need the pii scope. An issue's status is active (alerting now), pending (alerting, but still inside its grace period, so not alert-worthy yet) or recovering (back to good, but held open a while in case it comes back: recovered_at is when it went good, and resolves_at is when it clears if it stays good).
Parameters
-
infidinteger path requiredDevice infrastructure id from
list_devices/list_backhauls -
ispstring queryISP code from GET /isps. Optional when the key reaches exactly one ISP.
Response
-
infidinteger -
namestring -
device_classstringe.g. Router, AP, Switch, Backhaul AP
-
hardware_typeobject nullableThe kind of device, which decides how Swift Fox collects from it
2 fields
-
idstringe.g. mikrotik, ubiquiti, cambium, snmp (any standard-SNMP device), generic
-
namestringAs the app shows it
-
-
modelstring nullable -
ipstring nullableManagement IPv4 address
-
siteobject nullableThe site
3 fields
-
site_idinteger -
codestringThe ISP's short site code
-
namestring
-
-
pingboxobjectThe pingbox this device is pinged from (
list_pingboxes)2 fields
-
pingboxidinteger -
namestring
-
-
firmwarestring nullable -
parentobject nullableThe device it hangs off in the network map
2 fields
-
infidinteger -
namestring
-
-
main_ip_interface_labelstring nullableUser-entered label for the interface holding the main IP; often stale
-
interfacesarray of objectsEach item: 5 fields
-
namestringPass as interface for its traffic history (REST: /devices/{infid}/traffic?interface=<name>)
-
typestring nullable -
macstring nullable -
commentstring nullable -
last_seendate-time nullable
-
-
local_ipsarray of objectsEach item: 3 fields
-
ipstring -
interfacestring nullable -
commentstring nullable
-
-
healtharray of objectsEach item: 10 fields
-
metricstring -
substring optionalWhich value of a metric with several on one entity (a radio chain, a vulnerability)
-
descriptionstring optional -
valuenumber nullableLatest collected value
-
unitstring optional -
statestringThreshold state name for the value, e.g. Good, Warning, Down; Inactive = the metric has no thresholds set
-
severityone of: "ok", "info", "warning", "outage", "critical" nullableok, info, warning, outage or critical for the state's level; null when the metric has no thresholds
-
value_ttl_secondsinteger nullableSeconds until the value is considered stale; -1 = no expiry set
-
issueobject nullable6 fields
-
detailsstring -
severityone of: "ok", "info", "warning", "outage", "critical"ok while recovering, otherwise info, warning, outage or critical
-
sincedate-time nullableWhen the issue started
-
statusone of: "active", "pending", "recovering" -
recovered_atdate-time nullablerecovering only: when the metric went back to good
-
resolves_atdate-time nullablerecovering only: when the issue clears if it stays good
-
-
has_historyboolean optionalDevices: true when the metric's history is available (REST: /devices/{infid}/history/{metric})
-
Example
curl -H "Authorization: Bearer $SWIFTFOX_KEY" \
"https://api.swiftfox.net/v1/devices/1234?isp=yourisp" Response (example data):
{
"infid": 230,
"name": "Hilltop Sector 1",
"device_class": "AP",
"hardware_type": {
"id": "cambium",
"name": "Cambium"
},
"model": "ePMP 4500",
"ip": "10.10.7.21",
"site": {
"site_id": 7,
"code": "HT",
"name": "Hilltop Tower"
},
"pingbox": {
"pingboxid": 1,
"name": "Hilltop"
},
"firmware": "5.10.2",
"parent": {
"infid": 214,
"name": "Hilltop Router"
},
"main_ip_interface_label": null,
"interfaces": [
{
"name": "eth0",
"type": "ethernetCsmacd",
"mac": "00:00:5E:00:53:21",
"comment": null,
"last_seen": "2026-10-08T22:08:07Z"
}
],
"local_ips": [
{
"ip": "10.10.7.21",
"interface": "br0",
"comment": null
}
],
"health": [
{
"metric": "Health:CPU Usage",
"description": "CPU percentage used as reported by the device",
"value": 23,
"unit": "%",
"state": "Good",
"severity": "ok",
"value_ttl_seconds": 604790,
"issue": null,
"has_history": true
},
{
"metric": "Health:Temperature",
"description": "Device temperature is outside threshold",
"value": 71,
"unit": "deg C",
"state": "Warning",
"severity": "warning",
"value_ttl_seconds": 604790,
"issue": {
"details": "Warning - 71 deg C",
"severity": "warning",
"since": "2026-10-08T21:40:12Z",
"status": "active",
"recovered_at": null,
"resolves_at": null
},
"has_history": true
},
{
"metric": "Wireless:Signal",
"sub": "Chain 0",
"description": "Receive Signal Strength (RSSI) in dBm",
"value": -58,
"unit": "dBm",
"state": "Good",
"severity": "ok",
"value_ttl_seconds": 604790,
"issue": null,
"has_history": false
},
{
"metric": "Ping:Quality",
"description": "A weighted quality rating based on packet loss and latency. 1 = Down/Black … 6 = Bright Green.",
"value": 6,
"unit": "",
"state": "Good",
"severity": "ok",
"value_ttl_seconds": 604800,
"issue": null,
"has_history": false
}
]
} List config changes
When a device's config changed, newest first. Pass a revision to get_config for that config, or two of them to diff_configs to see what changed. A backup is only stored when the config changes, so a revision's time is when the config changed. last_collected_at is when the config was last read, changed or not: if it's recent, an old newest revision just means a stable config; if it's old, collection is failing, and the device's Task:Connection issue usually says why.
Parameters
-
infidinteger path requiredDevice infrastructure id
-
ispstring queryISP code from GET /isps. Optional when the key reaches exactly one ISP.
-
limitinteger queryMax entries (default 50, max 500)
-
cursorstring querynext_cursor from the previous page
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.
-
infidinteger -
last_collected_atdate-time nullableWhen the config was last read successfully, whether or not it changed; null if no successful read is recorded
-
countinteger -
next_cursorstring nullablePass as cursor to get the next page; null on the last page
-
changesarray of objectsNewest first
Each item: 5 fields
-
revisionintegerThe revision's id (unix seconds): pass it to
get_configordiff_configs -
changed_atdate-time -
formatstringThe config's syntax: mikrotik (a RouterOS export), ubiquiti or cambium
-
size_bytesinteger -
content_hashstring
-
Example
curl -H "Authorization: Bearer $SWIFTFOX_KEY" \
"https://api.swiftfox.net/v1/devices/1234/configs?isp=yourisp" Response (example data):
{
"infid": 101,
"last_collected_at": "2026-10-08T22:00:12Z",
"count": 2,
"next_cursor": null,
"changes": [
{
"revision": 1791468760,
"changed_at": "2026-10-08T14:12:40Z",
"format": "mikrotik",
"size_bytes": 18214,
"content_hash": "3f1c2a9e6b0d47c8a5e2f19b7d6c4a0e8b5f3d21"
},
{
"revision": 1789981391,
"changed_at": "2026-09-21T09:03:11Z",
"format": "mikrotik",
"size_bytes": 18166,
"content_hash": "9a0e4b1c7d2f5e8a3b6c9d0e1f2a3b4c5d6e7f80"
}
]
} Get a device's health
The live monitored metrics for one device, backhaul or CPE: each metric's latest value and unit, its threshold state and severity, and any open issue. It's the same list as get_device's health, for backhauls and CPEs too. For devices, entries with has_history have history in get_device_history (series = the metric name). An issue's status is active (alerting now), pending (alerting, but still inside its grace period, so not alert-worthy yet) or recovering (back to good, but held open a while in case it comes back: recovered_at is when it went good, and resolves_at is when it clears if it stays good).
Parameters
-
infidinteger path requiredinfid / bhid / cpeid
-
ispstring queryISP code from GET /isps. Optional when the key reaches exactly one ISP.
Response
Also available as CSV: add format=csv. Columns follow the field order below, with nested fields as dotted columns
(ap.name).
-
typestringdevice, backhaul or cpe; more types may be added
-
idinteger -
metricsarray of objectsEach item: 10 fields
-
metricstring -
substring optionalWhich value of a metric with several on one entity (a radio chain, a vulnerability)
-
descriptionstring optional -
valuenumber nullableLatest collected value
-
unitstring optional -
statestringThreshold state name for the value, e.g. Good, Warning, Down; Inactive = the metric has no thresholds set
-
severityone of: "ok", "info", "warning", "outage", "critical" nullableok, info, warning, outage or critical for the state's level; null when the metric has no thresholds
-
value_ttl_secondsinteger nullableSeconds until the value is considered stale; -1 = no expiry set
-
issueobject nullable6 fields
-
detailsstring -
severityone of: "ok", "info", "warning", "outage", "critical"ok while recovering, otherwise info, warning, outage or critical
-
sincedate-time nullableWhen the issue started
-
statusone of: "active", "pending", "recovering" -
recovered_atdate-time nullablerecovering only: when the metric went back to good
-
resolves_atdate-time nullablerecovering only: when the issue clears if it stays good
-
-
has_historyboolean optionalDevices: true when the metric's history is available (REST: /devices/{infid}/history/{metric})
-
Example
curl -H "Authorization: Bearer $SWIFTFOX_KEY" \
"https://api.swiftfox.net/v1/devices/1234/health?isp=yourisp" Response (example data):
{
"type": "device",
"id": 230,
"metrics": [
{
"metric": "Health:CPU Usage",
"description": "CPU percentage used as reported by the device",
"value": 23,
"unit": "%",
"state": "Good",
"severity": "ok",
"value_ttl_seconds": 604790,
"issue": null,
"has_history": true
},
{
"metric": "Health:Temperature",
"description": "Device temperature is outside threshold",
"value": 71,
"unit": "deg C",
"state": "Warning",
"severity": "warning",
"value_ttl_seconds": 604790,
"issue": {
"details": "Warning - 71 deg C",
"severity": "warning",
"since": "2026-10-08T21:40:12Z",
"status": "active",
"recovered_at": null,
"resolves_at": null
},
"has_history": true
},
{
"metric": "Wireless:Signal",
"sub": "Chain 0",
"description": "Receive Signal Strength (RSSI) in dBm",
"value": -58,
"unit": "dBm",
"state": "Good",
"severity": "ok",
"value_ttl_seconds": 604790,
"issue": null,
"has_history": false
},
{
"metric": "Ping:Quality",
"description": "A weighted quality rating based on packet loss and latency. 1 = Down/Black … 6 = Bright Green.",
"value": 6,
"unit": "",
"state": "Good",
"severity": "ok",
"value_ttl_seconds": 604800,
"issue": null,
"has_history": false
}
]
} Get an interface's traffic
History for one device, backhaul or CPE, rolled up into time buckets (up to 200, or max_points up to 500), so long ranges stay small. Series: devices have pings, quality, signal, traffic (with interface), or a health metric name from get_device whose has_history is true; backhauls have pings, quality, traffic or capacity; CPEs have pings, traffic, plan, quality or signal. Each point has its bucket's start time (at), the values for the series and how many readings went into it (samples). pings: loss_avg_pct, loss_max_pct, latency_avg_ms, latency_min_ms, latency_max_ms. traffic, capacity and plan: avg and max Mbps per direction (an interface's in/out, a backhaul's ap_to_su/su_to_ap, a CPE's down/up). quality: quality_avg, quality_min (0 down to 6 perfect). signal: one point per radio chain per bucket. Health metrics: value_avg, value_min, value_max in unit. A missing bucket means nothing was recorded then.
Parameters
-
infidinteger path requiredThe infid, bhid or cpeid
-
ispstring queryISP code from GET /isps. Optional when the key reaches exactly one ISP.
-
interfacestring queryDevice traffic only: the interface name, as
get_devicelists it -
periodone of: "1hour", "4hours", "day", "week", "month", "year" queryLookback from now (default day). Use from/to instead for a past window
-
frominteger or string queryRange start: unix seconds or 'YYYY-MM-DD HH:MM:SS' UTC
-
tointeger or string queryRange end (default: now)
-
max_pointsinteger queryPoint budget (default 200, max 500); buckets are sized to stay under it
Response
Also available as CSV: add format=csv. Columns follow the field order below, with nested fields as dotted columns
(ap.name).
-
typestringdevice, backhaul or cpe; more types may be added
-
idinteger -
seriesstring -
interfacestring optionalDevice traffic: the interface
-
sourcestring optionalBackhaul capacity: the measurement shown
-
unitstring nullableHealth metrics: the value's unit. Other series carry the unit in their field names
-
fromdate-time -
todate-time -
bucket_secondsinteger -
point_countinteger -
pointsarray of objectsEach item: 2 fields
-
atdate-timeBucket start
-
chainstring optionalsignal only: the radio chain
-
Example
curl -H "Authorization: Bearer $SWIFTFOX_KEY" \
"https://api.swiftfox.net/v1/devices/1234/traffic?isp=yourisp" Response (example data):
{
"type": "device",
"id": 101,
"series": "traffic",
"interface": "sfp1-HT",
"unit": null,
"from": "2026-10-08T21:00:00Z",
"to": "2026-10-08T22:00:00Z",
"bucket_seconds": 1800,
"point_count": 2,
"points": [
{
"at": "2026-10-08T21:00:00Z",
"in_avg_mbps": 41.2,
"in_max_mbps": 63.5,
"out_avg_mbps": 498.1,
"out_max_mbps": 571.3,
"samples": 30
},
{
"at": "2026-10-08T21:30:00Z",
"in_avg_mbps": 38.7,
"in_max_mbps": 55,
"out_avg_mbps": 526.4,
"out_max_mbps": 589.9,
"samples": 30
}
]
} Get a config revision
A device's config backup as text: the newest revision, or a particular one if you pass revision (from list_config_changes). To see what changed between two revisions, diff_configs is quicker than fetching both. Backups can contain passwords and keys, so this needs the network_viewconfigs permission. A backup is only stored when the config changes, so a revision's time is when the config changed. last_collected_at is when the config was last read, changed or not: if it's recent, an old newest revision just means a stable config; if it's old, collection is failing, and the device's Task:Connection issue usually says why.
Parameters
-
infidinteger path requiredDevice infrastructure id
-
revisioninteger or string path requiredA revision from
list_config_changes(unix seconds; 'YYYY-MM-DD HH:MM:SS' UTC also works) -
ispstring queryISP code from GET /isps. Optional when the key reaches exactly one ISP.
Response
-
infidinteger -
revisionintegerThe revision's id (unix seconds): pass it to
get_configordiff_configs -
changed_atdate-time -
formatstringThe config's syntax: mikrotik (a RouterOS export), ubiquiti or cambium
-
size_bytesinteger -
content_hashstring -
last_collected_atdate-time nullableWhen the config was last read successfully, whether or not it changed; null if no successful read is recorded
-
config_textstring
Example
curl -H "Authorization: Bearer $SWIFTFOX_KEY" \
"https://api.swiftfox.net/v1/devices/1234/configs/revision?isp=yourisp" Response (example data):
{
"infid": 101,
"revision": 1791468760,
"changed_at": "2026-10-08T14:12:40Z",
"format": "mikrotik",
"size_bytes": 18214,
"content_hash": "3f1c2a9e6b0d47c8a5e2f19b7d6c4a0e8b5f3d21",
"last_collected_at": "2026-10-08T22:00:12Z",
"config_text": "# 2026-10-08 14:12:40 by RouterOS 7.20.1\n/interface bridge\nadd name=bridge-lan\n/ip address\nadd address=10.10.0.1/24 interface=bridge-lan\n…"
} Diff two config revisions
What changed between two config revisions of a device, as a unified diff: from is the older revision and to the newer one, both from list_config_changes. It's a good next step when list_config_changes or events_around shows a change near an incident. Like get_config, it needs the network_viewconfigs permission.
Parameters
-
infidinteger path requiredDevice infrastructure id
-
ispstring queryISP code from GET /isps. Optional when the key reaches exactly one ISP.
-
frominteger or string query requiredThe older revision, from
list_config_changes -
tointeger or string query requiredThe newer revision
Response
-
infidinteger -
fromobjectThe older revision
2 fields
-
revisioninteger -
changed_atdate-time
-
-
toobjectThe newer revision
2 fields
-
revisioninteger -
changed_atdate-time
-
-
lines_addedinteger -
lines_removedinteger -
identicalboolean -
diffstringUnified diff: lines starting - are only in from, + only in to, and a space are unchanged context
Example
curl -H "Authorization: Bearer $SWIFTFOX_KEY" \
"https://api.swiftfox.net/v1/devices/1234/configs/diff?isp=yourisp&from=…&to=…" Response (example data):
{
"infid": 101,
"from": {
"revision": 1789981391,
"changed_at": "2026-09-21T09:03:11Z"
},
"to": {
"revision": 1791468760,
"changed_at": "2026-10-08T14:12:40Z"
},
"lines_added": 1,
"lines_removed": 1,
"identical": false,
"diff": "@@ old line ~212, new line ~212 @@\n /ip service\n-set ssh address=10.0.0.0/8\n+set ssh address=10.0.0.0/8,10.99.0.0/24\n set telnet disabled=yes\n"
} Get the latest config
A device's config backup as text: the newest revision, or a particular one if you pass revision (from list_config_changes). To see what changed between two revisions, diff_configs is quicker than fetching both. Backups can contain passwords and keys, so this needs the network_viewconfigs permission. A backup is only stored when the config changes, so a revision's time is when the config changed. last_collected_at is when the config was last read, changed or not: if it's recent, an old newest revision just means a stable config; if it's old, collection is failing, and the device's Task:Connection issue usually says why.
Parameters
-
infidinteger path requiredDevice infrastructure id
-
ispstring queryISP code from GET /isps. Optional when the key reaches exactly one ISP.
Response
-
infidinteger -
revisionintegerThe revision's id (unix seconds): pass it to
get_configordiff_configs -
changed_atdate-time -
formatstringThe config's syntax: mikrotik (a RouterOS export), ubiquiti or cambium
-
size_bytesinteger -
content_hashstring -
last_collected_atdate-time nullableWhen the config was last read successfully, whether or not it changed; null if no successful read is recorded
-
config_textstring
Example
curl -H "Authorization: Bearer $SWIFTFOX_KEY" \
"https://api.swiftfox.net/v1/devices/1234/configs/latest?isp=yourisp" Response (example data):
{
"infid": 101,
"revision": 1791468760,
"changed_at": "2026-10-08T14:12:40Z",
"format": "mikrotik",
"size_bytes": 18214,
"content_hash": "3f1c2a9e6b0d47c8a5e2f19b7d6c4a0e8b5f3d21",
"last_collected_at": "2026-10-08T22:00:12Z",
"config_text": "# 2026-10-08 14:12:40 by RouterOS 7.20.1\n/interface bridge\nadd name=bridge-lan\n/ip address\nadd address=10.10.0.1/24 interface=bridge-lan\n…"
} Get a device's history
History for one device, backhaul or CPE, rolled up into time buckets (up to 200, or max_points up to 500), so long ranges stay small. Series: devices have pings, quality, signal, traffic (with interface), or a health metric name from get_device whose has_history is true; backhauls have pings, quality, traffic or capacity; CPEs have pings, traffic, plan, quality or signal. Each point has its bucket's start time (at), the values for the series and how many readings went into it (samples). pings: loss_avg_pct, loss_max_pct, latency_avg_ms, latency_min_ms, latency_max_ms. traffic, capacity and plan: avg and max Mbps per direction (an interface's in/out, a backhaul's ap_to_su/su_to_ap, a CPE's down/up). quality: quality_avg, quality_min (0 down to 6 perfect). signal: one point per radio chain per bucket. Health metrics: value_avg, value_min, value_max in unit. A missing bucket means nothing was recorded then.
Parameters
-
infidinteger path requiredThe infid, bhid or cpeid
-
seriesstring path requiredWhich history; see the operation's description
-
ispstring queryISP code from GET /isps. Optional when the key reaches exactly one ISP.
-
periodone of: "1hour", "4hours", "day", "week", "month", "year" queryLookback from now (default day). Use from/to instead for a past window
-
frominteger or string queryRange start: unix seconds or 'YYYY-MM-DD HH:MM:SS' UTC
-
tointeger or string queryRange end (default: now)
-
max_pointsinteger queryPoint budget (default 200, max 500); buckets are sized to stay under it
Response
Also available as CSV: add format=csv. Columns follow the field order below, with nested fields as dotted columns
(ap.name).
-
typestringdevice, backhaul or cpe; more types may be added
-
idinteger -
seriesstring -
interfacestring optionalDevice traffic: the interface
-
sourcestring optionalBackhaul capacity: the measurement shown
-
unitstring nullableHealth metrics: the value's unit. Other series carry the unit in their field names
-
fromdate-time -
todate-time -
bucket_secondsinteger -
point_countinteger -
pointsarray of objectsEach item: 2 fields
-
atdate-timeBucket start
-
chainstring optionalsignal only: the radio chain
-
Example
curl -H "Authorization: Bearer $SWIFTFOX_KEY" \
"https://api.swiftfox.net/v1/devices/1234/history/series?isp=yourisp" Response (example data):
{
"type": "device",
"id": 230,
"series": "Health:Temperature",
"unit": "deg C",
"from": "2026-10-08T21:00:00Z",
"to": "2026-10-08T22:00:00Z",
"bucket_seconds": 1800,
"point_count": 2,
"points": [
{
"at": "2026-10-08T21:00:00Z",
"value_avg": 68.4,
"value_min": 67,
"value_max": 70,
"samples": 30
},
{
"at": "2026-10-08T21:30:00Z",
"value_avg": 70.6,
"value_min": 69,
"value_max": 72,
"samples": 30
}
]
} Collect a config now
Collect a device's config backup now instead of waiting for its turn. It tells you whether the config changed: backups are only stored when it does, so collected with no change is the normal, healthy result. Works for MikroTik, Ubiquiti and Cambium devices, and needs the edit_inf permission.
Needs the actions scope.
Parameters
-
infidinteger path requiredDevice infrastructure id
-
ispstring queryISP code from GET /isps. Optional when the key reaches exactly one ISP.
Response
-
deviceobjectThe device
2 fields
-
infidinteger -
namestring
-
-
collectedbooleanfalse when the device answered but returned no config
-
config_changedboolean -
latest_revisionobject nullableThe newest stored revision, for
get_configordiff_configs2 fields
-
revisioninteger -
changed_atdate-time
-
-
last_collected_atdate-time nullableWhen the config was last read successfully, whether or not it changed
Example
curl -X POST -H "Authorization: Bearer $SWIFTFOX_KEY" \
-H "Content-Type: application/json" -d '{}' \
"https://api.swiftfox.net/v1/devices/1234/config-collections?isp=yourisp" Response (example data):
{
"device": {
"infid": 101,
"name": "Core Router"
},
"collected": true,
"config_changed": false,
"latest_revision": {
"revision": 1791468760,
"changed_at": "2026-10-08T14:12:40Z"
},
"last_collected_at": "2026-10-08T22:16:05Z"
}