Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions docs/generation-report.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# Generation Report

## 2026-09-02 | Library v4.5.0 | API 1.74.0


No Python keyword parameter conflicts detected.


## 2026-08-05 | Library v4.4.0 | API 1.73.0


Expand Down
2 changes: 1 addition & 1 deletion meraki/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
from meraki._version import __version__ # noqa: F401
from datetime import datetime

__api_version__ = "1.73.0"
__api_version__ = "1.74.0"

__all__ = [
"APIError",
Expand Down
2 changes: 1 addition & 1 deletion meraki/_version.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "4.4.0"
__version__ = "4.5.0"
10 changes: 6 additions & 4 deletions meraki/aio/api/appliance.py
Original file line number Diff line number Diff line change
Expand Up @@ -1119,7 +1119,7 @@ def updateNetworkApplianceInterfacesL3(self, networkId: str, interfaceId: str, *

- networkId (string): Network ID
- interfaceId (string): Interface ID
- port (object): Port configuration
- port (object): Port configuration. Set to null to remove the port association.
- ipv4 (object): IPv4 configuration
"""

Expand Down Expand Up @@ -1804,6 +1804,7 @@ def updateNetworkApplianceSingleLan(self, networkId: str, **kwargs):
- applianceIp (string): The appliance IP address of the single LAN
- ipv6 (object): IPv6 configuration on the VLAN
- mandatoryDhcp (object): Mandatory DHCP will enforce that clients connecting to this LAN must use the IP address assigned by the DHCP server. Clients who use a static IP address won't be able to associate. Only available on firmware versions 17.0 and above
- vrf (object): VRF configuration on the Single LAN. Omit this field to preserve the current VRF.
"""

kwargs.update(locals())
Expand All @@ -1820,6 +1821,7 @@ def updateNetworkApplianceSingleLan(self, networkId: str, **kwargs):
"applianceIp",
"ipv6",
"mandatoryDhcp",
"vrf",
]
payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}

Expand Down Expand Up @@ -1877,11 +1879,11 @@ def updateNetworkApplianceSsid(self, networkId: str, number: str, **kwargs):
- name (string): The name of the SSID.
- enabled (boolean): Whether or not the SSID is enabled.
- defaultVlanId (integer): The VLAN ID of the VLAN associated to this SSID. This parameter is only valid if the network is in routed mode.
- authMode (string): The association control method for the SSID ('open', 'psk', '8021x-meraki' or '8021x-radius').
- authMode (string): The association control method for the SSID ('open', 'psk', '8021x-meraki', '8021x-radius' or '8021x-nac').
- psk (string): The passkey for the SSID. This param is only valid if the authMode is 'psk'.
- radiusServers (array): The RADIUS 802.1x servers to be used for authentication. This param is only valid if the authMode is '8021x-radius'.
- encryptionMode (string): The psk encryption mode for the SSID ('wep' or 'wpa'). This param is only valid if the authMode is 'psk'.
- wpaEncryptionMode (string): The types of WPA encryption. ('WPA1 and WPA2', 'WPA2 only', 'WPA3 Transition Mode' or 'WPA3 only'). This param is only valid if (1) the authMode is 'psk' & the encryptionMode is 'wpa' OR (2) the authMode is '8021x-meraki' OR (3) the authMode is '8021x-radius'
- wpaEncryptionMode (string): The types of WPA encryption. ('WPA1 and WPA2', 'WPA2 only', 'WPA3 Transition Mode' or 'WPA3 only'). This param is only valid if (1) the authMode is 'psk' & the encryptionMode is 'wpa' OR (2) the authMode is '8021x-meraki' OR (3) the authMode is '8021x-radius' OR (4) the authMode is '8021x-nac'
- visible (boolean): Boolean indicating whether the MX should advertise or hide this SSID.
- dhcpEnforcedDeauthentication (object): DHCP Enforced Deauthentication enables the disassociation of wireless clients in addition to Mandatory DHCP. This param is only valid on firmware versions >= MX 17.0 where the associated LAN has Mandatory DHCP Enabled
- dot11w (object): The current setting for Protected Management Frames (802.11w).
Expand All @@ -1890,7 +1892,7 @@ def updateNetworkApplianceSsid(self, networkId: str, number: str, **kwargs):
kwargs.update(locals())

if "authMode" in kwargs:
options = ["8021x-meraki", "8021x-radius", "open", "psk"]
options = ["8021x-meraki", "8021x-nac", "8021x-radius", "open", "psk"]
assert kwargs["authMode"] in options, (
f'''"authMode" cannot be "{kwargs["authMode"]}", & must be set to one of: {options}'''
)
Expand Down
124 changes: 124 additions & 0 deletions meraki/aio/api/campusGateway.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,41 @@ def deleteNetworkCampusGatewayCluster(self, networkId: str, clusterId: str):

