specification: API Commons Rate Limits specificationVersion: '0.1' schema: https://raw.githubusercontent.com/api-evangelist/interface-research/main/schema/api-commons.yml#/$defs/RateLimits provider: Microsoft Exchange providerId: microsoft-exchange created: '2026-05-04' # Provenance stamped 2026-08-11: this artifact was written by the API Evangelist # bulk sweep dated 2026-05-04, not harvested from the provider. See roadmap#35. method: generated modified: '2026-05-05' reconciled: true tags: - Rate Limiting - Email - Calendar - Exchange Online - Microsoft Graph - Microsoft description: Microsoft Exchange Online enforces throttling at multiple layers — Microsoft Graph mail/calendar endpoints, Exchange Web Services (EWS), Exchange Online PowerShell, and the SMTP submission service — each with distinct policies. Limits are scoped per app/tenant or per mailbox/user. Returns 429 Too Many Requests with Retry-After. sources: - https://learn.microsoft.com/en-us/graph/throttling-limits - https://learn.microsoft.com/en-us/exchange/clients-and-mobile-in-exchange-online/exchange-web-services/ews-throttling-in-exchange-online - https://learn.microsoft.com/en-us/exchange/clients-and-mobile-in-exchange-online/exchange-web-services/limits-for-active-connections-in-exo headers: retryAfter: Retry-After requestId: request-id throttleScope: x-ms-throttle-scope throttleLimit: x-ms-throttle-limit-percentage responseCodes: throttled: 429 serviceUnavailable: 503 limits: - name: Exchange Message Trace Service scope: tenant metric: requests_per_5_minutes limit: 100 timeFrame: minute - name: EWS — concurrent connections per app/mailbox scope: app/mailbox metric: concurrent_connections limit: 27 notes: 27 concurrent connections per (application, mailbox) tuple in Exchange Online - name: EWS — total connections per mailbox scope: mailbox metric: concurrent_connections limit: 27 - name: EXO PowerShell — concurrent runspaces scope: user metric: concurrent_runspaces limit: 3 notes: 3 concurrent connections per user-account in Exchange Online PowerShell - name: SMTP submission per mailbox scope: mailbox metric: messages_per_minute limit: 30 timeFrame: minute notes: 30 messages per minute per mailbox; 10,000 recipients per day per mailbox - name: Daily recipient cap per mailbox scope: mailbox metric: recipients_per_day limit: 10000 timeFrame: day - name: Microsoft Graph global ceiling scope: application metric: requests_per_10_seconds limit: 130000 timeFrame: second policies: - name: Backoff Strategy description: Honour the Retry-After header on 429 from Graph and EWS; for HTTP 503 ServerBusy use exponential backoff with jitter. - name: Use Microsoft Graph for new development description: EWS is on a deprecation path; new mail / calendar code should target the Microsoft Graph mail and calendar endpoints. - name: Use change notifications description: Subscribe to Graph change notifications instead of polling for new mail. - name: Batch and delta queries description: Use $batch and delta queries to minimise request count. - name: SMTP relay for high volume description: For application-generated mail above mailbox SMTP limits, use a connector or third-party relay; 30 msg/min and 10K recipients/day are hard mailbox caps. maintainers: - FN: Kin Lane email: kin@apievangelist.com