We got the error 429 if we use a circle command to get all the wireless health status for all the networks. We have over 100 networks in an Org. We know the limit rate is 5 calls per second per Org.
Can we use one Get request to return the wireless health status of multi-networks? For example: GET/networks/{networkId}/failedConnections.
Don't think there is any way at the moment. Action batches don't support the resource you need at the moment:
https://developer.cisco.com/meraki/api/#/rest/guides/action-batches/
I guess you'll have to insert a sleep rule in your script to avoid hitting the 5 calls per second limit.
E.g. in python:
import time
time.sleep(5)
Hi BrechtSchamp,
Thank you for your reply. It looks like we have to use the sleep rule:)
There's also the Meraki github repo's sleep method. I use this all the time. I've included a sample request so you can see how the whole shebang works...
import time
import requests
from datetime import datetime
# Used for time.sleep(API_EXEC_DELAY). Delay added to avoid hitting
# dashboard API max request rate
API_EXEC_DELAY = 0.21
# connect and read timeouts for the Requests module
REQUESTS_CONNECT_TIMEOUT = 30
REQUESTS_READ_TIMEOUT = 30
# used by merakirequestthrottler(). DO NOT MODIFY
LAST_MERAKI_REQUEST = datetime.now()
def merakirequestthrottler(p_requestcount=1):
"""Add delay to requests to avoid hitting shaper."""
global LAST_MERAKI_REQUEST
if (datetime.now() - LAST_MERAKI_REQUEST).total_seconds() < (API_EXEC_DELAY * p_requestcount):
time.sleep(API_EXEC_DELAY * p_requestcount)
LAST_MERAKI_REQUEST = datetime.now()
return
def printusertext(p_message):
"""Print a line of text meant for the user to read.
Do not process these lines when chaining scripts
"""
print(f'@ {p_message}')
def getnetworklist(p_apikey, p_orgid, p_shardurl):
"""Return list of networks for specified organization."""
merakirequestthrottler()
r = ""
try:
r = requests.get(f"https://{p_shardurl}/api/v0/organizations/{p_orgid}/networks", headers={'X-Cisco-Meraki-API-Key': p_apikey, 'Content-Type': 'application/json'}, timeout=(REQUESTS_CONNECT_TIMEOUT, REQUESTS_READ_TIMEOUT))
except:
printusertext('ERROR 02: Unable to contact Meraki cloud')
sys.exit(2)
rjson = r.json()
return(rjson)
Hi Nash,
Great sample. Thank you very much!
I gave you a kudo because it's impressive you manage to hit the 5 API ratelimit using Python (assuming you are using Python).
@Nash has an excellent solution.
Is there any chance you can move more of the processing of the results (assuming you are doing further processing) to being right after you make the call to collect the results? That might introduce enough of a delay that it isn't an issue anymore.
I use @PhilipDAth's processing trick quite a bit too. Make a call, crunch the data as I can, make more calls.
Also helps that I'm working across dozens of organizations with a handful of networks each. Pretty glad the rate limit is per-organization.