Appendix: ISE API Reference
ISE Authorization Policy API Reference
Programmatic ISE policy management using curl and jq. All commands tested during the P16g wired 802.1X deployment against ISE 3.4. No GUI β every operation is reproducible from the terminal.
Prerequisites
ds d000 dev/network
curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/ers/config/authorizationprofile?size=1" \
-H "Accept: application/json" | jq '.SearchResult.total'
|
After
TLS verification: |
ISE API Surface
ISE exposes three data interfaces. Commands in this reference use all three.
| API | Base Path / Protocol | Use |
|---|---|---|
ERS |
CRUD for profiles, endpoints, DACLs, NADs. Full object detail. REST/JSON. |
|
OpenAPI |
Policy sets, auth/authz rules, conditions, dictionaries. REST/JSON. |
|
MnT |
Real-time session data, active authentications, auth logs. REST/XML (converted to JSON by netapi). Uses ERS credentials. |
|
pxGrid |
|
Real-time event streaming β session changes, ANC actions, TrustSec updates. WebSocket + mTLS (certificate auth, not username/password). |
DataConnect |
|
Direct Oracle database access to RADIUS logs, auth history, session data. JDBC β not REST. |
Policy Set Discovery
ISE organizes network access into policy sets. Each set contains authentication rules and authorization rules evaluated top-down by rank.
curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/api/v1/policy/network-access/policy-set" \
-H "Accept: application/json" \
| jq -r '
["RANK","NAME","STATE","ID"],
(.response[] | [.rank, .name, .state, .id]) | @tsv
' | column -ts $'\t'
curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/api/v1/policy/network-access/policy-set" \
-H "Accept: application/json" \
| jq '.response[] | {name, id, state, rank, serviceName, description}'
Authorization Profiles
Authorization profiles define what happens after authentication β VLAN assignment, dACL, reauthentication timer.
curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/ers/config/authorizationprofile/name/Domus_Admin_Profile" \
-H "Accept: application/json" \
| jq '.AuthorizationProfile | {name, vlan, daclName, accessType, reauth}'
curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/ers/config/authorizationprofile?size=100" \
-H "Accept: application/json" \
| jq -r '
["NAME","ID"],
(.SearchResult.resources[] | [.name, .id]) | @tsv
' | column -ts $'\t'
curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/ers/config/authorizationprofile?size=100" \
-H "Accept: application/json" \
| jq -r '.SearchResult.resources[].id' | while read -r ID; do
curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/ers/config/authorizationprofile/${ID}" \
-H "Accept: application/json" \
| jq -r '.AuthorizationProfile | [.name, (.vlan.nameID // "default"), (.daclName // "none")] | @tsv'
done | column -ts $'\t'
|
ISE ERS API design: The list endpoint ( |
Authorization Rules β Read
Authorization rules within a policy set are evaluated top-down by rank. First match wins.
POLICY_SET_ID="056a2880-5821-465f-adb2-90c32de0b06f"
curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/api/v1/policy/network-access/policy-set/${POLICY_SET_ID}/authorization" \
-H "Accept: application/json" \
| jq '.response[0]'
curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/api/v1/policy/network-access/policy-set/${POLICY_SET_ID}/authorization" \
-H "Accept: application/json" \
| jq -r '
["RANK","NAME","PROFILE","HITS","STATE"],
(.response[] | [.rule.rank, .rule.name, (.profile[0] // "none"), .rule.hitCounts, .rule.state]) | @tsv
' | column -ts $'\t'
curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/api/v1/policy/network-access/policy-set/${POLICY_SET_ID}/authorization" \
-H "Accept: application/json" \
| jq -r '.response[] | [
.rule.rank,
.rule.name,
(.profile[0] // "none"),
.rule.hitCounts,
([.rule.condition | recurse(.children[]?) | select(.attributeValue?) |
"\(.attributeName)=\(.attributeValue)"] | join(" AND "))
] | @tsv' | column -ts $'\t'
Authorization Rules β Create
Compound AND condition (multiple match criteria)
curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/api/v1/policy/network-access/policy-set/${POLICY_SET_ID}/authorization" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-X POST \
-d '{
"rule": {
"name": "Domus_Cert_Admin_P16g",
"rank": 0,
"state": "enabled",
"condition": {
"conditionType": "ConditionAndBlock",
"isNegate": false,
"children": [
{
"conditionType": "ConditionAttributes",
"isNegate": false,
"dictionaryName": "Network Access",
"attributeName": "EapAuthentication",
"operator": "equals",
"attributeValue": "EAP-TLS"
},
{
"conditionType": "ConditionAttributes",
"isNegate": false,
"dictionaryName": "CERTIFICATE",
"attributeName": "Subject - Common Name",
"operator": "contains",
"attributeValue": "p16g"
}
]
}
},
"profile": ["Domus_Admin_Profile"]
}' | jq '.'
Single condition (simpler rules)
curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/api/v1/policy/network-access/policy-set/${POLICY_SET_ID}/authorization" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-X POST \
-d '{
"rule": {
"name": "EAP_TLS_Basic_Permit",
"rank": 10,
"state": "enabled",
"condition": {
"conditionType": "ConditionAttributes",
"isNegate": false,
"dictionaryName": "Network Access",
"attributeName": "EapAuthentication",
"operator": "equals",
"attributeValue": "EAP-TLS"
}
},
"profile": ["PermitAccess"]
}' | jq '.'
|
Condition types:
Operators: |
Verify after creation
curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/api/v1/policy/network-access/policy-set/${POLICY_SET_ID}/authorization" \
-H "Accept: application/json" \
| jq '.response[] | select(.rule.name | test("P16g")) | {
name: .rule.name,
rank: .rule.rank,
state: .rule.state,
profile: .profile,
conditions: [.rule.condition.children[] | {dict: .dictionaryName, attr: .attributeName, op: .operator, val: .attributeValue}]
}'
Authorization Rules β Update
Update requires the rule UUID. Get it from the rule listing.
RULE_ID=$(curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/api/v1/policy/network-access/policy-set/${POLICY_SET_ID}/authorization" \
-H "Accept: application/json" \
| jq -r '.response[] | select(.rule.name == "Domus_Cert_Admin_P16g") | .rule.id')
echo "Rule ID: ${RULE_ID}"
curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/api/v1/policy/network-access/policy-set/${POLICY_SET_ID}/authorization/${RULE_ID}" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-X PUT \
-d "{
\"rule\": {\"state\": \"disabled\"}
}" | jq '.response.rule | {name, state}'
Authorization Rules β Delete
curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/api/v1/policy/network-access/policy-set/${POLICY_SET_ID}/authorization/${RULE_ID}" \
-H "Accept: application/json" \
-X DELETE | jq '.'
Endpoint Management
Endpoints can be blocked by ISE’s anti-RADIUS-spray protection. Failed auth attempts during configuration cause the MAC to be rejected β every subsequent attempt fails silently.
curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/ers/config/rejectedendpoint" \
-H "Accept: application/json" \
| jq -r '
["MAC","ID"],
(.SearchResult.resources[] | [.name, .id]) | @tsv
' | column -ts $'\t'
ENDPOINT_ID=$(curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/ers/config/rejectedendpoint" \
-H "Accept: application/json" \
| jq -r '.SearchResult.resources[] | select(.name == "A8:2B:DD:8F:23:E6") | .id')
curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/ers/config/rejectedendpoint/${ENDPOINT_ID}" \
-H "Accept: application/json" \
-X DELETE | jq '.'
DataConnect (Database Analytics)
DataConnect provides direct Oracle database access to ISE operational data β RADIUS authentication logs, active sessions, TACACS+ commands. This is not a REST API β it uses JDBC over TLS (port 2484, service cpm10). Use netapi ise dc commands.
netapi ise dc auth-history a8:2b:dd:8f:23:e6 --hours 1
netapi ise dc auth-failures --hours 1
netapi ise dc query "
SELECT mac_address, authentication_method, passed, timestamp
FROM radius_authentications
WHERE timestamp > SYSDATE - 1
ORDER BY timestamp DESC
"
netapi ise dc tacacs-auth --hours 24
netapi ise dc tacacs-commands --hours 24
|
DataConnect environment variables: |
MnT (Monitoring and Troubleshooting)
MnT provides real-time session data via REST/XML. Uses ERS credentials (ISE_MNT_USER/ISE_MNT_PASS, falls back to ISE_API_USER/ISE_API_PASS). Host: ISE_MNT_FQDN or ISE_PAN_FQDN.
netapi ise mnt session a8:2b:dd:8f:23:e6
netapi ise mnt sessions -d
curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/admin/API/mnt/Session/ActiveList" \
-H "Accept: application/xml"
curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/admin/API/mnt/Session/MACAddress/A8:2B:DD:8F:23:E6" \
-H "Accept: application/xml"
|
MnT returns XML, not JSON. |
pxGrid (Real-Time Event Streaming)
pxGrid 2.0 uses WebSocket over mTLS (port 8910). Certificate-based authentication β no username/password. Requires client cert registration with ISE.
Environment variables: ISE_PXGRID_FQDN, ISE_PXGRID_CERT, ISE_PXGRID_KEY, ISE_PXGRID_CA.
netapi ise pxgrid sessions
netapi ise pxgrid anc-policies
netapi ise pxgrid anc-apply --mac A8:2B:DD:8F:23:E6 --policy Quarantine
netapi ise pxgrid anc-clear --mac A8:2B:DD:8F:23:E6
|
pxGrid is not curl-friendly β it requires WebSocket upgrade, mTLS handshake, and STOMP protocol framing. Use |
Dictionaries and Attributes
ISE conditions reference dictionaries and attributes. Use these to discover valid condition parameters.
curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/api/v1/policy/network-access/dictionaries" \
-H "Accept: application/json" \
| jq -r '.response[] | .name' | sort
curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/api/v1/policy/network-access/dictionaries/CERTIFICATE" \
-H "Accept: application/json" \
| jq -r '
["ATTRIBUTE","TYPE"],
(.response.attributes[] | [.name, .dataType]) | @tsv
' | column -ts $'\t'
Common certificate attributes for EAP-TLS
| Dictionary | Attribute | Use |
|---|---|---|
|
|
Match EAP method ( |
|
|
Match cert CN (hostname identity) |
|
|
Match cert O field (org grouping) |
|
|
Match cert OU field (admin vs user role) |
|
|
Match issuing CA (trust validation) |
|
|
Match tunnel type ( |
|
|
TEAP chaining result (user + machine) |
jq Patterns for ISE Policy Analysis
Searching and filtering
curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/api/v1/policy/network-access/policy-set/${POLICY_SET_ID}/authorization" \
-H "Accept: application/json" \
| jq '.response[] | select(
.rule.condition | recurse(.children[]?) | select(.attributeValue? | test("p16g"; "i"))
) | {name: .rule.name, rank: .rule.rank, profile: .profile[0]}'
curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/api/v1/policy/network-access/policy-set/${POLICY_SET_ID}/authorization" \
-H "Accept: application/json" \
| jq '.response[] | select(
.profile[] | test("Admin")
) | {name: .rule.name, rank: .rule.rank, hits: .rule.hitCounts}'
Extracting conditions
curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/api/v1/policy/network-access/policy-set/${POLICY_SET_ID}/authorization" \
-H "Accept: application/json" \
| jq '.response[] | {
rule: .rule.name,
cert_conditions: [
.rule.condition | recurse(.children[]?) |
select(.dictionaryName? == "CERTIFICATE") |
{attr: .attributeName, op: .operator, val: .attributeValue}
]
} | select(.cert_conditions | length > 0)'
|
jq |
DACLs (Downloadable ACLs)
curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/ers/config/downloadableacl?size=100" \
-H "Accept: application/json" \
| jq -r '
["NAME","ID"],
(.SearchResult.resources[] | [.name, .id]) | @tsv
' | column -ts $'\t'
curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/ers/config/downloadableacl/name/DACL_ADMIN_FULL" \
-H "Accept: application/json" \
| jq '.DownloadableAcl | {name, dacl, daclType}'
Network Access Devices (NADs)
curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/ers/config/networkdevice?size=100" \
-H "Accept: application/json" \
| jq -r '
["NAME","ID"],
(.SearchResult.resources[] | [.name, .id]) | @tsv
' | column -ts $'\t'
curl -s --cacert "${ISE_CA_CERT/#\~/$HOME}" -u "${ISE_API_USER}:${ISE_API_PASS}" \
"https://${ISE_PAN_FQDN}/ers/config/networkdevice/name/LAB-3560CX-01" \
-H "Accept: application/json" \
| jq '.NetworkDevice | {name, description, profileName, NetworkDeviceIPList}'