An Azure service that provides private connections between Azure datacenters and infrastructure, either on premises or in a colocation environment.
Hello @Peter Stieber
Based on the details you've provided, I agree that this does not look like the documented ARM subscription-level throttling limit.
Microsoft documents the current ARM read limit as a token bucket of 250 subscription reads with a refill rate of 25 requests/sec, while the Microsoft.Network resource provider has a separate general limit of 10,000 read operations per 5 minutes. When those documented limits are reached, Azure normally returns HTTP 429 (Too Many Requests) together with a Retry-After value.
In your case, the remaining subscription-read headers are effectively full when the failure occurs:
x-ms-ratelimit-remaining-subscription-reads: 249
x-ms-ratelimit-remaining-subscription-global-reads: 3749
That strongly suggests the request is getting through ARM and is being throttled further downstream, likely within the Microsoft.Network/ExpressRoute backend handling ListRoutesTable, rather than by the standard ARM subscription quota. The fact that the adjacent ARP-table operation continues to succeed under the same request pattern supports that conclusion.
The other unusual part is the HTTP 500 containing a throttling/429-style message. According to the documented throttling behavior, a genuine ARM or resource-provider throttle should normally surface as 429. Microsoft does note that resource providers can apply their own throttling independently of ARM, but I couldn't find a published per-operation or per-circuit limit specifically for GetExpressRoutePeeringRouteTable / ListRoutesTable.
The reported "0 requests per 16,332,284 seconds" window is also not consistent with any of the documented ARM or Microsoft.Network throttling windows. I would therefore treat that value as potentially coming from an internal backend quota/counter rather than an intentional public API limit.
As a mitigation, I would still serialize or reduce parallel ListRoutesTable calls and implement exponential backoff, since that may reduce pressure on the backend. However, given that you've reproduced this across multiple subscriptions and only this specific operation is affected, I don't think client-side throttling alone explains the behavior.
At this point, this would be appropriate for the Azure ExpressRoute/Microsoft.Network engineering team to review. If possible, please capture and provide through a Microsoft support case or moderator private message:
Subscription and ExpressRoute circuit IDs
- Azure region
- UTC timestamp of a failed request
- x-ms-request-id / correlation ID
- Complete response headers and error body
- API version (2024-05-01)
- Approximate request concurrency/rate
- Confirmation that GetExpressRouteCircuitArpTable succeeds at the same time
Those identifiers should allow the backend team to determine which throttle or internal counter is actually generating the response.
Microsoft Moderator Suchitra Suregaunkar, Please assist Peter on this? Thank you.
Please "Accept the Answer" if this information helped you. This will help us and others in the community as well.