return self._session.delete(metadata, resource)

def updateNetworkCampusGatewaySsidMdns(self, networkId: str, number: str, **kwargs):
"""
**Update the mDNS gateway settings and rules for a SSID and cluster**
https://developer.cisco.com/meraki/api-v1/#!update-network-campus-gateway-ssid-mdns

- networkId (string): Network ID
- number (string): Number
- enabled (boolean): If true, mDNS gateway is enabled for this SSID and cluster.
- rules (array): List of mDNS forwarding rules.
"""

kwargs.update(locals())

metadata = {
"tags": ["campusGateway", "configure", "ssids", "mdns"],
"operation": "updateNetworkCampusGatewaySsidMdns",
}
networkId = urllib.parse.quote(str(networkId), safe="")
number = urllib.parse.quote(str(number), safe="")
resource = f"/networks/{networkId}/campusGateway/ssids/{number}/mdns"

body_params = [
"enabled",
"rules",
]
payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}

if self._session._validate_kwargs:
all_params = [] + body_params
invalid = [k for k in kwargs if k.strip() not in all_params and k != "self"]
if invalid and self._session._logger:
self._session._logger.warning(f"updateNetworkCampusGatewaySsidMdns: ignoring unrecognized kwargs: {invalid}")

return self._session.put(metadata, resource, payload)

def getOrganizationCampusGatewayClientsUsageByNetworkByCluster(
self, organizationId: str, total_pages=1, direction="next", **kwargs
):
Expand Down Expand Up @@ -603,6 +638,95 @@ def getOrganizationCampusGatewayClustersTunnelable(

return self._session.get_pages(metadata, resource, params, total_pages, direction)

def batchOrganizationCampusGatewayClustersTunnelingUpdate(self, organizationId: str, items: list, **kwargs):
"""
**Update MCG cluster-network tunnel settings for multiple networks**
https://developer.cisco.com/meraki/api-v1/#!batch-organization-campus-gateway-clusters-tunneling-update

- organizationId (string): Organization ID
- items (array): MCG cluster-network tunnel settings
"""

kwargs = locals()

metadata = {
"tags": ["campusGateway", "configure", "clusters", "tunneling"],
"operation": "batchOrganizationCampusGatewayClustersTunnelingUpdate",
}
organizationId = urllib.parse.quote(str(organizationId), safe="")
resource = f"/organizations/{organizationId}/campusGateway/clusters/tunneling/batchUpdate"

body_params = [
"items",
]
payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}

if self._session._validate_kwargs:
all_params = [] + body_params
invalid = [k for k in kwargs if k.strip() not in all_params and k != "self"]
if invalid and self._session._logger:
self._session._logger.warning(
f"batchOrganizationCampusGatewayClustersTunnelingUpdate: ignoring unrecognized kwargs: {invalid}"
)

return self._session.post(metadata, resource, payload)

def getOrganizationCampusGatewayClustersTunnelingByClusterByNetwork(
self, organizationId: str, total_pages=1, direction="next", **kwargs
):
"""
**List all the MCG cluster-network tunnel settings**
https://developer.cisco.com/meraki/api-v1/#!get-organization-campus-gateway-clusters-tunneling-by-cluster-by-network

- organizationId (string): Organization ID
- total_pages (integer or string): use with perPage to get total results up to total_pages*perPage; -1 or "all" for all pages
- direction (string): direction to paginate, either "next" (default) or "prev" page
- clusterIds (array): Optional parameter to filter MCG clusters. This filter uses multiple exact matches
- dataEncryptionEnabled (boolean): Optional parameter to filter cluster-network tunnel settings by data encryption configuration
- networkIds (array): Optional parameter to filter networks. This filter uses multiple exact matches
- perPage (integer): The number of entries per page returned. Acceptable range is 3 - 100. Default is 50.
- startingAfter (string): A token used by the server to indicate the start of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
- endingBefore (string): A token used by the server to indicate the end of the page. Often this is a timestamp or an ID but it is not limited to those. This parameter should not be defined by client applications. The link for the first, last, prev, or next page in the HTTP Link header should define it.
"""

kwargs.update(locals())

metadata = {
"tags": ["campusGateway", "configure", "clusters", "tunneling", "byCluster", "byNetwork"],
"operation": "getOrganizationCampusGatewayClustersTunnelingByClusterByNetwork",
}
organizationId = urllib.parse.quote(str(organizationId), safe="")
resource = f"/organizations/{organizationId}/campusGateway/clusters/tunneling/byCluster/byNetwork"

query_params = [
"clusterIds",
"dataEncryptionEnabled",
"networkIds",
"perPage",
"startingAfter",
"endingBefore",
]
params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params}

array_params = [
"clusterIds",
"networkIds",
]
for k, v in kwargs.items():
if k.strip() in array_params:
params[f"{k.strip()}[]"] = kwargs[f"{k}"]
params.pop(k.strip())

