Error Code Reference
HTTP Status Codes
HTTP Status Codes
| Code | Meaning | Action |
|---|---|---|
2xx Success |
||
200 |
OK - Request successful |
Parse response body |
201 |
Created - Resource created |
Check Location header for new resource URL |
204 |
No Content - Delete successful |
No body returned |
4xx Client Errors |
||
400 |
Bad Request - Invalid syntax |
Check JSON format, required fields |
401 |
Unauthorized - Auth failed |
Verify credentials, check ERS Admin role |
403 |
Forbidden - No permission |
User lacks required RBAC permissions |
404 |
Not Found - Resource missing |
Verify ID/name, check resource exists |
405 |
Method Not Allowed |
Check HTTP method (GET/POST/PUT/DELETE) |
409 |
Conflict - Already exists |
Use PUT to update, or DELETE first |
415 |
Unsupported Media Type |
Add Content-Type: application/json header |
422 |
Unprocessable Entity |
Valid JSON but semantic error (e.g., invalid MAC format) |
429 |
Too Many Requests |
Rate limited - wait and retry |
5xx Server Errors |
||
500 |
Internal Server Error |
Check ISE logs, retry later |
502 |
Bad Gateway |
ISE service issue, check node health |
503 |
Service Unavailable |
ISE overloaded or in maintenance |
504 |
Gateway Timeout |
Request too slow, increase timeout or paginate |
ERS API Errors
Common Error Response
{
"ERSResponse": {
"operation": "POST-create",
"messages": [
{
"title": "Error message here",
"type": "ERROR",
"code": "Application error code"
}
],
"link": {
"rel": "related",
"href": "https://ise:9060/ers/config/endpoint",
"type": "application/xml"
}
}
}
ERS Error Codes
| Code | Message | Resolution |
|---|---|---|
|
Resource not found |
Verify ID/name exists, check spelling |
|
Resource already exists |
Use PUT to update, or DELETE first |
|
Invalid input data |
Check required fields, data formats |
|
Invalid MAC address format |
Use |
|
Invalid group ID |
Verify group exists: |
|
Database constraint violated |
Check foreign key references exist |
|
User not authorized |
Verify ERS Admin role assigned |
|
Internal server error |
Check ISE logs, retry later |
OpenAPI v1 Errors
Common Error Response
{
"response": {
"code": 400,
"message": "Error description here"
},
"version": "1.0.0"
}
OpenAPI Error Codes
| Code | Message | Resolution |
|---|---|---|
|
Policy set not found |
Verify policy set ID exists |
|
Invalid condition syntax |
Check condition format and dictionary references |
|
Rule conflicts with existing rule |
Check rule rank/priority, remove conflicts |
|
Dictionary attribute not found |
Verify dictionary and attribute names |
|
Authorization profile not found |
Create profile first via ERS API |
MnT API Errors
MnT returns XML responses:
<error>
<code>404</code>
<message>Session not found</message>
</error>
MnT Error Codes
| Code | Message | Resolution |
|---|---|---|
|
No active session for MAC |
Verify endpoint is authenticated |
|
Invalid MAC address format |
Use consistent format (colons or dashes) |
|
CoA operation failed |
Check NAS connectivity, verify session exists |
|
MnT node unavailable |
Check MnT node health, try different node |
DataConnect Errors
pxGrid Errors
Connection Errors
| Code | Message | Resolution |
|---|---|---|
|
Client certificate pending approval |
Approve in ISE > pxGrid Services > Clients |
|
Client certificate revoked |
Generate new certificate, re-approve |
|
pxGrid service unavailable |
Check pxGrid node health |
|
Not authorized for topic |
Verify pxGrid permissions |
Error Handling Patterns
Error Handling
Check HTTP Status
# Capture both body and status code
response=$(curl -sk -w "\n%{http_code}" -u "${ISE_AUTH}" \
"${BASE_URL}/endpoint/nonexistent" \
-H "Accept: application/json")
http_code=$(echo "$response" | tail -1)
body=$(echo "$response" | sed '$d')
if [[ "$http_code" -ge 200 && "$http_code" -lt 300 ]]; then
echo "Success: $body" | jq .
else
echo "Error HTTP $http_code:" >&2
echo "$body" | jq -r '.ERSResponse.messages[0].title // .message // .' >&2
exit 1
fi
Parse ERS Errors
# Extract ERS error message
jq -r '.ERSResponse.messages[0].title // "Unknown error"'
# Full error details
jq '.ERSResponse.messages[]'
Parse OpenAPI Errors
# Extract OpenAPI error
jq -r '.response.message // .message // "Unknown error"'
Retry Logic
# Retry with exponential backoff
retry_request() {
local max_attempts=3
local delay=1
for ((i=1; i<=max_attempts; i++)); do
response=$(curl -sk -w "\n%{http_code}" "$@")
http_code=$(echo "$response" | tail -1)
if [[ "$http_code" -lt 500 ]]; then
echo "$response" | sed '$d'
return 0
fi
echo "Attempt $i failed (HTTP $http_code), retrying in ${delay}s..." >&2
sleep "$delay"
((delay*=2))
done
echo "All attempts failed" >&2
return 1
}
Python Pattern
import requests
from requests.auth import HTTPBasicAuth
def ise_api_call(method, endpoint, data=None):
url = f"https://{ISE_HOST}:9060/ers/config/{endpoint}"
auth = HTTPBasicAuth(ISE_USER, ISE_PASS)
headers = {"Accept": "application/json", "Content-Type": "application/json"}
try:
response = requests.request(method, url, auth=auth, headers=headers, json=data, verify=False)
response.raise_for_status()
return response.json()
except requests.exceptions.HTTPError as e:
error_msg = response.json().get("ERSResponse", {}).get("messages", [{}])[0].get("title", str(e))
raise Exception(f"ISE API Error: {error_msg}")