Moveworks Product Rate Limits (Chat Integrations, APIs, etc.)

Rate limits are used to control the rate of requests sent or received to underlying chat platforms. Moveworks self-imposes rate limits on its resources to ensure that the Moveworks platform does not send an unreasonable amount of requests to 3rd party platforms.

Note: In many cases, first time requests are typically slower that the published Rate Limits below, since the Moveworks bot needs to create a unique conversation thread with each user. Any subsequent messages or campaigns will be closer to the published RPM below.

Employee Comms

Chat SystemRequests per Minute (RPM) - Subsequent Messages
Slack525
Microsoft Teams2500
Google Chat150
Cisco Webex Teams600
Facebook Workplace50
Ringcentral Glip200
Zoom1500
Moveworks for Web1000

Moveworks APIs

If you would like to request a rate limit increase, please file a ticket with Moveworks support with business justification.

APIResource PathRequests per Minute (RPM)
Events API/rest/v1/messages/send120

FAQ

Q: What happens if I hit a rate limit against a chat integration?

A: Moveworks native chat integrations have rate limit retries automatically configured for each chat platform. If you run into a rate limit error code, you can try resending the message (if using Employee Comms). If you are using the Moveworks Events API, we recommend updating your workflow to sleep for 60 seconds, and then proceed with retrying the requests if a 429 is hit. e.g:

import time
import requests

def send_request(url):
    """Function to send a request to the specified URL. If a 429 status code is encountered, it retries the request after sleeping for 60 seconds."""
    max_retries = 5
    retries = 0

    while retries < max_retries:
        try:
            response = requests.get(url)
            if response.status_code == 429:
                print(f"Too many requests. Retrying in 60 seconds. Attempt: {retries + 1}")
                time.sleep(60)  # Sleep for 60 seconds before retrying
                retries += 1
                continue
            response.raise_for_status()  # Raises an HTTPError if the response status code is 4XX or 5XX
            return response.json()  # Return the successful response
        except requests.exceptions.HTTPError as err:
            print(f"HTTP error occurred: {err}")
            break  # Exit the loop if a non-retryable error occurs
        except Exception as err:
            print(f"An error occurred: {err}")
            break  # Exit the loop on other errors
    return None  # Return None if the request ultimately fails