if self._session._validate_kwargs:
all_params = query_params + array_params
invalid = [k for k in kwargs if k.strip() not in all_params and k != "self"]
if invalid and self._session._logger:
self._session._logger.warning(
f"getOrganizationCampusGatewayClustersTunnelingByClusterByNetwork: ignoring unrecognized kwargs: {invalid}"
)

return self._session.get_pages(metadata, resource, params, total_pages, direction)

def getOrganizationCampusGatewayConnections(self, organizationId: str, total_pages=1, direction="next", **kwargs):
"""
**List the details of APs tunneling through the Campus Gateway clusters**
Expand Down
2 changes: 2 additions & 0 deletions meraki/aio/api/devices.py
Original file line number Diff line number Diff line change
Expand Up @@ -791,6 +791,7 @@ def createDeviceLiveToolsRoutingTableLookup(self, serial: str, **kwargs):
- destination (object): The destination IP or subnet to lookup
- nextHop (object): The next hop to lookup
- vpn (object): VPN related search criteria
- vrf (object): Virtual routing and forwarding (VRF) search criteria
- callback (object): Details for the callback. Please include either an httpServerId OR url and sharedSecret
"""

Expand Down Expand Up @@ -828,6 +829,7 @@ def createDeviceLiveToolsRoutingTableLookup(self, serial: str, **kwargs):
"destination",
"nextHop",
"vpn",
"vrf",
"callback",
]
payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
Expand Down
8 changes: 8 additions & 0 deletions meraki/aio/api/licensing.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,17 @@ def getAdministeredLicensingSubscriptionEntitlements(self, **kwargs):
https://developer.cisco.com/meraki/api-v1/#!get-administered-licensing-subscription-entitlements

- skus (array): Filter to entitlements with the specified SKUs
- subscriptionType (string): Filter entitlements by subscription type
"""

kwargs.update(locals())

if "subscriptionType" in kwargs:
options = ["termed", "unified"]
assert kwargs["subscriptionType"] in options, (
f'''"subscriptionType" cannot be "{kwargs["subscriptionType"]}", & must be set to one of: {options}'''
)

metadata = {
"tags": ["licensing", "configure", "subscription", "entitlements"],
"operation": "getAdministeredLicensingSubscriptionEntitlements",
Expand All @@ -24,6 +31,7 @@ def getAdministeredLicensingSubscriptionEntitlements(self, **kwargs):

query_params = [
"skus",
"subscriptionType",
]
params = {k.strip(): v for k, v in kwargs.items() if k.strip() in query_params}

Expand Down
4 changes: 3 additions & 1 deletion meraki/aio/api/networks.py
Original file line number Diff line number Diff line change
Expand Up @@ -1200,9 +1200,10 @@ def updateNetworkFirmwareUpgradesStagedEvents(self, networkId: str, stages: list

- networkId (string): Network ID
- stages (array): All firmware upgrade stages in the network with their start time.
- products (object): Contains firmware upgrade settings
"""

kwargs = locals()
kwargs.update(locals())

