I verified that Data Actions do distribute Genesys Cloud Public API calls over multiple auth tokens. This allows for more headroom before hitting the per token limit of 300 RPM. The exact limit isn't guaranteed, but I can not remember having ever seen this be a problem in practice.
I am not the person to answer your questions around overall organization limits. Our limits page has a limit of 3000 requests per minute for a user org.app.user.rate.per.minute
but I don't see any organization wide limit listed there. Hopefully someone else can chime in on that.
Original Message:
Sent: 04-24-2025 08:30
From: Orhun Sahin
Subject: Rate Limits for Data Actions within the Architect Flows
Hi Jason,
Wow, thank you for that insight! That's great and not something I had considered.
My understanding was that while Data Actions pool/cache tokens, the Genesys Cloud Data Action integration would primarily use one token until it expired or failed (like receiving a 401), making the 300 RPM limit per token/client feel like a more immediate potential bottleneck in high-throughput scenarios. The idea that the Data Action integration might actively distribute the load across available valid tokens for a given OAuth Client to mitigate hitting that limit more smoothly is quite a welcome possibility! I didn't realize it might switch to an alternative token before encountering an issue with the currently active one, simply for load distribution.
If this distribution behavior is indeed how it functions, it would certainly alleviate some concerns about frequently hitting the strict 300 RPM barrier during bursts, even if the average rate is lower.
This leads to a clarifying question, though, to ensure our overall understanding is correct: Assuming this token distribution mechanism does exist within the Genesys Cloud Data Action integration for a given Client Credential grant, our understanding remains that the overall organizational cap (which we've discussed potentially being around 3000 RPM total for all Client Credentials requests combined across all clients) would still be enforced, correct?
In other words, while this internal distribution might smooth out traffic and make hitting the individual 300 RPM limit less probable for momentary peaks, the platform would ultimately still throttle requests if the aggregate volume from all Client Credentials clients/tokens exceeds that organizational ceiling (e.g., ~3000 RPM)? Our assumption is that this organizational limit acts as the final backstop.
We definitely look forward to hearing the results of your testing when you get a chance, as confirming this distribution behavior would be very valuable information for designing resilient integrations!
Thanks again for sharing this potential mechanism and your willingness to investigate further!
------------------------------
Orhun Sahin
Software Development Engineer
------------------------------
Original Message:
Sent: 04-24-2025 08:10
From: Jason Jason Mathison
Subject: Rate Limits for Data Actions within the Architect Flows
Data Actions typically distribute outgoing requests across multiple authentication tokens, so I don't think that customers actually run into Genesys Cloud public API rate limiting at 300 requests per second. I will try to do a little bit of testing around this later today to verify that.
------------------------------
--Jason
Original Message:
Sent: 04-23-2025 16:02
From: Orhun Sahin
Subject: Rate Limits for Data Actions within the Architect Flows
Hi Jason,
Thank you so much for your detailed response and for confirming many of our assumptions! It's incredibly helpful for us and the wider community.
Regarding your comment on using separate OAuth clients for isolating limits between flows: I understand and appreciate the clarification that this might not be considered an official "best practice" by Genesys. Your primary recommendation to concentrate on caching is well-taken, and indeed we are utilizing caching extensively in other areas based on the principles in the article you linked and other strategies mentioned in our post.
However, I wanted to provide a bit more context on why the multiple-client approach was something we considered for a specific, somewhat constrained scenario. We are currently migrating a customer from PureConnect to Genesys Cloud, with a strong commitment made to minimize changes to their existing operational structures during the initial phase. One such structure involves looking up real-time data during the Inbound Call Flow. Unfortunately, due to specific business requirements tied to this legacy process, caching the data (even for a short period) is not a viable option in this particular instance – the data must be fetched live for each call from the Platform API.
This necessity forces us to make at least two Platform API calls (via GC Data Actions) within the call flow for every voice interaction. With a single OAuth Client using the default 300 RPM limit, this effectively caps our voice channel throughput at approximately 150 calls per minute without hitting the limit (300 RPM / 2 requests per call). While we could implement throttling within the flow to stay under this limit, it would introduce potentially significant delays for callers waiting in the IVR, which is highly undesirable for the customer experience.
For their operation size (around 120 agents) which is also multi-channel (with concurrent Inbound Email and Inbound SMS flows also running, potentially using other Data Actions), a hard cap of 150 calls/minute for just the voice channel felt technically challenging and potentially insufficient during peak times.
This constraint led us to consider the option of using separate OAuth Clients (perhaps one for voice, one for email/SMS, or even multiple dedicated clients if the load demanded) purely as a way to distribute these unavoidable real-time API calls across different 300 RPM limits. The goal wasn't necessarily to exceed the potential ~3000 RPM (which I believe this is hard-cap and cannot be exceeded across the organization with multiple Client Credentials OAuth Clients) aggregate cap discussed earlier, but rather to handle the necessary per-interaction load without causing IVR delays, by ensuring each logical channel or function stayed within the individual limits of its own client.
That being said, we absolutely agree that pursuing architectural workarounds for limits isn't the ideal first step. Our intended primary course of action is definitely to engage with our CSM and/or Genesys Cloud Customer Care to formally request an increase for a single, dedicated OAuth Client's rate limit for this integration. We understand it's possible to configure a single Client Credentials grant up to potentially 3000 RPM, and if approved, this would certainly be the cleanest and most preferred solution for addressing our specific scenario.
Thanks again for your valuable insights, the confirmation on other points, and for pointing us towards the best practices and the appropriate channels for limit increase requests!
------------------------------
Orhun Sahin
Software Development Engineer
Original Message:
Sent: 04-21-2025 10:41
From: Jason Jason Mathison
Subject: Rate Limits for Data Actions within the Architect Flows
I can answer a few of your questions from the Data Action perspective.
- Genesys Cloud Data Actions & API Limits: API calls made by these Data Actions count directly against the specific rate limit (e.g., default 300 RPM (
client.credentials.token.rate.per.minute)) of the individual OAuth Client configured in the associated "Genesys Cloud Data Actions" integration instance.
Yes, executing Genesys Cloud Data Actions would consume the rate limit for the client credentials used by the integration.
- Web Services Data Actions & API Limits: These do not consume Genesys Cloud Platform API rate limits. However, they do count towards the separate concurrent operations limit (often around 50 concurrent actions per org) and obviously depend on the rate limits and capacity of the external API being called.
- Concurrency Limits: Both GC Data Actions and Web Services Data Actions contribute to the concurrent operations limit (~50/org). The execution time of each action is critical for managing this.
Correct. The recent release of timeouts at the action level can help prevent concurrency rate limiting due to occasionally slow endpoints. I wrote a post about that here: https://community.genesys.com/discussion/data-action-timeout-support-releasing-this-week
Basically correct, but the caching occurs in the Data Action service. https://help.mypurecloud.com/faqs/do-data-actions-request-a-new-authentication-token-for-every-request/.
- Isolating Limits Between Flows: If multiple high-volume flows use GC Data Actions, the best practice to prevent them from exhausting a shared limit is to:
- Create separate OAuth Clients (Client Credentials).
- Create separate instances of the "Genesys Cloud Data Actions" integration.
- Configure each integration instance with its dedicated OAuth Client.
- Associate the Data Actions used in each flow with the corresponding integration instance. This ensures each flow (or group of flows) utilizes the independent rate limit of its dedicated OAuth Client. Using the same OAuth Client for Data Actions across multiple flows means they will share that single client's RPM limit. By utilizing multiple, separate OAuth Clients (each typically starting with its own default 300 RPM limit), it's my understanding that an organization can effectively achieve a higher aggregate throughput across different applications/flows, potentially scaling up towards a much higher total request count per minute across all clients (perhaps approaching figures sometimes mentioned like 3000 RPM in total platform capacity (
org.app.user.rate.per.minute- I know this is typically for Authorization Code or Token Implicit grant, but the same 3000 limit for client credentials grant has been previously mentioned by John in the DEV Forum.), though this isn't a single shared pool but rather the sum of independent capacities, subject to overall platform health).
I'm not aware of this being considered best practice, but is certainly an approach you could take. If you are concerned about hitting your platform limits I would concentrate more on caching value than trying to fully exploit the limits. There is an article that include that concept here: https://developer.genesys.cloud/blog/2021-02-03-Caching-in-flows/ further in your post you include other approaches to avoiding run-time lookups that seem reasonable to me.
------------------------------
--Jason