CiscoSEField reference
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).

1,000+API operations
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.

Northbound: Intent APIscripts, SDKs, Ansible, TerraformMCP servers and AI agentsREST + JSON, 1,000+ operationsCatalyst Center/dna/intent /dna/data/dna/system /dna/campusWestbound: ITSMServiceNow bundlesincident, change, CMDBticket enrichment call-backsEastbound: Eventswebhook (REST)email, syslog, SNMP trapone subscription per event setSouthbound: Multivendor SDKdeprecated (device packs)third-party: SNMP MIB-II, visibility onlyHTTPS + X-Auth-Tokenbundlespushdeprecated
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.
PrefixServesExample
/dna/intent/api/v1/ (v2)Automation and inventory: sites, devices, provisioning, SD-Access, wireless, templates, eventsGET /dna/intent/api/v1/network-device
/dna/data/api/v1/Assurance analytics: query, count, trend, top-N, energyPOST /dna/data/api/v1/assuranceEvents/query
/dna/system/api/v1/ (v2)Platform: authentication, users and roles, backup and restore, system upgradePOST /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.

Your client, SDK or agentAPI gateway: token check, RBAC, per-operation rate limitInventory and design DBsites, settings, devices, configsGET /dna/intent/api/v1/...fresh as of the last device syncAssurance datahealth, issues, events, analytics/dna/intent health + /dna/datafresh as of telemetry ingestTask engineprovision, SWIM, discovery, CLIreturns 202 + taskIdpoll until endTime is setNetwork devicesswitches, routers, wireless controllers, access pointsinventory sync (periodic, min 6 h)telemetry (SNMP, syslog, NetFlow)reaches the device

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
Catalyst CenterNetworkYour systemsAccess switchesSNMP, syslog, telemetryWireless controllersAP and client dataRoutersWAN, NetFlowInventory and design DBAssurance dataTask engineEvent engineAPIgatewayRBACrate limitNOC dashboardsite health every 5 minCMDB syncpaged inventory, nightlyEngineerCommand Runner on demandITSM listenerreceives webhookswebhook, not via gatewayGateway calls, last minutelimit 50 / min0 calls
device telemetry and resync (no API call) read callwrite or task event 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.

    ClientAuth serviceIntent APIPOST …/system/api/v1/auth/token (Basic){"Token": "<JWT>"} valid 1 hGET …/network-device + X-Auth-Tokentoken and RBAC role check200 {"response": [...]}about 60 minutes laterany call with the expired token401 Unauthorizedre-authenticate once, then retry
    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.
    ItemDetail
    Token endpointPOST /dna/system/api/v1/auth/token with Basic credentials; response {"Token": "..."}
    HeaderX-Auth-Token: <token> plus Content-Type: application/json
    Lifetime1 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 previewsDeveloper Toolkit generates code in Shell, Node, Python, Ruby, JavaScript, jQuery, PHP, Go and Ansible. Generated Python needs the requests library.
    Optional AES modeIf enabled in system configuration, the Authorization header carries a Base64-encoded 256-bit AES (Advanced Encryption Standard) key instead of Basic credentials.
    RBACUse 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 testingPlatform > 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 accountsCisco'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}.

    ClientIntent APITask engineDevicesPOST /dna/intent/api/v1/discovery202 {taskId, url}create taskSNMP / SSH / NETCONFGET /task/{taskId}progress, no endTime yetwait 5–10 s, repeat, enforce a timeoutGET /task/{taskId}endTime set, isError, failureReason
    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

    RuleDetail
    Page sizelimit 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.
    Offsetoffset is 1-based. Loop until a page returns fewer than limit rows.
    Size firstCall the matching /count operation to size a job.
    Complex filtersPrefer POST …/query operations for filters, sorting and aggregation.
    Known issue3.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

    SourceWhat it says
    OpenAPI specs on DevNetPer 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 SDKWaits and retries on 429 by default (CATALYST_CENTER_WAIT_ON_RATE_LIMIT)
    HeadersNo 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.

    1 Hierarchyareas, buildings,floors/sites2 SettingsAAA, DNS, DHCP,NTP, credentials…/aaaSettings3 IP poolsglobal pools,site subpools/ipam/…Pools4 OnboardDiscovery v2or PnP claim/discoverys5 Provisionassign to site,deploy templatetaskId, polldesign intent, stored in the controllerasync tasks that reach devices
    Figure 4. Day-0 site build. Each step returns a task to poll before the next one.
    EndpointFunctionUse case
    /dna/intent/api/v1/sites, GET /sites/{id} (3.1.6)Site hierarchy: areas, buildings, floorsSite-as-code, CMDB location sync
    GET /sites?nameHierarchy=Global/Area/Building, then POST /dna/intent/api/v2/floorsResolve 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, telemetrySettingsPer-site network settings with inheritanceStandard settings per region
    PUT /sites/{id}/deviceCredentials, …/deviceCredentials/applyCredentials per site and sync to devicesCredential rotation
    POST /dna/intent/api/v1/networkDevices/assignToSite/applyAssign devices to a site (returns 202)Place discovered devices before provisioning
    /dna/intent/api/v1/globalCredentials (3.1.6 v2)CLI, SNMP, NETCONF, HTTP credentialsVault-driven credential lifecycle
    /ipam/globalIpAddressPools, /ipam/siteIpAddressPoolsGlobal pools and site subpoolsIPAM (IP Address Management) alignment

    Automate

    Inventory, discovery and onboarding Stops at the controller Reaches the device

    Inventory reads come from the controller database. Discovery, PnP (Plug and Play) claims and resyncs make the controller talk to devices.

    EndpointFunctionUse case
    GET /dna/intent/api/v1/network-deviceDevice list with basic filters (classic)Quick lookups, Command Runner targeting
    POST /dna/intent/api/v1/networkDevices/queryDevice query with complex filters and aggregationCMDB sync, compliance reporting
    POST /networkDevices, PUT /networkDevices/{id}, …/validateDevice (3.1.6)Add, update and validate devicesBrownfield onboarding
    /dna/intent/api/v1/discoverys (3.1.6)Discovery v2: create, edit, jobs, discovered devicesScan ranges, CDP or LLDP (Cisco / Link Layer Discovery Protocol)
    PnP device, workflow and settings operationsZero-touch claim of new devicesGreenfield branch and closet rollouts
    PUT /networkDevices/resyncIntervalSettingsGlobal resync interval (minimum 6 hours from 3.1.5)Do not lower; event-driven sync keeps data current
    Device Replacement operationsRMA (Return Merchandise Authorization) workflowSwap 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.

    1. Create a project and template in Template Programmer
    2. Commit a version (deployments use committed versions)
    3. Preview the rendered config for one device
    4. Deploy to devices or by site; get a task
    5. Poll the task, then run compliance
    Endpoint familyFunction
    GET /dna/intent/api/v2/template-programmer/projectFind projects and template IDs
    POST /dna/intent/api/v1/template-programmer/template/deployDeploy 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 assignmentBind templates to sites through profiles so new devices inherit them
    Wired and wireless provisioning operationsAssign 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.

    PipelineITSMCatalyst CenterDevicesGET …/networkDeviceImagesimage status vs goldenPOST …/{id}/readinessChecksopen change requestapproved, window setPOST …/distribute/bulk202 {taskId}copy image to flashGET /task/{taskId} until endTimemaintenance window opensPOST …/activate/bulkinstall and reloadGET …/validationResultsclose change with evidence
    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.
    EndpointFunction
    GET /dna/intent/api/v1/networkDeviceImages, /countDevices with image details and golden-image status
    POST …/networkDeviceImages/{id}/readinessChecksPre-upgrade readiness for one device
    …/networkDeviceImages/validationsCustom pre and post checks (show commands per product series)
    POST …/distribute/bulk, …/activate/bulkBulk distribute and activate; each returns a task
    GET …/networkDeviceImages/validationResultsPre and post validation results
    /dna/intent/api/v1/productSeriesProduct 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.

    AreaNon-fabric (traditional campus)SD-Access fabric
    Platform, auth, RBAC, tasksSameSame
    Sites, settings, IP poolsSame /sites and /ipam modelSame, plus pools bound to virtual networks
    Inventory, discovery, PnP, SWIM, complianceSameSame
    TemplatesPrimary way to configure VLANs, uplinks, policiesUsed for day-N extras; avoid lines the fabric intent owns
    Overlay and segmentationVLANs and ACLs (Access Control Lists) through templates/sda/fabricSites, layer3VirtualNetworks, anycastGateways, fabricDevices, transitNetworks
    UnderlayYour own design, often templatesLAN Automation (/lanAutomation) or manual underlay
    WirelessWireless domain: SSIDs (Service Set Identifiers), wireless and RF (Radio Frequency) profiles, WLC (Wireless LAN Controller) provisioningFabric Wireless domain: VLAN-to-SSID mapping (/sda/fabrics/{id}/vlanToSsids) on top of the wireless profiles
    PolicyApplication QoS (Quality of Service) policyGroup-based policy with ISE (Identity Services Engine) scalable groups, plus application policy
    AssuranceDevice, client, application healthSame, 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.

    Prerequisitessites, settings, poolsdevices provisionedFabric sitePOST /sda/fabricSitesfabric type, auth profileVirtual networks/sda/layer3VirtualNetworksone per segmentAnycast gateways/sda/anycastGatewayspool + VN per siteFabric devices/sda/fabricDevicesborder, control plane, edgeTransits (multi-site)/sda/transitNetworksIP or SD-Access transiteach call returns a task; poll it before the next step
    Figure 6. Fabric build order. Each step depends on the previous one existing.
    EndpointFunction
    /sda/fabricSitesCreate, update, delete fabric sites
    /sda/layer3VirtualNetworksLayer 3 virtual networks (VRF-based segments)
    /sda/anycastGatewaysAnycast gateways: pool plus VN (Virtual Network) per fabric site
    /sda/fabricDevicesAssign border, control-plane and edge roles; border handoff settings
    /sda/transitNetworksIP-based or SD-Access transits for multi-site
    /sda/fabrics/{id}/vlanToSsidsFabric wireless VLAN-to-SSID mapping
    /dna/intent/api/v1/trafficSteeringPolicys, …Contracts (3.1.6)Security service insertion and traffic steering

    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.

    Automate

    Wireless Writes config (async)

    Endpoint familyFunction
    Enterprise and guest SSID operationsCreate and update SSIDs per site
    Wireless profiles and RF profilesBind SSIDs to sites; radio settings
    /wirelessSettings/dot11beProfiles802.11be (Wi-Fi 7) profiles; MLO (Multi-Link Operation) settings changed in 3.1.6
    POST /wirelessControllers/{deviceId}/provisionProvision a WLC; 3.1.6 adds LSC (Locally Significant Certificate) parameters
    /wirelessSettings/certificateRenewalProfiles (3.1.6)LSC renewal profiles for access points
    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

    What do you need?start from the questionIntent health and query APIs/site-health /networkDevices/querysafe to schedule, page at 500fleet-wide, current stateAssurance data APIs/dna/data/api/v1/…/trendAnalyticsaggregated by the controllertrends over a time rangeEvent subscriptions/event/webhook + /event/subscription/restpush, then reconcile hourlytell me when it changesCommand Runner or Path Trace/network-device-poller/cli/read-requeston demand, one device or flowone device, right now
    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.

    QuestionScalable 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-healthCommand Runner on one device
    How are clients doing?GET /dna/intent/api/v1/client-healthGET /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

    EndpointReturnsUse case
    GET /site-health, /network-health, /client-healthHealth scores by site, device tier, client typeNOC dashboards, every 5 to 15 minutes
    GET /dna/intent/api/v1/issues; custom issue definitionsOpen issues with priority and siteTicketing, triage queues
    /dna/data/api/v1/assuranceEvents, /count, /queryRaw Assurance events with filtersReconcile missed webhooks, forensics
    POST /dna/data/api/v1/…/trendAnalytics, summaryAnalyticsServer-side aggregation over timeSLA (Service-Level Agreement) and capacity reports
    /dna/intent/api/v2/…-enrichment-details (2.3.7.10)Device, client, user, issue context in one callTicket enrichment
    /dna/data/api/v1/thousandEyesTestResults (3.1.3)ThousandEyes test results and trendsApplication experience reports

    Observe

    Events and webhooks Stops at the controller

    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.

    Admin scriptCatalyst CenterYour listenerNetworkPOST /event/webhook (URL, method)POST /event/subscription/restone-time setup; everything below is continuousdevice unreachable (telemetry)correlate into an eventHTTP POST, JSON event200 OK fast, queue the workhourly: …/assuranceEvents/query
    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.

    EngineerIntent APITask engineDeviceGET /network-device?platformId=device UUIDsPOST …/cli/read-request202 {taskId}queue taskSSH: show commandsCLI outputGET /task/{taskId}progress: {"fileId": ...}GET /file/{fileId}output per device and command
    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.

    ServiceNow instanceCatalyst Centerissues and Assurance eventsSWIM and automation eventsinventory for CMDB syncImport set tablestaging recordone per event typeTransform mapworkflow indicatorroutes the recordIncident / ProblemChange requestCMDB CICisco DNA App (in ServiceNow)enriches a ticket with device, client, issue contextREST pushenrichment v2 call-back
    Figure 10. Events land in ServiceNow import set tables; transform maps route them; the Cisco DNA App calls back for enrichment.
    BundleWhat it does
    Basic ServiceNow CMDB synchronizationPushes inventory into CMDB (Configuration Management Database) CIs
    Network Issue Monitor and EnrichmentCreates incidents from Assurance issues with network context
    Automation (SWIM) events for ITSMChange requests around image updates
    Endpoint Attribute RetrievalEndpoint data for profiling
    Rogue and aWIPSRogue 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

    1. Issue or event webhook
    2. ITSM creates the incident
    3. ITSM calls /v2/device-enrichment-details and client/issue variants
    4. Engineer works the ticket
    5. 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

    1. Nightly /networkDevices/query with /count
    2. Page at 500
    3. Enrich with EOX (end-of-life) and license data
    4. Upsert into the CMDB
    5. 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

    1. Read /ipam/globalIpAddressPools
    2. Reconcile with IPAM blocks
    3. Create site subpools with /ipam/siteIpAddressPools
    4. 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)

    1. securityAdvisories results
    2. fieldNotices and networkBugs results
    3. compliance status
    4. 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

    1. Readiness checks
    2. Change approval gate
    3. distribute/bulk
    4. activate/bulk in window
    5. 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

    1. /sites hierarchy
    2. /sites/{id}/…Settings
    3. IP pools
    4. Discovery v2 or PnP
    5. 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.

    Your network boundary (can be air-gapped)AI client or agentClaude Desktop, Cursor,VS Code, Codex, customstates the task and limitsApproved modelhosted or private LLMpicks which tools to callMCP server (Docker)localhost:7001/v1/mcpgenerated tool catalogbranch = controller releaseno access control of its ownCatalyst CenterRBAC is the real controlObserver service accountsame rate limits applyWhat the server does not doenforce read-only or authenticate clientsso bind to loopback and use a read-only accountprompts, results, tool choicetools/callHTTP or STDIORESTone account
    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 caseWho benefitsExample request
    Ticket triage with network evidenceL1 (first-line) helpdeskIs this one user, access point or location? Is the AP healthy? What belongs in the ticket?
    End-user self-serviceEmployeesCheck my Wi-Fi connection before I open a case
    Inventory and health reviewNOCSummarize health for Global/San Jose; group POOR devices by role
    Wireless experience investigationWireless teamWorst APs, SSIDs and clients at HQ over 24 hours, and next checks
    Software and compliance risk reviewSecurity and operationsCompliance issues, advisories, field notices, prioritized. Do not make any changes.
    Cross-domain copilotPlatform teamsCombine Catalyst Center with Meraki, ITSM or other MCP servers in one agent

    MCP best practices

    1. 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.
    2. One dedicated, least-privilege account per deployment. Treat every connected client as able to call anything that account can.
    3. Keep the endpoint private. Bind to 127.0.0.1; if shared, put it behind your gateway with authentication and TLS.
    4. Keep certificate verification on (CATALYST_CENTER_VERIFY_SSL=true) except in labs.
    5. Match the release branch to the controller and rebuild after each controller upgrade.
    6. State the safety boundary in prompts ("read-only, do not change anything"). It is a backstop, not a control.
    7. Mind rate limits. Agents chain many calls; the same per-operation limits and 500-row pages apply.
    8. Choose the model deliberately. For regulated or air-gapped sites, pair the local server with an approved private model.
    9. Log tool calls on your side. The controller sees only one service account.
    10. 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)

    CheckHowWhy
    Controller backup is recentGET /dna/system/api/v1/backups (3.1.3+)Rollback point for the controller itself
    Device config archivedGET /networkDeviceConfigFiles for target devicesKnown-good config to compare and restore
    Devices Managed and ReachablePOST /networkDevices/query: collection status Managed, reachability ReachableTasks against unmanaged or unreachable devices fail or hang
    No open critical issues on targetsGET /issues filtered by site and priorityDo not change a device that is already degraded
    Compliance is clean or understoodGET /compliance for targetsSeparates new drift from existing drift
    Release and device are supportedCompatibility matrix (next section)Unsupported combinations fail in provisioning
    Pre-checks capturedNetwork validation workflows (/diagnosticValidationWorkflows) or SWIM custom validationsBefore/after comparison
    Change approved, window setITSM change; POST /dna/intent/api/v1/networkDeviceMaintenanceSchedulesPractice: and audit trail
    Right accountNarrow RBAC role scoped by access groupLimits blast radius of a script error
    Pilot firstOne site or a few devices, then wavesPractice

    Additional checks for SD-Access

    CheckWhy
    ISE (Identity Services Engine) integration healthy and trustedFabric 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 networkAnycast gateways need pool plus VN
    Border, control-plane and edge roles fit the compatibility matrix for your release and IOS XE versionRole support differs by platform and version
    Build in order: fabric site, VNs, gateways, devices, transitsEach object depends on the previous one (Figure 6)
    Wait for each task or execution status before the next callFabric operations are orchestrated and long-running
    Avoid template lines that overlap fabric-owned configTemplates and fabric intent will fight; compliance flags drift

    Additional checks for non-fabric

    CheckWhy
    Templates committed, versioned and previewed for one deviceCatches variable and syntax errors before scale
    Network profile binds the template to the right sitesNew devices inherit the right config
    VLAN, trunk and uplink changes staged to avoid cutting management accessPractice: a bad uplink change strands the device
    Wireless: SSID, profile and WLC provisioning in that order; retest after upgradesWireless field changes in 3.1.6 and 3.3.1

    After the change (both)

    1. Task or execution status succeeded
    2. Post-checks or validation results match pre-checks
    3. Run compliance on targets
    4. Site and device health unchanged or better
    5. 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 integratorHow to use it
    Whether a device model supports a fabric role on a given releaseCheck before scripting /sda/fabricDevices assignments
    Supported upgrade paths between Catalyst Center releasesPlan controller upgrades, then re-test integrations against the target release
    Devices at Last Day of Support are removedThose 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.xVisibility only; no provisioning API for them
    EoX scanning from 2.3.3.x for connected customersUse the in-product EOX data for lifecycle reports
    Platform caveats, e.g. C9350 edge needs control plane on IOS XE 17.18.5, no IPv6Encode 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

    Send requestParse the bodycheck response[] and version2xxPoll the taskGET /task/{id} until endTime, with a timeout202Re-authenticatenew token, retry once, then fail401Back off and retry2 s, 4 s, 8 s … 60 s, at most 6 tries429 / 500 / 503Do not retryfix the payload or RBAC; log and alert400 / 403 / 404
    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

    Result is not what you expectedIt was an async write (202)200 with an empty response[]Read GET /task/{taskId}check endTime and isErrorfailedisError is trueread failureReason, fix, resubmitrunningendTime still emptykeep polling to timeout, then alertCheck the filtersoffset is 1-based, limit at most 500still emptyCheck RBAC scopeaccess groups can hide sites and devicesstill emptyUI shows data, API does notcapture URL, status, body: open a TAC case
    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.
    SymptomLikely causeFix
    202 but nothing changedTask failedRead the task's failureReason
    401 mid-runToken expired after 60 minutesCache the token, re-authenticate once
    403 with a valid tokenRBAC role or access group lacks the feature or siteAdjust the service account role
    429Per-operation rate limitBack off 2 s to 60 s; serialize writes
    Empty listWrong filter, 0-based offset, RBAC scopeOffset starts at 1; check access groups
    Different rows on the same pageKnown paging issue in 3.2.3Sort client-side, de-duplicate by ID
    Inventory looks staleResync is 6 hours minimumTrust 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.

    Capability2.3.7.x3.1.x and laterAction when upgrading
    Sites and per-site settings (/sites, …Settings)Yes, from 2.3.7.6Yes; GET /sites/{id} added in 3.1.6Move off legacy /site
    IPAM pools (/ipam/...)YesYes; overlapping pools in 3.1.5Move off reserve-ip-subpool
    SD-Access /sda/... familyYesYes; traffic steering in 3.1.6Move off /business/sda
    Assurance events /dna/data/.../assuranceEventsYes, from 2.3.7.6Yes—
    Enrichment v22.3.7.10Yes—
    SWIM v2 networkDeviceImages with bulk and validationsNo3.1.3Rewrite upgrade pipelines; v1 is Sunset
    Backup and restore APIsNo3.1.3Automate controller backups
    Energy analytics, ThousandEyes resultsNo3.1.3New reporting options
    Industrial REP/MRP rings, LAN Automation port channelsNo3.1.3—
    Compliance policies, rules, variablesNo3.1.5Custom compliance as code
    RBAC v2 roles and access groupsNo3.1.5Migrate role scripts; v1 is Sunset
    Discovery v2, global credentials v2, device add/validateNo3.1.6Prefer v2 for new code
    System software upgrade APIsNo3.1.6Automate controller upgrades
    Minimum resync interval25 minutes6 hours (3.1.5)Remove resync tuning from scripts
    ToolingSDK 2.3.7.6.x / 2.3.7.9.x; Ansible cisco.catalystcenter 1.0.0 / 2.1.4SDK 3.1.x to 3.2.3.0.x; Ansible 2.2.x / 2.3.xPin tools to the target release

    What is new in 3.2.x and 3.3.1

    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.

    ReleaseAreaNew operations
    3.3.1Clients/dna/intent/api/v1/trackedClients with /query, /{id}, /bulkCreate, /bulkUpdate, /bulkDelete
    3.3.1Campus connectivity/dna/campus/api/v1/networks, /{id}, /count (new /dna/campus prefix)
    3.3.1Devices/networkDevices/refresh, /networkDevices/refreshRequests/...; new syncProgress and fullSyncDuration fields
    3.3.1Wireless backhaul/dna/data/api/v1/urwbNetworks with links, nodes, query and analytics (URWB: Ultra-Reliable Wireless Backhaul)
    3.3.1IndustrialPRP (Parallel Redundancy Protocol) /iot/fabric/prp/...; REP rings /iot/repRings/...
    3.3.1Network settingsGET/PUT /sites/{id}/aaaTrustSecSettings; RADIUS over DTLS and TACACS+ over TLS in AAA settings
    3.3.1Intelligent CapturePOST /dna/data/api/v1/icap/captureFiles/{id}/analyze, /icap/settings
    3.3.1Maps/outdoorAreas, access point positions, /maps/accessPointAntennas
    3.3.1IPAMipam/serverSetting/validationReports, ipam/serverSetting/exports; BLUECAT_V2API provider
    3.3.1Wireless/wirelessSettings/wlanSchedulers, /wirelessControllers/regulatoryActivations
    3.3.1LAN AutomationOSPF underlay as well as IS-IS through POST /dna/intent/api/v2/lan-automation
    3.2.3Industrial/iot/fabric/penUpgrade/configurationModels
    3.2.2Troubleshooting/dna/intent/api/v1/pathTraces
    3.2.2Devices and onboardingPOST /networkDevices, /pnpNetworkDevices, /networkDeviceReplacements/workflow/deploy
    3.2.2Events/event/sftp/configurations
    3.2.2SD-Access and images/sda/switchNetworkProfiles, /images/transferProtocolSettings
    3.2.2Other/licenseUsage, /clientEnrichmentDetails, /issueEnrichmentDetails, /userEnrichmentDetails, /wirelessAccessPoints/configurations, /sites/{id}/locationServerSettings

    Operate

    Deprecated and sunset APIs

    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.

    Jul 2024Jan 2025Jul 2025Jan 2026Jul 20262.3.7.62.3.7.6 · 2 Aug 2024 · new /sites and per-site settings model, Assurance events; legacy site APIs deprecated2.3.7.72.3.7.7 · 18 Nov 2024 · no API changes2.3.7.92.3.7.9 · 3 Mar 2025 · /business/sda and generic /event/subscription deprecated3.1.33.1.3 · 16 Jun 2025 · SWIM v2, backup and restore, energy; SWIM v1 Sunset2.3.7.102.3.7.10 · 28 Aug 2025 · enrichment v2 APIs3.1.53.1.5 · 1 Oct 2025 · compliance policies, RBAC v2; role v1 Sunset; resync minimum 6 h3.1.63.1.6 · 18 Dec 2025 · Discovery v2, global credentials v2, traffic steering, system upgrade3.2.23.2.2 · 5 May 2026 · controlled availability · pathTraces, PnP and replacement APIs3.3.13.3.1 · 9 Sep 2026 · tracked clients, /dna/campus networks, URWB, PRP rings3.2.33.2.3 · 21 Sep 2026 · industrial upgrade models; known paging issuetodaySite and credential-to-site v1/v2 deprecatedMinimum deprecation window: two GA releases or one year, whichever is longer/business/sda and generic /event/subscription deprecatedMinimum deprecation window: two GA releases or one year, whichever is longerSWIM v1 image distribution and activation: SunsetMinimum deprecation window: two GA releases or one year, whichever is longerUser and roles v1 APIs: SunsetMinimum deprecation window: two GA releases or one year, whichever is longer
    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.
    AreaDeprecated or SunsetFlagged inReplace with
    Site hierarchy/site, /v2/site, /site/count, /site-member/{id}/member, /assign-device-to-site/{siteId}/device (Sunset banner)2.3.7.6/sites family; POST /networkDevices/assignToSite/apply
    Site credentials/v1/credential-to-site/{siteId}, /v2/credential-to-site/{siteId}2.3.7.6PUT /sites/{id}/deviceCredentials
    IP poolsPOST/PUT /reserve-ip-subpool/{siteId} (Sunset banner)3.1.6 reference/ipam/siteIpAddressPools
    SD-Access/business/sda/... (about 40 operations: fabric, site, zone, devices, auth profile, VN, multicast)2.3.7.9/sda/... family
    Event subscriptionsPOST/PUT/GET /dna/intent/api/v1/event/subscription (generic)2.3.7.9/event/subscription/rest and the other per-channel subscription operations
    Path TracePOST /dna/intent/api/v1/flow-analysis (still available)Superseded in 3.2.2POST /dna/intent/api/v1/pathTraces
    IPAM providerBLUECAT_V1API provider value3.3.1: planned for deprecationBLUECAT_V2API
    SWIMPOST /image/distribution, POST /image/activation/device3.1.3 (Sunset)/networkDeviceImages/... incl. bulk
    Config archiveGET /network-device-config3.1.3/networkDeviceConfigFiles
    Users and roles/dna/system/api/v1/role, /roles, /role/permissions3.1.5 (Sunset)/dna/system/api/v2/roles, /accessGroups
    SouthboundMultivendor SDKDeprecatedSNMP MIB-II third-party visibility
    Ansiblecisco.dnac collectionSlated for removal from Ansible 14cisco.catalystcenter

    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

    ToolPackageLatest seen (Oct 2026)Notes
    Python SDKpip install catalystcentersdk3.2.3.0.xVersion matches the controller release; auto token refresh and rate-limit wait
    Ansiblecisco.catalystcenter2.3.x for 3.1.6Red Hat certified, about 1,100 modules; cisco.dnac is deprecated
    Cisco Validated Playbookscatalyst-center-ansible-iac—Discovery, inventory, PnP, SWIM, compliance, RMA, notifications
    TerraformCiscoDevNet/catalystcenterv0.3.xNetwork as Code provider, tested against 2.3.7.9
    Terraform (SDK-based)cisco-en-programmability/catalystcenter1.2.0-betaBeta
    MCP servercisco-en-programmability/catc-mcp-ossRelease branch per controllerBeta, self-hosted, see Part 4
    Sandboxsandboxdnac.cisco.com2.3.3.6, read-onlyGood for GET practice; newer endpoints may return 404

    Operate

    Guidance checklist

    1. Pin to your release. API version equals controller version; pin SDK, Ansible and Terraform to it.
    2. Read Deprecated and Breaking sections before every upgrade, then test integrations against the target release in a lab.
    3. One service account per integration, least privilege, RBAC v2 roles and access groups.
    4. Cache the token and re-authenticate once on 401; documented lifetimes differ (1 hour vs 60 seconds).
    5. Keep TLS verification on in production.
    6. Treat 202 as accepted, not done. Poll the task with a timeout and surface failureReason.
    7. Page at 500 with a 1-based offset; size with /count, filter with /query, de-duplicate by ID.
    8. Design for 429. Per-operation limits of 50 to 100 per minute; back off and serialize writes.
    9. Push, don't poll. Webhooks for events and issues; reconcile hourly.
    10. Never schedule device-touching calls. Command Runner and Path Trace are on demand, one device at a time.
    11. Prefer the new resource model: /sites, /ipam, /sda, /networkDevices, /networkDeviceImages.
    12. Gate every change on prerequisites: backup, archive, Managed and Reachable, no critical issues, compatibility.
    13. Use bulk operations in waves by site.
    14. Validate before and after: readiness checks, validation workflows, compliance, health.
    15. 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.

    1. Figure 0Integration directionsOverview and interfaces
    2. Figure 1Where a call stopsWhere a call stops
    3. Figure 1bLive simulation of a day of API trafficWhere a call stops
    4. Figure 2Token authentication and re-authenticationAuthentication and RBAC
    5. Figure 3Asynchronous task patternAsync, paging, limits
    6. Figure 4Day-0 site buildSites and settings
    7. Figure 5SWIM upgrade waveSoftware images (SWIM)
    8. Figure 6SD-Access fabric build orderSD-Access fabric
    9. Figure 7Choosing the right data sourceHow to choose
    10. Figure 8Webhooks with hourly reconcileWebhooks
    11. Figure 9Command Runner round tripTroubleshooting tools
    12. Figure 10ServiceNow ITSM integrationITSM and ServiceNow
    13. Figure 11MCP server trust boundaryAI agents and MCP
    14. Figure 12Retry decision by status codeErrors and resilience
    15. Figure 13Separating failures from filter or RBAC scopeErrors and resilience
    16. Figure 14Release and deprecation timelineDeprecated APIs

    Operate

    Sources

    Payloads marked illustrative must be checked against the operation schema in your release. Verify endpoints in Platform > Developer Toolkit > APIs before production use.