Interactive Reporting API 429s during high-concurrency JMeter test

Error 429 Too Many Requests. Retrying after 2 seconds… Error 429 Too Many Requests.

Running a load test against the Interactive Reporting API endpoint /api/v2/analytics/icap/report-requests. The goal is to simulate 500 concurrent agents querying real-time dashboard data. The environment is US1. JMeter version 5.6.2. Thread group settings: 500 threads, ramp-up 10 seconds, loop count 10.

The test starts fine. First 50 requests return 200 OK. Response time is under 200ms. Then, at roughly 100 concurrent requests, the API starts returning 429. The Retry-After header is not always present, making it hard to implement dynamic backoff. I tried adding a constant timer of 1000ms between requests, but the error persists once concurrency exceeds 80 threads.

I checked the organization’s API rate limits in the admin console. The limit for analytics scope is set to 100 requests per minute per user. However, I am using a single service account with OAuth2 client credentials flow. I assumed the limit applies per token, but the behavior suggests a global throttle or a different bucket is being hit.

Is there a specific rate limit for the ICAP endpoint that is lower than the general analytics limit? Or is this a WebSocket connection pool issue? I noticed the X-RateLimit-Remaining header drops to zero quickly. I cannot find documentation on the exact burst capacity for this endpoint.

Here is the JMeter request configuration:

  • Method: POST
  • Body: JSON with interval: "PT5M" and metrics: ["call.answered", "call.abandoned"]
  • Headers: Content-Type: application/json, Authorization: Bearer <token>

I need to understand if this is a hard limit or if I can request a temporary increase for testing purposes. The current setup prevents validating the system’s ability to handle peak shift changes.

What is the exact rate limit threshold for the ICAP reporting endpoint when using a single service account, and how can I structure the request to avoid 429 errors during high-concurrency simulations?

Ah, this is a recognized issue…

{
 "thread_group": {
 "scheduler": "ConcurrencyThreadGroup",
 "strategy": "SteppingThreadsStrategy",
 "step_time": 5,
 "thread_step": 50,
 "ramp_up": 10,
 "target_level": 500,
 "hold_target": 60
 },
 "http_request_defaults": {
 "timeout": 5000,
 "retry_count": 3,
 "retry_interval": 2000
 }
}

The core problem here is the ramp-up configuration. Launching 500 threads with a 10-second ramp-up creates a massive thundering herd effect. The Interactive Reporting API has strict rate limits to protect the underlying data warehouse. When all those requests hit simultaneously, the gateway immediately throttles them with 429 errors.

Switch to a Concurrency Thread Group with a Stepping Threads Strategy. This allows you to introduce load gradually. Start with 50 threads every 5 seconds until you hit the target of 500. This smooths out the request curve and prevents the initial burst from triggering rate limits.

Also, ensure every virtual user has a unique x-correlation-id header. The API uses this for rate limiting per client context. If multiple threads share the same ID, they count as a single client exceeding the limit, causing immediate rejection.

Add a constant throughput timer to cap the overall requests per second. Aim for 100 RPS initially. Monitor the response codes. If 429s persist, increase the step time or reduce the thread step size. This approach mimics real-world agent behavior where queries are staggered, not simultaneous.

We see this exact pattern during weekly schedule publishes in Chicago. Agents do not all refresh their dashboards at the exact same millisecond. Simulating realistic concurrency yields more accurate performance data and avoids false positives on rate limiting. Check the API documentation for specific limits on report requests per minute.

Check your JMeter thread group configuration. The suggestion above touches on ramp-up, but the real issue is likely how the ConcurrencyThreadGroup handles backpressure. When hitting /api/v2/analytics/icap/report-requests, the platform enforces strict rate limits per tenant ID.

Instead of a linear ramp, use a step-up strategy to allow the API gateway to stabilize.

{
 "thread_group": {
 "class": "org.apache.jmeter.threads.ConcurrencyThreadGroup",
 "strategy": "SteppingThreadsStrategy",
 "step_time": 10,
 "thread_step": 25,
 "target_level": 500,
 "hold_target": 300
 }
}

Also, verify your retry_interval. A 2-second wait is too short for 429 recovery on ICAP endpoints. Increase to 5000ms. Add a Constant Throughput Timer to cap requests at ~100/s initially. This prevents the initial burst from tripping the circuit breaker. The provider logs will show RATE_LIMIT_EXCEEDED if the header X-RateLimit-Remaining hits zero. Monitor that header in the response sampler.