CiscoSE · Catalyst Center API field guide for customers integrating with other systems
Field guide · Release 3.3.1 (with 3.1.6 and 2.3.7.x deltas)
Cisco Catalyst Center API
A working reference for integrating Cisco Catalyst Center (formerly DNA Center) with other systems: how a call is served, which endpoint answers which question, how to automate safely in SD-Access (Software-Defined Access) and non-fabric networks, what is deprecated, and how to put AI agents on top through MCP (Model Context Protocol).
3 + 1path families: intent, data, system; campus from 3.3
500records per page on the operations checked
1 htoken lifetime per the API reference
Stops at the controllerWrites config (async)Reaches the device
Foundations
Overview and the four interfaces
Catalyst Center exposes a northbound REST (Representational State Transfer) API over HTTPS with JSON bodies, called the Intent API. Around it sit an eastbound event channel, a westbound ITSM (IT Service Management) integration, and a southbound multivendor SDK (Software Development Kit) that Cisco has deprecated. Every call goes to https://<cluster> plus a path prefix.
Figure 0. The three live integration directions. Third-party devices are now added through SNMP (Simple Network Management Protocol) MIB-II and get inventory, topology and reachability only.
Prefix
Serves
Example
/dna/intent/api/v1/ (v2)
Automation and inventory: sites, devices, provisioning, SD-Access, wireless, templates, events
GET /dna/intent/api/v1/network-device
/dna/data/api/v1/
Assurance analytics: query, count, trend, top-N, energy
POST /dna/data/api/v1/assuranceEvents/query
/dna/system/api/v1/ (v2)
Platform: authentication, users and roles, backup and restore, system upgrade
POST /dna/system/api/v1/auth/token
/dna/campus/api/v1/
New in the 3.3.x Platform User Guide (campus networks)
POST /dna/campus/api/v1/networks
Naming shifted in 2.3.7: older operations use hyphenated singular paths (/network-device); newer ones use camelCase collections with /count and /query siblings (/networkDevices, /networkDevices/query). Prefer the newer form; the older ones are the usual deprecation candidates.
Foundations
Where a call stops
Most reads are answered from the controller's own stores and never touch a device. Writes and live CLI (command-line interface) queries become tasks, and only tasks reach devices. Cost, freshness and safety all follow from which path you hit.
Trace a call type through the diagram
Pick a call type to light up the path it takes.
Figure 1. A teaching model built from documented API behaviour; Cisco does not publish this as a single diagram. Solid paths are safe to schedule; the dashed amber path is on demand.
Inventory and design DB
Sites, settings, devices, configuration archive. Paged with offset/limit (max 500).
Freshness: last device sync. Periodic resync minimum is 6 hours from 3.1.5, plus event-driven updates.
Assurance data
Health scores, issues, events, analytics. Intent health endpoints plus /dna/data query and trend operations.
Freshness: telemetry ingest from devices (SNMP, syslog, NetFlow, streaming telemetry).
Task engine
Provisioning, SWIM (Software Image Management), discovery, Command Runner. Returns 202 with a taskId.
Freshness: the result exists only once endTime is set.
Live simulation: a day of API traffic
The same three stores, running. Devices stream telemetry into Assurance without any API call. Your dashboard polls every five minutes, a CMDB (configuration management database) sync pages through inventory nightly, and webhooks leave the event engine without touching the API gateway. Trigger a Command Runner job or a 60-call bulk script to see the default limit of 50 calls per minute reject the overflow with HTTP 429.
Day 1 08:00
device telemetry and resync (no API call)read callwrite or taskevent or webhook429 rejected
Figure 1b. Teaching simulation; timings are compressed and call counts are representative, not measured. The rate limit is shared by every client using the same account, so a runaway script also starves your dashboard.
Foundations
Authentication and RBAC
Authenticate once with HTTP Basic (RFC 7617), then send the returned JWT (JSON Web Token) in X-Auth-Token on every call for up to one hour. Every call is then checked against the caller's RBAC (Role-Based Access Control) role.
All steps shown
Figure 2. One login per hour. An expired token returns 401; re-authenticate once and retry. Step through to see each request and response.
Item
Detail
Token endpoint
POST /dna/system/api/v1/auth/token with Basic credentials; response {"Token": "..."}
Header
X-Auth-Token: <token> plus Content-Type: application/json
Lifetime
1 hour per the Authentication API specification. The 3.3.x Platform User Guide's API prerequisites page states 60 seconds. Treat the lifetime as unreliable: cache the token, and re-authenticate on any 401.
Code previews
Developer Toolkit generates code in Shell, Node, Python, Ruby, JavaScript, jQuery, PHP, Go and Ansible. Generated Python needs the requests library.
Optional AES mode
If enabled in system configuration, the Authorization header carries a Base64-encoded 256-bit AES (Advanced Encryption Standard) key instead of Basic credentials.
RBAC
Use RBAC v2 roles (/dna/system/api/v2/roles) and access groups (/dna/system/api/v1/accessGroups) from 3.1.5; v1 role operations are Sunset.
Getting a token for testing
Platform > Developer Toolkit > Authentication > Authentication API > Try, or Postman / Bruno with Basic auth. Cisco's tech note sets the token once as a collection-level header.
Service accounts
Cisco's lab examples use a SUPER-ADMIN login; in production use one account per integration. Observer role for read-only collectors and MCP; a narrow custom role for writers.
TLS (Transport Layer Security)
Labs disable verification for self-signed certificates; in production import the cluster CA (Certificate Authority) and keep verification on.
Python · minimal client used by every example in this guide
# catalyst_client.py: token cache, 401 re-auth, 429 backoff, task poller, pager
import json, time, requests
from requests.auth import HTTPBasicAuth
class CatalystCenter:
def __init__(self, host, user, password, verify=True):
self.base = f"https://{host}"
self.s = requests.Session(); self.s.verify = verify
self.auth = HTTPBasicAuth(user, password); self.exp = 0
def _login(self):
r = self.s.post(f"{self.base}/dna/system/api/v1/auth/token", auth=self.auth)
r.raise_for_status()
self.s.headers.update({"X-Auth-Token": r.json()["Token"],
"Content-Type": "application/json"})
self.exp = time.time() + 55 * 60 # token lives 60 min
def call(self, method, path, **kw):
if time.time() > self.exp:
self._login()
delay, relogged = 2, False
for _ in range(6):
r = self.s.request(method, self.base + path, **kw)
if r.status_code == 401 and not relogged:
self._login(); relogged = True; continue
if r.status_code in (429, 503): # no rate-limit headers: back off
time.sleep(delay); delay = min(delay * 2, 60); continue
r.raise_for_status()
return r.json() if r.content else {}
raise RuntimeError(f"gave up: {method} {path}")
def wait_task(self, task_id, timeout=900, every=5):
t0 = time.time()
while time.time() - t0 < timeout:
t = self.call("GET", f"/dna/intent/api/v1/task/{task_id}")["response"]
if t.get("endTime"):
if t.get("isError"):
raise RuntimeError(t.get("failureReason"))
return t
time.sleep(every)
raise TimeoutError(task_id)
def pages(self, path, params=None, limit=500):
offset = 1 # offset is 1-based
while True:
rows = self.call("GET", path, params={**(params or {}),
"offset": offset, "limit": limit})["response"]
yield from rows
if len(rows) < limit:
return
offset += limit
Foundations
Async tasks, pagination, rate limits
Every write is a task
A 202 Accepted means the request was queued, not that it worked. Poll the task until endTime is set and check isError. Orchestration (business) APIs such as SD-Access return executionId and executionStatusUrl instead; poll /dna/intent/api/v1/dnacaap/management/execution-status/{executionId}.
All steps shown
Figure 3. The asynchronous pattern. Tasks that produce a file (Command Runner, config export) carry a fileId in progress.
Pagination and filtering
Rule
Detail
Page size
limit 1 to 500 on the list operations checked (for example validation workflows, SD-Access virtual networks). Not a global rule: read each operation's limit.
Offset
offset is 1-based. Loop until a page returns fewer than limit rows.
Size first
Call the matching /count operation to size a job.
Complex filters
Prefer POST …/query operations for filters, sorting and aggregation.
Known issue
3.2.3 release notes: repeated calls with the same limit and offset can return different site IDs; a documented sort parameter was reported unsupported. Sort client-side and de-duplicate by ID.
Rate limits
Source
What it says
OpenAPI specs on DevNet
Per operation: many show 100 requests per minute, some 50 per minute
Platform User Guide 3.2.x and 3.3.x
"The intent APIs have a default API rate limit of 50 requests" (no time window stated); per-operation limits are on the Features tab in Platform > Developer Toolkit > APIs
Python SDK
Waits and retries on 429 by default (CATALYST_CENTER_WAIT_ON_RATE_LIMIT)
Headers
No rate-limit response headers are documented. Treat 429 as normal and back off.
Rate-limit budget calculator
Default 50 per the Platform User Guide; read the real limit on each operation's Features tab. Per-record detail calls are what usually blow the budget.
Automate
Sites and network settings Writes config (async)
From 2.3.7.6 the site hierarchy and per-site settings moved to a new resource model. Build a site in five steps; the first three only change design intent in the controller, the last two reach devices.
Figure 4. Day-0 site build. Each step returns a task to poll before the next one.
Endpoint
Function
Use case
/dna/intent/api/v1/sites, GET /sites/{id} (3.1.6)
Site hierarchy: areas, buildings, floors
Site-as-code, CMDB location sync
GET /sites?nameHierarchy=Global/Area/Building, then POST /dna/intent/api/v2/floors
Resolve the parent ID by name, then create the child (pattern from Cisco tech note 226435)
Create floors under an existing building
PUT /sites/{id}/aaaSettings, dnsSettings, dhcpSettings, ntpSettings, timeZoneSettings, bannerSettings, telemetrySettings
Per-site network settings with inheritance
Standard settings per region
PUT /sites/{id}/deviceCredentials, …/deviceCredentials/apply
Credentials per site and sync to devices
Credential rotation
POST /dna/intent/api/v1/networkDevices/assignToSite/apply
Scan ranges, CDP or LLDP (Cisco / Link Layer Discovery Protocol)
PnP device, workflow and settings operations
Zero-touch claim of new devices
Greenfield branch and closet rollouts
PUT /networkDevices/resyncIntervalSettings
Global resync interval (minimum 6 hours from 3.1.5)
Do not lower; event-driven sync keeps data current
Device Replacement operations
RMA (Return Merchandise Authorization) workflow
Swap a failed device with its config, image and license
Automate
Templates and provisioning Writes config (async)Reaches the device
Configuration templates (CLI or Velocity/Jinja) are the main way to push custom configuration in both fabric and non-fabric networks. The safe sequence is author, version, preview, then deploy.
Create a project and template in Template Programmer
Commit a version (deployments use committed versions)
Preview the rendered config for one device
Deploy to devices or by site; get a task
Poll the task, then run compliance
Endpoint family
Function
GET /dna/intent/api/v2/template-programmer/project
Find projects and template IDs
POST /dna/intent/api/v1/template-programmer/template/deploy
Deploy a committed template; returns a deployment ID
GET /dna/intent/api/v1/template-programmer/template/deploy/status/{deploymentId}
Poll deployment status until it reports success or failure
Network profiles and site assignment
Bind templates to sites through profiles so new devices inherit them
Wired and wireless provisioning operations
Assign a device to a site and push the site's intent
Template deployment is tracked by a deployment ID and its own status endpoint, not by the generic task API. Template variables are usually filled from a CMDB or IPAM record. Keep templates idempotent and avoid lines that the controller's own intent also writes, or compliance will flag drift.
Automate
Software images (SWIM) Writes config (async)Reaches the device
From 3.1.3, SWIM moved to the networkDeviceImages family with readiness checks, custom validations and bulk operations. The v1 image/distribution and image/activation/device operations are Sunset.
All steps shown
Figure 5. An upgrade wave gated by change approval. Distribution and activation are separate tasks so activation can wait for the maintenance window.
Endpoint
Function
GET /dna/intent/api/v1/networkDeviceImages, /count
Devices with image details and golden-image status
POST …/networkDeviceImages/{id}/readinessChecks
Pre-upgrade readiness for one device
…/networkDeviceImages/validations
Custom pre and post checks (show commands per product series)
POST …/distribute/bulk, …/activate/bulk
Bulk distribute and activate; each returns a task
GET …/networkDeviceImages/validationResults
Pre and post validation results
/dna/intent/api/v1/productSeries
Product series used to scope golden images and validations
Python · upgrade wave skeleton
# 1. Who is off the golden image? 2. readiness 3. bulk distribute 4. bulk activate
offenders = list(cc.pages("/dna/intent/api/v1/networkDeviceImages"))
for dev in offenders:
cc.call("POST", f"/dna/intent/api/v1/networkDeviceImages/{dev['id']}/readinessChecks")
# Build the bulk body from the operation schema for your release
t = cc.call("POST", "/dna/intent/api/v1/networkDeviceImages/distribute/bulk", json=dist_body)
cc.wait_task(t["response"]["taskId"], timeout=3600)
# ...change window opens...
t = cc.call("POST", "/dna/intent/api/v1/networkDeviceImages/activate/bulk", json=act_body)
cc.wait_task(t["response"]["taskId"], timeout=5400)
results = cc.call("GET", "/dna/intent/api/v1/networkDeviceImages/validationResults")
Automate
Fabric vs non-fabric: same API?
Yes for the platform, no for the overlay. Authentication, sites and settings, inventory, discovery, PnP, templates, SWIM, compliance, Assurance and events are the same operations in both. SD-Access adds its own domains for the fabric overlay, and wireless splits into a non-fabric and a fabric family.
Area
Non-fabric (traditional campus)
SD-Access fabric
Platform, auth, RBAC, tasks
Same
Same
Sites, settings, IP pools
Same /sites and /ipam model
Same, plus pools bound to virtual networks
Inventory, discovery, PnP, SWIM, compliance
Same
Same
Templates
Primary way to configure VLANs, uplinks, policies
Used for day-N extras; avoid lines the fabric intent owns
Overlay and segmentation
VLANs and ACLs (Access Control Lists) through templates
LAN Automation (/lanAutomation) or manual underlay
Wireless
Wireless domain: SSIDs (Service Set Identifiers), wireless and RF (Radio Frequency) profiles, WLC (Wireless LAN Controller) provisioning
Fabric Wireless domain: VLAN-to-SSID mapping (/sda/fabrics/{id}/vlanToSsids) on top of the wireless profiles
Policy
Application QoS (Quality of Service) policy
Group-based policy with ISE (Identity Services Engine) scalable groups, plus application policy
Assurance
Device, client, application health
Same, plus fabric-specific health and issues
Automate
SD-Access fabric Writes config (async)Reaches the device
Use the /dna/intent/api/v1/sda/... family. The older /business/sda/... operations (fabric, fabric-site, edge, border, control-plane device, virtual network, multicast) are deprecated.
Figure 6. Fabric build order. Each step depends on the previous one existing.
Endpoint
Function
/sda/fabricSites
Create, update, delete fabric sites
/sda/layer3VirtualNetworks
Layer 3 virtual networks (VRF-based segments)
/sda/anycastGateways
Anycast gateways: pool plus VN (Virtual Network) per fabric site
/sda/fabricDevices
Assign border, control-plane and edge roles; border handoff settings
Before scripting a role, check the device and release in the SD-Access compatibility matrix (see Compatibility matrix). Example from the matrix: C9350 in the edge role needs its control-plane node on IOS XE 17.18.5 and does not support IPv6.
GET /wirelessControllers/{deviceId}/siteTags (3.1.6)
Site tags on a controller
On IOS XE 17.18.2 and later, 802.11be ofdma* and muMimo* parameters are ignored at provisioning. 3.3.1 removed fields from wireless PDC and MDC operations; retest wireless automation after upgrading.
Observe
How to choose
Pick the API family by the question, not by the endpoint you already know.
Answer two questions
Figure 7. Fleet-wide and historical questions stay on the controller; only the one-device-now case reaches a device.
Observe
Customer questions to endpoints
NOC (Network Operations Center), helpdesk and security teams ask in business terms. This table maps the question to the scalable endpoint and to the heavier troubleshooting-only alternative.
Question
Scalable endpoint (safe to schedule)
Troubleshooting only
What devices do we have, and are they reachable?
POST /networkDevices/query
—
How healthy is each site?
GET /dna/intent/api/v1/site-health
—
How healthy is each device tier?
GET /dna/intent/api/v1/network-health
Command Runner on one device
How are clients doing?
GET /dna/intent/api/v1/client-health
GET /client-detail?macAddress=
What issues are open, and where?
GET /dna/intent/api/v1/issues
—
What happened in the last 24 hours?
POST /dna/data/api/v1/assuranceEvents/query
—
Which devices are exposed to a PSIRT advisory?
GET /securityAdvisories/results/networkDevices
—
Which devices are out of compliance, and why?
GET /compliance + /compliance/networkDevices/{id}/detail/policys
—
Which devices are not on the golden image?
GET /networkDeviceImages
—
What did the config look like last week?
GET /networkDeviceConfigFiles
—
What does this device show right now?
—
POST /network-device-poller/cli/read-request
Why can host A not reach host B?
—
Path Trace (/pathTraces from 3.2.2; /flow-analysis before)
How much power is the network using?
/dna/data/api/v1/energy/... (3.1.3)
—
PSIRT is Cisco's Product Security Incident Response Team. Push beats poll: subscribe to issue and event webhooks instead of looping on /issues.
Observe
Health, issues and Assurance events Stops at the controller
Endpoint
Returns
Use case
GET /site-health, /network-health, /client-health
Health scores by site, device tier, client type
NOC dashboards, every 5 to 15 minutes
GET /dna/intent/api/v1/issues; custom issue definitions
Open issues with priority and site
Ticketing, triage queues
/dna/data/api/v1/assuranceEvents, /count, /query
Raw Assurance events with filters
Reconcile missed webhooks, forensics
POST /dna/data/api/v1/…/trendAnalytics, summaryAnalytics
Server-side aggregation over time
SLA (Service-Level Agreement) and capacity reports
When a subscribed event fires, Catalyst Center makes an HTTP POST or PUT to your listener with a JSON payload. Destinations can be REST webhook, email, syslog, SNMP trap or Webex (listed in the 3.3.x Platform User Guide), plus ITSM. Event definitions are fixed and cannot be edited.
All steps shown
Figure 8. Webhooks are the primary path; the hourly Assurance events query reconciles anything missed.
Python · register a webhook, subscribe, reconcile
# Illustrative payloads: confirm field names in Platform > Developer Toolkit > APIs
hook = cc.call("POST", "/dna/intent/api/v1/event/webhook", json={
"name": "noc-listener", "description": "NOC event intake",
"url": "https://hooks.example.com/catc", "method": "POST",
"trustCert": True})
cc.call("POST", "/dna/intent/api/v1/event/subscription/rest", json=[{
"name": "network-device-unreachable",
"subscriptionEndpoints": [{"instanceId": WEBHOOK_ID,
"subscriptionDetails": {"connectorType": "REST"}}],
"filter": {"eventIds": ["NETWORK-DEVICES-3-506"]}}])
# Hourly reconcile: pull what the webhook may have missed
events = cc.call("GET", "/dna/data/api/v1/assuranceEvents",
params={"deviceFamily": "Switches and Hubs",
"startTime": int((time.time() - 3600) * 1000)})
Cisco's stated practice: confirm HTTP/HTTPS reachability from the cluster to your listener before subscribing. An HTTP/S proxy can be set for outbound notifications. The event ID above is an example; pick IDs from Platform > Developer Toolkit > Event Notifications > Event Catalog.
Observe
Troubleshooting tools Reaches the device
Command Runner runs read-only CLI commands on devices; Path Trace (POST /pathTraces from 3.2.2, POST /flow-analysis earlier) analyses the path between two endpoints. Both are tasks that reach devices: run them for one device or flow, on demand, never on a schedule.
All steps shown
Figure 9. Command Runner round trip. The output lands in a file you fetch by fileId.
Python · Command Runner
cc = CatalystCenter("catc.example.com", "svc-api", "***")
ids = [d["id"] for d in cc.pages("/dna/intent/api/v1/network-device",
{"platformId": "C9300-48P"})]
job = cc.call("POST", "/dna/intent/api/v1/network-device-poller/cli/read-request",
json={"commands": ["show version", "show ip int brief"],
"deviceUuids": ids[:10], "timeout": 0})
task = cc.wait_task(job["response"]["taskId"])
file_id = json.loads(task["progress"])["fileId"]
output = cc.call("GET", f"/dna/intent/api/v1/file/{file_id}")
Use when
An engineer is investigating one device or a handful
Cached inventory or Assurance data cannot answer the question
Do not use
On a timer, in a loop, or across the whole fleet
For configuration changes (Command Runner is read-only)
Integrate
ITSM and ServiceNow
ITSM integration ships as pre-built bundles configured in the GUI. Add the ITSM instance at System > Settings > Destinations > ITSM, test connectivity, then enable bundles under Platform > Manage > Bundles.
Figure 10. Events land in ServiceNow import set tables; transform maps route them; the Cisco DNA App calls back for enrichment.
Bundle
What it does
Basic ServiceNow CMDB synchronization
Pushes inventory into CMDB (Configuration Management Database) CIs
Network Issue Monitor and Enrichment
Creates incidents from Assurance issues with network context
Automation (SWIM) events for ITSM
Change requests around image updates
Endpoint Attribute Retrieval
Endpoint data for profiling
Rogue and aWIPS
Rogue and adaptive Wireless Intrusion Prevention System events
Platform > Runtime Dashboard shows call counts and durations for the ServiceNow integration only. A "post to staging table" destination sends raw data to any REST endpoint for your own scripts.
Integrate
Integration playbooks
Six patterns cover most customer integrations. Each lists the flow in order and the most expensive mistake to avoid.
ITSM incident with context
Other system: ServiceNow, Jira Service Management
Issue or event webhook
ITSM creates the incident
ITSM calls /v2/device-enrichment-details and client/issue variants
Engineer works the ticket
Resolve issue in Catalyst Center
Use when
Turning Assurance issues into tickets with device and client context
Do not use
Polling /issues every minute
CMDB and asset sync
Other system: ServiceNow CMDB, NetBox
Nightly /networkDevices/query with /count
Page at 500
Enrich with EOX (end-of-life) and license data
Upsert into the CMDB
Events for changes between runs
Use when
The inventory of record lives outside Catalyst Center
Do not use
Real-time asset changes; use events
IPAM alignment
Other system: Infoblox, BlueCat, other IPAM
Read /ipam/globalIpAddressPools
Reconcile with IPAM blocks
Create site subpools with /ipam/siteIpAddressPools
Or configure Catalyst Center to use the external IPAM
Use when
Address plans are owned centrally
Do not use
The Sunset reserve-ip-subpool operations
Security posture report
Other system: SIEM (Security Information and Event Management), GRC (Governance, Risk and Compliance)
securityAdvisories results
fieldNotices and networkBugs results
compliance status
Weekly report or SIEM feed
Use when
Weekly risk and audit reporting
Do not use
Triggering scans in a tight loop
Upgrade pipeline
Other system: CI/CD (Continuous Integration / Continuous Delivery), change management
Readiness checks
Change approval gate
distribute/bulk
activate/bulk in window
Validation results attached to the change
Use when
Planned SWIM waves with pre and post checks
Do not use
v1 image/distribution and image/activation/device
Day-0 site as code
Other system: Terraform, Ansible, GitOps
/sites hierarchy
/sites/{id}/…Settings
IP pools
Discovery v2 or PnP
Provision; SD-Access: /sda/...
Use when
New sites from version-controlled definitions
Do not use
Legacy /site and /business/sda paths
Integrate
AI agents and MCP
Cisco's open-source Catalyst Center MCP server, in beta since August 2026, lets any MCP-capable AI client call generated Catalyst Center API tools. It runs inside your network, so data and the model can stay within an air-gapped boundary.
Figure 11. The MCP server authenticates as one account and adds no access control. RBAC on that account is the real limit.
When to use MCP vs the AI Assistant
Cisco's rule: use the in-product AI Assistant when the work starts in the Cisco product; use MCP when the work starts in a workflow you are building around it, such as a helpdesk tool, self-service portal, cross-vendor copilot, automated report or custom agent.
Use case
Who benefits
Example request
Ticket triage with network evidence
L1 (first-line) helpdesk
Is this one user, access point or location? Is the AP healthy? What belongs in the ticket?
End-user self-service
Employees
Check my Wi-Fi connection before I open a case
Inventory and health review
NOC
Summarize health for Global/San Jose; group POOR devices by role
Wireless experience investigation
Wireless team
Worst APs, SSIDs and clients at HQ over 24 hours, and next checks
Software and compliance risk review
Security and operations
Compliance issues, advisories, field notices, prioritized. Do not make any changes.
Cross-domain copilot
Platform teams
Combine Catalyst Center with Meraki, ITSM or other MCP servers in one agent
MCP best practices
It is not read-only by design. The README states the server adds no authorization layer, does not enforce read-only, and the catalog may include configuration-changing operations. Enforce read-only with an Observer-role account.
One dedicated, least-privilege account per deployment. Treat every connected client as able to call anything that account can.
Keep the endpoint private. Bind to 127.0.0.1; if shared, put it behind your gateway with authentication and TLS.
Keep certificate verification on (CATALYST_CENTER_VERIFY_SSL=true) except in labs.
Match the release branch to the controller and rebuild after each controller upgrade.
State the safety boundary in prompts ("read-only, do not change anything"). It is a backstop, not a control.
Mind rate limits. Agents chain many calls; the same per-operation limits and 500-row pages apply.
Choose the model deliberately. For regulated or air-gapped sites, pair the local server with an approved private model.
Log tool calls on your side. The controller sees only one service account.
Beta can change. Pin a commit and retest on updates.
Shell · run the official MCP server
# Run the official server on loopback with a read-only (Observer) account
git clone https://github.com/cisco-en-programmability/catc-mcp-oss && cd catc-mcp-oss
git checkout release/<M.N.P.Q> # match your Catalyst Center release
export CATALYST_CENTER_HOST="https://catalyst-center.example.com"
export CATALYST_CENTER_USERNAME="mcp-observer"
export CATALYST_CENTER_PASSWORD="***"
export CATALYST_CENTER_VERIFY_SSL=true
docker build -t catalyst-center-mcp:local .
docker run --rm -p 127.0.0.1:7001:7001 -e CATALYST_CENTER_HOST \
-e CATALYST_CENTER_USERNAME -e CATALYST_CENTER_PASSWORD \
-e CATALYST_CENTER_VERIFY_SSL catalyst-center-mcp:local
curl http://localhost:7001/v1/health # process up
# Claude Desktop: {"mcpServers": {"catalyst-center": {"url": "http://localhost:7001/v1/mcp"}}}
Companion: the DevNet Content Search MCP (https://devnet.cisco.com/v1/foundation-search-mcp/mcp) searches Catalyst Center and Meraki API documentation; it has no live network data. Community MCP servers exist but are not Cisco-supported.
Operate
Change prerequisites: fabric and non-fabric
Most failed API changes trace back to a device that was not in a clean state before the change. Gate every automated change on the checks below. Items marked "practice" are general engineering practice; the rest map to documented Catalyst Center features.
Before any change (both)
Check
How
Why
Controller backup is recent
GET /dna/system/api/v1/backups (3.1.3+)
Rollback point for the controller itself
Device config archived
GET /networkDeviceConfigFiles for target devices
Known-good config to compare and restore
Devices Managed and Reachable
POST /networkDevices/query: collection status Managed, reachability Reachable
Tasks against unmanaged or unreachable devices fail or hang
No open critical issues on targets
GET /issues filtered by site and priority
Do not change a device that is already degraded
Compliance is clean or understood
GET /compliance for targets
Separates new drift from existing drift
Release and device are supported
Compatibility matrix (next section)
Unsupported combinations fail in provisioning
Pre-checks captured
Network validation workflows (/diagnosticValidationWorkflows) or SWIM custom validations
Before/after comparison
Change approved, window set
ITSM change; POST /dna/intent/api/v1/networkDeviceMaintenanceSchedules
Practice: and audit trail
Right account
Narrow RBAC role scoped by access group
Limits blast radius of a script error
Pilot first
One site or a few devices, then waves
Practice
Additional checks for SD-Access
Check
Why
ISE (Identity Services Engine) integration healthy and trusted
Fabric sites, authentication profiles and group-based policy depend on it
Underlay ready: routing, MTU and loopbacks (LAN Automation or manual)
Fabric overlay rides on a working underlay
IP pools reserved at the site and mapped to the right virtual network
Anycast gateways need pool plus VN
Border, control-plane and edge roles fit the compatibility matrix for your release and IOS XE version
Role support differs by platform and version
Build in order: fabric site, VNs, gateways, devices, transits
Each object depends on the previous one (Figure 6)
Wait for each task or execution status before the next call
Fabric operations are orchestrated and long-running
Avoid template lines that overlap fabric-owned config
Templates and fabric intent will fight; compliance flags drift
Additional checks for non-fabric
Check
Why
Templates committed, versioned and previewed for one device
Catches variable and syntax errors before scale
Network profile binds the template to the right sites
New devices inherit the right config
VLAN, trunk and uplink changes staged to avoid cutting management access
Practice: a bad uplink change strands the device
Wireless: SSID, profile and WLC provisioning in that order; retest after upgrades
Wireless field changes in 3.1.6 and 3.3.1
After the change (both)
Task or execution status succeeded
Post-checks or validation results match pre-checks
Run compliance on targets
Site and device health unchanged or better
Close the change with evidence
Operate
Compatibility matrix
Cisco's Catalyst Center compatibility matrix lists which devices each release supports, with an SD-Access mode and a Non-Fabric mode, filters by device role (ISE, fabric edge, border and control plane, wireless, extended node), and an upgrade-path view. It is a web page with a JSON download, not an API.
What it tells an integrator
How to use it
Whether a device model supports a fabric role on a given release
Check before scripting /sda/fabricDevices assignments
Supported upgrade paths between Catalyst Center releases
Plan controller upgrades, then re-test integrations against the target release
Devices at Last Day of Support are removed
Those devices lose TAC (Technical Assistance Center) support; exclude them from automation scope
Third-party devices (RFC 1213 SNMP MIB-II) monitored from 2.3.7.x
Visibility only; no provisioning API for them
EoX scanning from 2.3.3.x for connected customers
Use the in-product EOX data for lifecycle reports
Platform caveats, e.g. C9350 edge needs control plane on IOS XE 17.18.5, no IPv6
Encode as pre-checks in fabric automation
Load the matrix's JSON download into your pipeline as a static gate, refreshed per release. Recommended device software versions come from the Cisco Software Download page.
Operate
Errors and resilience
Pick the status code you got
Figure 12. Retry only 401 (once), 429, 500 and 503. Surface other 4xx client errors immediately. Pick a status code above to highlight its branch.
Pick the symptom
Figure 13. When a task fails or a list comes back empty, separate a real failure from a filter or RBAC scope problem before touching code.
Symptom
Likely cause
Fix
202 but nothing changed
Task failed
Read the task's failureReason
401 mid-run
Token expired after 60 minutes
Cache the token, re-authenticate once
403 with a valid token
RBAC role or access group lacks the feature or site
Adjust the service account role
429
Per-operation rate limit
Back off 2 s to 60 s; serialize writes
Empty list
Wrong filter, 0-based offset, RBAC scope
Offset starts at 1; check access groups
Different rows on the same page
Known paging issue in 3.2.3
Sort client-side, de-duplicate by ID
Inventory looks stale
Resync is 6 hours minimum
Trust event-driven sync; do not force resync loops
Operate
2.3.7.x to 3.x deltas
2.3.7.x is the long-lived train many customers still run, and it received 2.3.7.10 in August 2025 alongside 3.1.x. An integration written on 2.3.7.x keeps working on 3.x except where it uses deprecated operations; the gains in 3.x are mostly new API families.
Capability
2.3.7.x
3.1.x and later
Action when upgrading
Sites and per-site settings (/sites, …Settings)
Yes, from 2.3.7.6
Yes; GET /sites/{id} added in 3.1.6
Move off legacy /site
IPAM pools (/ipam/...)
Yes
Yes; overlapping pools in 3.1.5
Move off reserve-ip-subpool
SD-Access /sda/... family
Yes
Yes; traffic steering in 3.1.6
Move off /business/sda
Assurance events /dna/data/.../assuranceEvents
Yes, from 2.3.7.6
Yes
—
Enrichment v2
2.3.7.10
Yes
—
SWIM v2 networkDeviceImages with bulk and validations
No
3.1.3
Rewrite upgrade pipelines; v1 is Sunset
Backup and restore APIs
No
3.1.3
Automate controller backups
Energy analytics, ThousandEyes results
No
3.1.3
New reporting options
Industrial REP/MRP rings, LAN Automation port channels
No
3.1.3
—
Compliance policies, rules, variables
No
3.1.5
Custom compliance as code
RBAC v2 roles and access groups
No
3.1.5
Migrate role scripts; v1 is Sunset
Discovery v2, global credentials v2, device add/validate
DevNet's full reference stops at 3.1.6, so these come from the Platform User Guides 3.2.x and 3.3.x. Neither guide lists any deprecated API operation or breaking change for 3.2.2, 3.2.3 or 3.3.1. Release 3.2.2 shipped as controlled availability; 3.3.1 marks some operations BETA in the catalog and in the spec's banner field.
Release
Area
New operations
3.3.1
Clients
/dna/intent/api/v1/trackedClients with /query, /{id}, /bulkCreate, /bulkUpdate, /bulkDelete
3.3.1
Campus connectivity
/dna/campus/api/v1/networks, /{id}, /count (new /dna/campus prefix)
3.3.1
Devices
/networkDevices/refresh, /networkDevices/refreshRequests/...; new syncProgress and fullSyncDuration fields
3.3.1
Wireless backhaul
/dna/data/api/v1/urwbNetworks with links, nodes, query and analytics (URWB: Ultra-Reliable Wireless Backhaul)
Deprecated means a better alternative exists. Sunset means support ends once the deprecation period elapses. A deprecated operation stays for two GA (Generally Available) releases or one year, whichever is longer; after that Cisco may remove it in any release.
Is this API deprecated?
Paste a path or click an example. Checks this guide's list of deprecated, Sunset and superseded operations.
Figure 14. Releases (grey: 2.3.7 train, blue: 3.x) and the minimum one-year window after each major deprecation. Past the bar, removal is allowed in any release.
Many tutorials still use legacy paths. For example, a September 2025 Cisco Community lab creates sites with POST /dna/intent/api/v1/site and credentials with /v2/global-credential; both work on older releases but the site path is deprecated. Translate examples to the replacement column before reuse.
Behaviour changes without a path change: 3.1.5 raised the minimum resync to 6 hours and made system performance APIs ignore time parameters; 3.1.6 ignores some 802.11be parameters on IOS XE 17.18.2+; 3.3.1 removed wireless PDC and MDC fields. For a definitive list on your build, filter the in-product API catalog by Deprecated and Sunset banners.
Operate
Tooling
Tool
Package
Latest seen (Oct 2026)
Notes
Python SDK
pip install catalystcentersdk
3.2.3.0.x
Version matches the controller release; auto token refresh and rate-limit wait
Ansible
cisco.catalystcenter
2.3.x for 3.1.6
Red Hat certified, about 1,100 modules; cisco.dnac is deprecated
Good for GET practice; newer endpoints may return 404
Operate
Guidance checklist
Pin to your release. API version equals controller version; pin SDK, Ansible and Terraform to it.
Read Deprecated and Breaking sections before every upgrade, then test integrations against the target release in a lab.
One service account per integration, least privilege, RBAC v2 roles and access groups.
Cache the token and re-authenticate once on 401; documented lifetimes differ (1 hour vs 60 seconds).
Keep TLS verification on in production.
Treat 202 as accepted, not done. Poll the task with a timeout and surface failureReason.
Page at 500 with a 1-based offset; size with /count, filter with /query, de-duplicate by ID.
Design for 429. Per-operation limits of 50 to 100 per minute; back off and serialize writes.
Push, don't poll. Webhooks for events and issues; reconcile hourly.
Never schedule device-touching calls. Command Runner and Path Trace are on demand, one device at a time.
Prefer the new resource model: /sites, /ipam, /sda, /networkDevices, /networkDeviceImages.
Gate every change on prerequisites: backup, archive, Managed and Reachable, no critical issues, compatibility.
Use bulk operations in waves by site.
Validate before and after: readiness checks, validation workflows, compliance, health.
Put MCP behind an Observer account on loopback. The server does not enforce read-only.
Operate
Figure index
Every diagram in the guide. Flow figures animate their packets (pause or replay from the bar above each one); step-through figures send a packet as you advance.
Payloads marked illustrative must be checked against the operation schema in your release. Verify endpoints in Platform > Developer Toolkit > APIs before production use.