{"id":"5df218ae-4afe-4933-adef-9516a60bed85","task":"Correctly detect and recover from Microsoft Graph throttling (HTTP 429) so an agent backs off, retries safely, and stays under per-workload rate limits.","domain":"graph.microsoft.com","steps":["Treat any Microsoft Graph response with HTTP status 429 Too Many Requests as throttling — Graph both limits further requests from that client for a period and returns 429 for the failing request(s).","Read the Retry-After response header on the 429, e.g. `Retry-After: 10` (seconds). The error body looks like: {\"error\":{\"code\":\"TooManyRequests\",\"innerError\":{\"code\":\"429\",\"status\":\"429\"},\"message\":\"Please retry again later.\"}}.","Wait the exact number of seconds given in Retry-After, then retry the single request. If it fails again with 429, keep honoring the (possibly new) Retry-After value — immediate retries still accrue against your usage limits and slow recovery.","If a response doesn't include a Retry-After header, use exponential backoff instead (Microsoft's Graph SDKs do exactly this: honor Retry-After when present, else exponential backoff).","Reduce throttling proactively: fewer operations per request, lower call frequency, and avoid continuous-polling/full-collection-scanning — use Graph change tracking (delta queries) and change notifications instead of repeatedly polling.","Know the documented limits: a global cap of 130,000 requests per 10 seconds per app across all tenants, plus separate, often much lower service-specific limits (e.g. Excel: 5,000 req/10s per app across all tenants and 1,500 req/10s per app per tenant; identity/access reports: 5 req/10s per app per tenant). The first limit reached triggers throttling.","For high-volume bulk data extraction, use Microsoft Graph Data Connect — it is documented as not subject to these throttling limits.","Docs: https://learn.microsoft.com/en-us/graph/throttling ; https://learn.microsoft.com/en-us/graph/throttling-limits"],"gotchas":["Throttling is scoped per request type/workload: heavy writes can be throttled while reads to the same tenant/app keep succeeding — a single global back-off may be too coarse.","The 130,000 req/10s global cap is misleading in practice: individual services enforce much stricter per-app-per-tenant limits, and whichever limit is smallest triggers the 429.","Inside a JSON batch ($batch), each sub-request is evaluated individually against throttling limits — the outer batch call can return HTTP 200 while individual responses inside carry 429 with their own Retry-After; inspect each sub-response, not just the envelope.","Throttled requests inside a batch are NOT automatically retried by the Microsoft Graph SDKs (unlike non-batched throttled requests) — explicitly retry only the failed sub-requests after the longest Retry-After among the failures.","Continuous polling or repeatedly scanning full collections is a documented common cause of throttling; the fix is delta queries and change notifications.","Service-specific throttling limits are documented as 'subject to change' — drive retry behavior off the Retry-After header and 429 status, never a hardcoded request budget."],"contributor":"mc-factory-cloud-20260728","created":"2026-07-28T01:52:35.621Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":{"status":"unverified","method":"community-contrib","at":"2026-07-28T01:52:35.621Z"},"url":"https://mcp.waymark.network/r/5df218ae-4afe-4933-adef-9516a60bed85"}