429: Too Many Requests response.
For more on limit types and how to avoid being throttled, see Request throttling.
How request budgets work
Limits are defined at both the overall API service level and on the API endpoints belonging to the service. Some types of requests consume more resources (compute, storage IO) than others. CDF categorizes endpoints into three request budget types:- CRUD endpoints (Create, Retrieve, Request ByIDs, Update, and Delete) are less resource-intensive and receive the largest share of the overall budget.
- Analytical endpoints (List, Search, and Filter) are more resource-intensive and receive a smaller budget.
- Aggregation endpoints are the most resource-intensive and receive a dedicated sub-allocation within the analytical budget.
These limits are subject to change, pending review of changing consumption patterns and resource availability over time.
Rate limits by API
Assets
See Assets for the concept overview.Events
See Events for the concept overview.Files
See Files for the concept overview.Raw
See Raw for the concept overview. The Raw service uses concurrency and data rate limits rather than rps limits. Under high load, some deviation may occur for short periods as the service scales up.Streams
See Streams for the concept overview. As streams are intended to be long-lived, users are not expected to interact with these endpoints frequently.Records
See Records for the concept overview. Records limits vary between mutable and immutable streams. Query endpoints (Sync, Retrieve, Aggregate) share a common query budget, while Retrieve and Aggregate each have additional dedicated budgets. Limits for query endpoints (Sync, Retrieve, Aggregate) have a hierarchical structure:- All query endpoints share a common Query request budget.
- The Retrieve endpoint has an additional dedicated budget checked first.
- The Aggregate endpoint has an additional dedicated budget checked first.
For example, with mutable streams, you can make up to 40 rps total across all query endpoints (Query budget limit), but only up to 20 of those can be Retrieve requests (Retrieve budget limit) and only up to 15 can be Aggregate requests (Aggregate budget limit).This means you could make: 20 Retrieve + 15 Aggregate + 5 Sync = 40 total RPS.
- Mutable streams provide consistent high-performance queries and higher rate limits.
- Immutable streams are optimized for ingesting very large amounts of data, resulting in lower query performance and stricter rate limits.
filter and/or limiting the sources to be retrieved) rather than retrieving excessive amounts of unused data.
Records request budgets (detailed tables)
Records request budgets (detailed tables)
The Retrieve and Aggregate endpoints have dedicated budgets checked in addition to the Query request budget. A request to these endpoints must pass both budget checks.
Retrieve and Aggregate endpoint requests are checked against both their dedicated budget and the Query request budget.
Transformations
See Transformations for the concept overview. Transformations use concurrency limits rather than rps limits:- 10 parallel jobs per project
Simulators
See Simulators for the concept overview.
For simulator-specific troubleshooting and best practices, see Simulator troubleshooting.
Translating rps into data speed
A single request can retrieve up to 1000 items. In the context of Assets, Events, or Files, 1 item = 1 record. The maximum theoretical data speed at the API level is:
For analytical queries (List, Filter, Search), the per-identity budget of 23 rps gives a theoretical maximum of 23,000 items per second per identity.
Throttling response
CDF returns an HTTP429 Too Many Requests response in the following cases:
- Rate limiting — you send too many requests in a given time period.
- Concurrency limiting — you send too many concurrent (parallel) requests.
- Conflicting requests — concurrent requests try to modify the same resource (for example, two requests updating the same asset simultaneously).
Conflicting requests
Requests are considered conflicting when they concurrently try to modify the same resource. For example, if two concurrent requests update the same asset, one of them may be throttled. To avoid conflicting requests:- Instead of replicating every modification from the source system (“change log”-style updates), replicate only the latest state.
- Reduce the number of parallel workers sending write requests.
Best practices
Use exponential backoff
When you receive a429 response, retry the request after an increasing delay. A truncated exponential backoff strategy works well:
- Wait 1 second, then retry.
- If still throttled, wait 2 seconds, then retry.
- Continue doubling the wait time up to a maximum (for example, 32 seconds).
Use parallel retrieval wisely
Use parallel retrieval when a single request flow is slow due to query complexity. By splitting requests across partitions, you can tune data retrieval performance to meet your application’s needs. Use at most 10 partitions. For example, using the Assets or Events API request budget:- A single request can retrieve up to 1000 items.
- Up to 23 rps can be issued for analytical queries (per identity), such as
/listor/filter. - This provides a theoretical maximum of 23,000 items per second per identity.
- If query complexity causes a single request to take longer than 1 second, you can retrieve fewer items per request and use parallel requests up to the theoretical maximum.
Monitor your usage
- Log API call timestamps and response codes to track request patterns.
- Set up alerts for
429responses to detect when you approach limits. - Distribute requests over time rather than making burst requests.
Use unique client credentials per application
Do not share client IDs and secrets across multiple applications, even if they have common authentication requirements. Shared credentials cause applications to compete for the same per-identity budget, and can also cause issues with audit logs.Request only what you need
Reduce the data returned per request to stay within response size limits:- Use filters to narrow results.
- Limit the
sourcesor properties you retrieve. - Use appropriate page sizes (the
limitparameter) for pagination.