Understanding ARM throttling limits applicable for Usages/Quotas List API

Pawan Rawal 5 Reputation points
2025-03-19T03:26:47.2066667+00:00

Hi,

I am using the following ARM APIs to retrieve usage and quota information for resources under the Microsoft.Compute provider across multiple subscriptions.

While using them I am getting throttling 429 errors.

--------------------------------------------------------------------------------
RESPONSE 429: 429 Too Many Requests
ERROR CODE: RequestThrottled
--------------------------------------------------------------------------------
{
  "error": {
    "code": "RequestThrottled",
    "message": "The request was throttled, please retry after 300 seconds."
  }
}

I tried printing the response headers from the response and I see that I am not exceeding the subscription or global limits based on these values. Sample values shown below.

headers.X-Ms-Ratelimit-Remaining-Subscription-Global-Reads[0]: 3749 
headers.X-Ms-Ratelimit-Remaining-Subscription-Reads[0]: 249

I also reviewed this article on throttling: Azure Throttling and Request Limits. Based on this, my understanding is that throttling limits apply per subscription, service principal, and operation type. The response headers indicate that these limits are not being exceeded. Are there any additional limits at the provider or tenant level that might be reached?

Azure Virtual Machines
Azure Virtual Machines

An Azure service that is used to provision Windows and Linux virtual machines.


1 answer

Sort by: Most helpful
  1. Arko 4,180 Reputation points Moderator
    2025-03-27T14:58:17.86+00:00

    Hello Pawan Rawal, you're right that the API endpoints you're calling (/usages and /quotas) are scoped at the subscription level — meaning they require a subscription ID in the URL, and they return usage/quota data per subscription.

    However Azure throttling is enforced not just based on the API's URI scope but also based on the identity and rate of total requests coming from that identity.

    According to the official ARM throttling documentation:

    "These limits are scoped to the security principal (user or application) making the requests and the subscription ID or tenant ID."

    This means both subscription- and tenant-level limits can apply simultaneously.

    So Why Is a Tenant-Level Limit Being Hit?

    Ans- You're using a single service principal to make many calls (300+ calls/sec), even if each is to a different subscription.

    Please note, azure applies tenant-level throttling to avoid overload when a single identity floods ARM, even across subscriptions. So even though each call is technically scoped to a subscription, the rate at which they’re being made by a single security principal (your service principal) across the tenant exceeds the tenant-level limits.

    enter image description here

    That means - you can be throttled per subscription or per tenant and the limits apply per identity (SPN, user, etc.)

    So, based on your usage pattern, lots of concurrent subscription-level calls made by one SPN and hence can hit tenant-level limits, especially now that Azure enforces regional and identity-based token bucket throttling (25 req/sec at tenant scope, as per 2024 changes).

    Was this answer helpful?

    0 comments No comments

Your answer

Answers can be marked as 'Accepted' by the question author and 'Recommended' by moderators, which helps users know the answer solved the author's problem.