Connect Cisco Identity Services Engine to Versus over the ERS, Open API and Monitoring (MnT) APIs to see who is on the network, which switches, WLCs, firewalls and ADCs authenticate against ISE, TrustSec groups and policy sets — and to push Change of Authorization or quarantine an endpoint from a governed workflow.
Versus connects to Cisco Identity Services Engine (ISE) — the AAA and network-access-control authority for most Cisco estates — so identity context becomes part of network automation instead of a separate console. From a workflow, the AutoPilot, or the Integrations page you can answer who is behind this IP or MAC right now, which switch port and VLAN did they land on, which network devices AAA against ISE, and, when the situation calls for it, re-authorise, disconnect or quarantine an endpoint with a Change of Authorization.
The integration is read-first: every lookup is a plain API read, and the three write actions (CoA re-auth, CoA disconnect, endpoint-group move) are ordinary SDK calls you place behind an approval gate in a governed workflow.
A Cisco ISE source in Versus points at one ISE deployment's Primary Administration Node (PAN) and uses three ISE APIs behind one client:
| API | Where | Used for |
|---|---|---|
| ERS (External RESTful Services) | https://<pan>:9060/ers/config/… | Network devices, endpoints, endpoint & identity groups, TrustSec SGTs, authorization profiles, deployment nodes |
| Open API (ISE 3.1+) | https://<pan>/api/v1/… | Deployment node roles/status, network-access policy sets |
| MnT (Monitoring) | https://<pan>/admin/API/mnt/… | Active session list and per-endpoint session detail, CoA re-auth / disconnect, product version |
Authentication is HTTP Basic with an ISE admin account. Give it the smallest role set that covers what you use:
ERS is off by default on a fresh ISE: enable it under Administration → System → Settings → API Settings ("Enable ERS for Read/Write"). The Open API is switched on in the same place on ISE 3.1 and later.
The password is write-only and encrypted at rest — it is never returned by the API, and editing a source lets you leave it blank to keep the stored value. See Security & Compliance.
| Field | Meaning |
|---|---|
| Primary Admin Node URL | https://ise-pan.corp.com — the PAN (or the deployment's admin VIP) |
| ERS port | 9060 by default; set 443 if ERS is exposed on the admin port through a load balancer |
| Username / password | The ISE admin account described above |
| Default PSN for CoA | Optional Policy Service Node hostname CoA requests go through. Blank = Versus uses the PSN that owns the endpoint's session |
| Verify SSL | Off only when the PAN presents a self-signed certificate you have not imported |
| Monitoring API | Turn off to disable session reads and CoA (pure ERS mode) |
Test checks ERS first (it counts network devices), then adds the MnT product version and active-session count when available, and records the deployment nodes on the source.
Open Integrations → Cisco ISE → Explore on a source. Every tab shows whether the data is Live from the deployment or, for a seeded demo source, Sample data.
The Python SDK exposes ISE as versus.integrations.ise() — the first enabled source, or versus.integrations.ise('Corp ISE') by name. Reads:
ise = versus.integrations.ise()
# who is behind an address right now
s = ise.session(ip='10.20.14.91') # or mac='F4:5C:89:D2:6E:40', user='praman'
if s:
versus.log(f"{s['user']} on {s['network_device']} {s['nas_port']} "
f"authz={s['authz_profile']} sgt={s['sgt']} posture={s['posture']}")
# which NAD owns a management IP (is this switch even registered in ISE?)
nad = ise.find_network_device('10.10.1.2')
# broader inventory
nads = ise.network_devices(q='tor-')
endpoints = ise.endpoints(q='DC:A6')
sgts = ise.sgts()
nodes = ise.nodes()
Actions — place these after a core.approval step in a governed workflow:
ise.coa_reauth('DC:A6:32:1F:77:03') # re-run authorization
ise.coa_disconnect('DC:A6:32:1F:77:03') # drop the session
ise.set_endpoint_group('DC:A6:32:1F:77:03', 'Contractors')
ise.quarantine('DC:A6:32:1F:77:03') # → Quarantined_Systems + CoA re-auth
quarantine() is the building block for a containment loop that pairs with the CrowdStrike integration: a detection names a host, ISE resolves its live session, the endpoint is moved to the quarantine group and re-authorised so the switch or WLC applies the remediation VLAN / SGT immediately, and the change is written back to the ticket. The Generate with AI button in the Workflow Builder knows these methods, so "quarantine the endpoint behind IP X after approval" produces a working workflow.
session() and sessions() return the same dictionary:
| Key | Example |
|---|---|
user, mac, ip | praman, F4:5C:89:D2:6E:40, 10.20.14.91 |
network_device, nas_ip, nas_port | wlc-tor-01, 10.10.2.10, capwap_90000012 |
auth_method, authz_profile, identity_group | dot1x / EAP-TLS, Corp_Full_Access, Employees |
sgt, vlan, ssid, posture | Employees, 120, CORP-WIFI, Compliant |
psn, session_id, started | ise-psn-01, 0a0a020a00003f5e, ISO timestamp |
Two read-only expert tools are available to the Diagnostics AutoPilot and to agents that inherit its toolbox:
ise_session — the live session behind a MAC, IP or username (user, port, SGT, authorization profile, posture).ise_network_device — the NAD registered for a management IP or name.A path-check that ends at "the client cannot reach the VIP" can now continue with "the client is on mtl-access-sw-14 Gi1/0/7 in the Unknown_Device_Redirect profile — it never passed 802.1X", which is usually the actual answer.
Running manage.py seed_cisco_ise_demo (or the full seed_demo) creates a Cisco ISE (Demo) source flagged as a demo. It answers from a representative sample deployment — four nodes, eight network devices (including the demo F5s and firewall as TACACS+ clients), ten endpoints, twelve live sessions including one quarantined contractor laptop, seven SGTs and five policy sets — so the surface is demonstrable before a real PAN is connected. Actions on the demo source are simulated and say so.
Real sources never fall back to sample data: if ISE cannot be reached, the tab, the SDK call and the AutoPilot tool report the error.
nextPage up to 500 objects per read and fetches per-object detail for the first 100 (ERS lists return only id/name).ise_session tool lives