API reference
Network
The RF channel plan, what changed around a time, and everything known about an IP address.
- List RF channels
GET /v1/channels - List what changed around a time
GET /v1/events - Look up an IP address
GET /v1/ip/{ip}
List RF channels
Your RF channel plan: every wireless radio's centre frequency, channel width and duplex, with live signal, noise and MCS. overlap_candidates lists the other radios whose channels overlap it, which is handy for chasing interference and planning channels. Overlap only means the channels collide; whether the radios can hear each other depends on where they are and which way they point. Pass infid to also get that device's channel history. Radios that haven't reported in 7 days are left out, and at most 10,000 radios are considered.
Parameters
-
ispstring queryISP code from GET /isps. Optional when the key reaches exactly one ISP.
-
siteinteger or string queryRestrict to radios at this site: site_id or site code
-
infidinteger queryRestrict to one device and include its channel change history
-
limitinteger queryMax radios per page (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
-
radiosarray of objectsEach item: 13 fields
-
deviceobjectThe radio
2 fields
-
infidinteger -
namestring
-
-
siteobject nullableThe site
3 fields
-
site_idinteger -
codestringThe ISP's short site code
-
namestring
-
-
radiostringRadio group on the device
-
center_mhznumber -
width_mhznumber -
range_mhzstring nullablee.g. 5170-5190
-
duplexstring -
chainsinteger -
signal_dbmnumber nullableWorst chain
-
noise_dbmnumber nullableWorst chain
-
mcsnumber nullableLowest chain
-
as_ofdate-time -
overlap_candidatesarray of objectsRadios in this result whose channel overlaps this one's (spectral collision only)
Each item: 3 fields
-
deviceobjectThe other radio
2 fields
-
infidinteger -
namestring
-
-
siteobject nullableThe site
3 fields
-
site_idinteger -
codestringThe ISP's short site code
-
namestring
-
-
center_mhznumber
-
-
-
channel_historyarray of objects optionalWith infid only: up to 30 changes, newest first
Each item: 5 fields
-
radiostring -
center_mhznumber -
width_mhznumber -
duplexstring -
observed_atdate-time
-
Example
curl -H "Authorization: Bearer $SWIFTFOX_KEY" \
"https://api.swiftfox.net/v1/channels?isp=yourisp" Response (example data):
{
"count": 2,
"next_cursor": null,
"radios": [
{
"device": {
"infid": 230,
"name": "Hilltop Sector 1"
},
"site": {
"site_id": 7,
"code": "HT",
"name": "Hilltop Tower"
},
"radio": "Wireless",
"center_mhz": 5745,
"width_mhz": 40,
"range_mhz": "5725-5765",
"duplex": "Half",
"chains": 2,
"signal_dbm": null,
"noise_dbm": -94,
"mcs": null,
"as_of": "2026-10-08T22:10:05Z",
"overlap_candidates": [
{
"device": {
"infid": 318,
"name": "Mill Valley Sector 2"
},
"site": {
"site_id": 9,
"code": "MV",
"name": "Mill Valley Tower"
},
"center_mhz": 5755
}
]
},
{
"device": {
"infid": 318,
"name": "Mill Valley Sector 2"
},
"site": {
"site_id": 9,
"code": "MV",
"name": "Mill Valley Tower"
},
"radio": "Wireless",
"center_mhz": 5755,
"width_mhz": 20,
"range_mhz": "5745-5765",
"duplex": "Half",
"chains": 2,
"signal_dbm": null,
"noise_dbm": -91,
"mcs": null,
"as_of": "2026-10-08T22:10:02Z",
"overlap_candidates": [
{
"device": {
"infid": 230,
"name": "Hilltop Sector 1"
},
"site": {
"site_id": 7,
"code": "HT",
"name": "Hilltop Tower"
},
"center_mhz": 5745
}
]
}
]
} List what changed around a time
Everything that changed around a time: radio channel and width changes (tracked separately from config backups), config changes, issues that started or ended in the window, and issues that started in it and are still open. Repeats of the same issue are folded into one entry with occurrences and total_minutes_in_state. Use it to line an outage, or a step in a graph, up with what caused it. Narrow it down with type, or with metric_q to match issue names (for example Ping or Usage). The window is centred on timestamp and up to 48 hours wide; issue history goes back about 90 days and config history about a year.
Parameters
-
ispstring queryISP code from GET /isps. Optional when the key reaches exactly one ISP.
-
timestampinteger or string query requiredCenter of the window: unix seconds or 'YYYY-MM-DD HH:MM:SS' UTC
-
window_hoursinteger queryTotal window width in hours, centered on timestamp (default 4, max 48)
-
typeone of: "device", "backhaul", "cpe" queryRestrict the issue sections to device, backhaul or cpe (config and channel changes are always shown)
-
metric_qstring querySubstring filter on issue metric names, e.g. 'Ping' or 'Usage' — use to cut peak-hour usage-warning noise
Response
-
windowobject3 fields
-
fromdate-time -
todate-time -
centered_ondate-time
-
-
channel_changesarray of objectsEach item: 7 fields
-
deviceobjectThe radio
2 fields
-
infidinteger -
namestring
-
-
siteobject nullableThe site
3 fields
-
site_idinteger -
codestringThe ISP's short site code
-
namestring
-
-
radiostring -
center_mhznumber -
width_mhznumber -
duplexstring -
observed_atdate-time
-
-
config_changesarray of objectsEach item: 5 fields
-
deviceobjectThe device
2 fields
-
infidinteger -
namestring
-
-
revisioninteger -
changed_atdate-time -
formatstring -
size_bytesinteger
-
-
resolved_issues_overlappingarray of one of several shapessA single occurrence: 8 fields
-
typestringdevice, backhaul or cpe; more types may be added
-
entity_idintegerThe infid, bhid or cpeid, by type
-
namestring -
metricstring -
severityone of: "info", "warning", "outage", "critical" nullableinfo, warning, outage or critical; outage and critical would page
-
detailsstring -
started_atdate-time -
ended_atdate-time
Repeats of one entity + metric, folded: 11 fields
-
typestringdevice, backhaul or cpe; more types may be added
-
entity_idintegerThe infid, bhid or cpeid, by type
-
namestring -
metricstring -
severityone of: "info", "warning", "outage", "critical" nullableinfo, warning, outage or critical; outage and critical would page
-
flappingboolean -
occurrencesinteger -
first_started_atdate-time -
last_ended_atdate-time -
total_minutes_in_stateinteger -
latest_detailsstring
-
-
active_issues_started_in_windowarray of objectsEach item: 7 fields
-
typestringdevice, backhaul or cpe; more types may be added
-
entity_idintegerThe infid, bhid or cpeid, by type
-
namestring -
metricstring -
severityone of: "info", "warning", "outage", "critical" nullableinfo, warning, outage or critical; outage and critical would page
-
detailsstring -
started_atdate-time
-
Example
curl -H "Authorization: Bearer $SWIFTFOX_KEY" \
"https://api.swiftfox.net/v1/events?isp=yourisp×tamp=…" Response (example data):
{
"window": {
"from": "2026-10-08T20:00:00Z",
"to": "2026-10-08T22:00:00Z",
"centered_on": "2026-10-08T21:00:00Z"
},
"channel_changes": [
{
"device": {
"infid": 230,
"name": "Hilltop Sector 1"
},
"site": {
"site_id": 7,
"code": "HT",
"name": "Hilltop Tower"
},
"radio": "Wireless",
"center_mhz": 5745,
"width_mhz": 40,
"duplex": "Half",
"observed_at": "2026-10-08T20:41:06Z"
}
],
"config_changes": [
{
"device": {
"infid": 214,
"name": "Hilltop Router"
},
"revision": 1791449932,
"changed_at": "2026-10-08T20:38:52Z",
"format": "mikrotik",
"size_bytes": 15880
}
],
"resolved_issues_overlapping": [
{
"type": "backhaul",
"entity_id": 12,
"name": "RB-HT",
"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"
},
{
"type": "device",
"entity_id": 230,
"name": "Hilltop Sector 1",
"metric": "Ping:Quality",
"severity": "outage",
"flapping": true,
"occurrences": 4,
"first_started_at": "2026-10-08T20:42:30Z",
"last_ended_at": "2026-10-08T21:05:02Z",
"total_minutes_in_state": 6,
"latest_details": "Bad - 20% packet loss"
}
],
"active_issues_started_in_window": [
{
"type": "device",
"entity_id": 230,
"name": "Hilltop Sector 1",
"metric": "Health:Temperature",
"severity": "warning",
"details": "Warning - 71 deg C",
"started_at": "2026-10-08T21:40:12Z"
}
]
} Look up an IP address
Everything we know about an IPv4 address in your network: what our collectors have seen recently (ARP, DHCP leases, CDP/LLDP neighbours, traffic flows and Ubiquiti discovery, the same data as the network map's IP hover, refreshed every few minutes), which device, interface or CPE it belongs to, with ids for get_device and get_cpe, and the network owner for public addresses when we already know it. No cache entry only means nothing has seen the address in the last few minutes, not that it's unused. Hostnames, discovered device names and comments can name subscribers, so they need the pii scope.
Parameters
-
ipstring path requiredDotted IPv4 address
-
ispstring queryISP code from GET /isps. Optional when the key reaches exactly one ISP.
Response
-
ipstring -
is_private_or_reservedboolean -
cache_entryobject nullable2 fields
-
typestringWhat the address is, as the cache classifies it
-
sourcesobjectWhat each source saw, by source. A source kind not listed here may appear, with site, details and last_seen.
9 fields
-
arpobject optionalIn a router's ARP table
5 fields
-
seen_byobject nullableThe router with it in its ARP table
3 fields
-
infidinteger nullable -
namestring nullable -
siteobject nullable optionalThe site
3 fields
-
site_idinteger -
codestringThe ISP's short site code
-
namestring
-
-
-
interfacestring nullable -
macstring nullable -
mac_manufacturerstring nullable -
last_seendate-time nullable
-
-
dhcpobject optionalA DHCP lease
9 fields
-
lease_onobject nullableThe DHCP server holding the lease
3 fields
-
infidinteger nullable -
namestring nullable -
siteobject nullable optionalThe site
3 fields
-
site_idinteger -
codestringThe ISP's short site code
-
namestring
-
-
-
interfacestring nullable -
hostnamestring nullablenull without the pii scope
-
macstring nullable -
dhcp_serverstring nullable -
static_leaseboolean -
commentstring nullablenull without the pii scope
-
lease_time_snumber nullable -
last_seendate-time nullable
-
-
cdpobject optionalA CDP/LLDP/MNDP neighbour
6 fields
-
found_byobject nullableThe device that saw it as a neighbour
3 fields
-
infidinteger nullable -
namestring nullable -
siteobject nullable optionalThe site
3 fields
-
site_idinteger -
codestringThe ISP's short site code
-
namestring
-
-
-
interfacestring nullable -
identitystring nullablenull without the pii scope
-
platformstring nullable -
versionstring nullable -
last_seendate-time nullable
-
-
flowobject optionalTraffic flows (NetFlow)
4 fields
-
throughput_rx_tx_mbitstring nullable -
packets_rx_tx_per_secstring nullable -
sessions_rx_txstring nullable -
as_ofdate-time nullable
-
-
ubntobject optionalUbiquiti discovery
6 fields
-
namestring nullablenull without the pii scope
-
modelstring nullable -
firmwarestring nullable -
uptimestring nullable -
ssidstring nullable -
last_seendate-time nullable
-
-
cpeobject optionalThe address of a CPE radio itself
7 fields
-
apobject nullableThe CPE's access point
3 fields
-
infidinteger nullable -
namestring nullable -
siteobject nullable optionalThe site
3 fields
-
site_idinteger -
codestringThe ISP's short site code
-
namestring
-
-
-
cpe_macstring nullable -
mac_manufacturerstring nullable -
account_namestring nullable optionalpii scope only
-
cpe_descriptionstring nullable optionalpii scope only
-
cpe_discovered_namestring nullable optionalpii scope only
-
last_seendate-time nullable
-
-
clientobject optionalAn address in a CPE's service package (shaping and disconnect)
10 fields
-
meaningstringWhat the match means: the CPE itself, or a customer device behind it
-
is_cpe_itselfboolean nullable -
apobject nullableThe CPE's access point
3 fields
-
infidinteger nullable -
namestring nullable -
siteobject nullable optionalThe site
3 fields
-
site_idinteger -
codestringThe ISP's short site code
-
namestring
-
-
-
cpe_macstring nullable -
device_macstring nullable -
device_mac_manufacturerstring nullable -
account_namestring nullable optionalpii scope only
-
cpe_descriptionstring nullable optionalpii scope only
-
cpe_discovered_namestring nullable optionalpii scope only
-
last_seendate-time nullable
-
-
snobject optionalThe subnet it's in
4 fields
-
subnetstring nullable -
gateway_routerobject nullableThe router that's the subnet's gateway
3 fields
-
infidinteger nullable -
namestring nullable -
siteobject nullable optionalThe site
3 fields
-
site_idinteger -
codestringThe ISP's short site code
-
namestring
-
-
-
gateway_ipstring nullable -
routers_on_subnetinteger optional
-
-
infraobject optionalAn address on one of your devices
6 fields
-
deviceobject nullableThe device
3 fields
-
infidinteger nullable -
namestring nullable -
siteobject nullable optionalThe site
3 fields
-
site_idinteger -
codestringThe ISP's short site code
-
namestring
-
-
-
device_classstring nullable -
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
-
-
interfacestring nullable -
commentstring nullablenull without the pii scope
-
last_seendate-time nullable
-
-
-
-
devicesarray of objectsEach item: 5 fields
-
infidinteger -
namestring -
device_classstring -
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
-
-
matchstring
-
-
interface_ipsarray of objectsEach item: 3 fields
-
deviceobjectThe device
2 fields
-
infidinteger -
namestring
-
-
interfacestring nullable -
matchstring
-
-
cpesarray of objectsEach item: 16 fields
-
cpeidinteger -
macstring -
ipstring nullable -
apobject nullableThe access point it's associated to
2 fields
-
infidinteger -
namestring
-
-
siteobject nullableThe access point's site
3 fields
-
site_idinteger -
codestringThe ISP's short site code
-
namestring
-
-
account_numberstring nullableThe customer-visible account number, as on invoices
-
account_disconnectedboolean nullable -
signal_dbmnumber nullable -
planobject nullableThe billing plan and its configured rates
4 fields
-
plan_idinteger nullablePass as plan to
list_cpes -
namestring nullable -
down_mbpsnumber nullable -
up_mbpsnumber nullable
-
-
effective_rate_mbpsobject nullableWhat the shaper applies right now: the plan reduced by congestion multipliers or usage caps
2 fields
-
downnumber nullable -
upnumber nullable
-
-
monitoredboolean -
last_assocdate-time nullable -
namestringThe subscriber's name with the pii scope; otherwise 'CPE <mac> (account <number>)'
-
account_namestring nullable optionalpii scope only
-
descriptionstring nullable optionalpii scope only
-
discovered_namestring nullable optionalpii scope only: the name the radio reports
-
-
externalobject nullablePublic IPs only
4 fields
-
asnstring nullable -
ownerstring nullable -
citystring nullable -
regionstring nullable
-
Example
curl -H "Authorization: Bearer $SWIFTFOX_KEY" \
"https://api.swiftfox.net/v1/ip/10.0.0.1?isp=yourisp" Response (example data):
{
"ip": "10.10.7.21",
"is_private_or_reserved": true,
"cache_entry": {
"type": "infra",
"sources": {
"arp": {
"seen_by": {
"infid": 214,
"name": "Hilltop Router",
"site": {
"site_id": 7,
"code": "HT",
"name": "Hilltop Tower"
}
},
"interface": "bridge-sectors",
"mac": "00:00:5E:00:53:21",
"mac_manufacturer": "Cambium Networks Limited",
"last_seen": "2026-10-08T22:13:05Z"
},
"infra": {
"device": {
"infid": 230,
"name": "Hilltop Sector 1",
"site": {
"site_id": 7,
"code": "HT",
"name": "Hilltop Tower"
}
},
"device_class": "AP",
"hardware_type": {
"id": "cambium",
"name": "Cambium"
},
"interface": "br0",
"comment": null,
"last_seen": "2026-10-08T22:13:05Z"
}
}
},
"devices": [
{
"infid": 230,
"name": "Hilltop Sector 1",
"device_class": "AP",
"hardware_type": {
"id": "cambium",
"name": "Cambium"
},
"match": "device main IP"
}
],
"interface_ips": [
{
"device": {
"infid": 230,
"name": "Hilltop Sector 1"
},
"interface": "br0",
"match": "discovered interface IP"
}
],
"cpes": [],
"external": null
}