metadata = {
"tags": ["networks", "configure", "firmwareUpgrades", "staged", "events"],
Expand All @@ -1212,6 +1213,7 @@ def updateNetworkFirmwareUpgradesStagedEvents(self, networkId: str, stages: list
resource = f"/networks/{networkId}/firmwareUpgrades/staged/events"

body_params = [
"products",
"stages",
]
payload = {k.strip(): v for k, v in kwargs.items() if k.strip() in body_params}
Expand Down
16 changes: 10 additions & 6 deletions meraki/aio/api/switch.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,8 @@ def updateDeviceSwitchPort(self, serial: str, portId: str, **kwargs):
- tags (array): The list of tags of the switch port.
- enabled (boolean): The status of the switch port.
- poeEnabled (boolean): The PoE status of the switch port.
- perpetualPoe (object): Perpetual PoE settings for the switch port.
- fastPoe (object): Fast PoE settings for the switch port.
- type (string): The type of the switch port ('access', 'trunk', 'stack', 'routed', 'svl' or 'dad').
- vlan (integer): The VLAN of the switch port. For a trunk port, this is the native VLAN. A null value will clear the value set for trunk ports.
- voiceVlan (integer): The voice VLAN of the switch port. Only applicable to access ports.
Expand Down Expand Up @@ -210,6 +212,8 @@ def updateDeviceSwitchPort(self, serial: str, portId: str, **kwargs):
"tags",
"enabled",
"poeEnabled",
"perpetualPoe",
"fastPoe",
"type",
"vlan",
"voiceVlan",
Expand Down Expand Up @@ -295,9 +299,9 @@ def createDeviceSwitchRoutingInterface(self, serial: str, name: str, **kwargs):

- serial (string): Serial
- name (string): A friendly name or description for the interface or VLAN (max length 128 characters).
- mode (string): L3 Interface mode, can be one of 'vlan', 'routed', 'loopback'. Default is 'vlan'. CS 17.18 or higher is required for 'routed' mode.
- mode (string): L3 Interface mode, can be one of 'vlan', 'routed', 'loopback', or 'oob_management'. Default is 'vlan'. IOS XE firmware 17.18 or higher is required for 'routed' mode; IOS XE firmware 26.1.2 or higher is required for 'oob_management' mode.
- subnet (string): The network that this L3 interface is on, in CIDR notation (ex. 10.1.1.0/24).
- switchPortId (string): Switch Port ID when in Routed mode (CS 17.18 or higher required)
- switchPortId (string): Switch Port ID when in Routed mode (IOS XE firmware 17.18 or higher required)
- interfaceIp (string): The IP address that will be used for Layer 3 routing on this VLAN or subnet. This cannot be the same as the device management IP.
- mtu (integer): The interface MTU. Applies to native switch layer 3 interfaces, including VLAN and routed modes.
- multicastRouting (string): Enable multicast support if, multicast routing between VLANs is required. Options are: 'disabled', 'enabled' or 'IGMP snooping querier'. Default is 'disabled'.
Expand Down Expand Up @@ -380,7 +384,7 @@ def updateDeviceSwitchRoutingInterface(self, serial: str, interfaceId: str, **kw
- interfaceId (string): Interface ID
- name (string): A friendly name or description for the interface or VLAN (max length 128 characters).
- subnet (string): The network that this L3 interface is on, in CIDR notation (ex. 10.1.1.0/24).
- switchPortId (string): Switch Port ID when in Routed mode (CS 17.18 or higher required)
- switchPortId (string): Switch Port ID when in Routed mode (IOS XE firmware 17.18 or higher required)
- interfaceIp (string): The IP address that will be used for Layer 3 routing on this VLAN or subnet. This cannot be the same as the device management IP.
- mtu (integer): The interface MTU. Applies to native switch layer 3 interfaces, including VLAN and routed modes.
- multicastRouting (string): Enable multicast support if, multicast routing between VLANs is required. Options are: 'disabled', 'enabled' or 'IGMP snooping querier'. Default is 'disabled'.
Expand Down Expand Up @@ -2423,9 +2427,9 @@ def createNetworkSwitchStackRoutingInterface(self, networkId: str, switchStackId
- networkId (string): Network ID
- switchStackId (string): Switch stack ID
- name (string): A friendly name or description for the interface or VLAN (max length 128 characters).
- mode (string): L3 Interface mode, can be one of 'vlan', 'routed', 'loopback'. Default is 'vlan'. CS 17.18 or higher is required for 'routed' mode.
- mode (string): L3 Interface mode, can be one of 'vlan', 'routed', 'loopback', or 'oob_management'. Default is 'vlan'. IOS XE firmware 17.18 or higher is required for 'routed' mode; IOS XE firmware 26.1.2 or higher is required for 'oob_management' mode.
- subnet (string): The network that this L3 interface is on, in CIDR notation (ex. 10.1.1.0/24).
- switchPortId (string): Switch Port ID when in Routed mode (CS 17.18 or higher required)
- switchPortId (string): Switch Port ID when in Routed mode (IOS XE firmware 17.18 or higher required)
- interfaceIp (string): The IP address that will be used for Layer 3 routing on this VLAN or subnet. This cannot be the same as the device management IP.
- mtu (integer): The interface MTU. Applies to native switch layer 3 interfaces, including VLAN and routed modes.
- multicastRouting (string): Enable multicast support if, multicast routing between VLANs is required. Options are: 'disabled', 'enabled' or 'IGMP snooping querier'. Default is 'disabled'.
Expand Down Expand Up @@ -2514,7 +2518,7 @@ def updateNetworkSwitchStackRoutingInterface(self, networkId: str, switchStackId
- interfaceId (string): Interface ID
- name (string): A friendly name or description for the interface or VLAN (max length 128 characters).
- subnet (string): The network that this L3 interface is on, in CIDR notation (ex. 10.1.1.0/24).
- switchPortId (string): Switch Port ID when in Routed mode (CS 17.18 or higher required)
- switchPortId (string): Switch Port ID when in Routed mode (IOS XE firmware 17.18 or higher required)
- interfaceIp (string): The IP address that will be used for Layer 3 routing on this VLAN or subnet. This cannot be the same as the device management IP.
- mtu (integer): The interface MTU. Applies to native switch layer 3 interfaces, including VLAN and routed modes.
- multicastRouting (string): Enable multicast support if, multicast routing between VLANs is required. Options are: 'disabled', 'enabled' or 'IGMP snooping querier'. Default is 'disabled'.
Expand Down
Loading
Loading