An API that connects multiple Microsoft services, enabling data access and automation across platforms
Hi Derek,
What you're seeing is a known quota counter desynchronization issue in Microsoft Graph.
The subscription quota for /teams/getAllMessages is tracked in a backend counter that is separate from the subscription records returned by GET /v1.0/subscriptions. When a subscription expires or is deleted, the visible record is removed correctly, but the quota decrement can fail silently — leaving the counter incremented with no corresponding subscription to show for it.
This is why your GET /subscriptions returns empty while the quota is still blocked. The two data stores are not always consistent.
A few things worth noting:
- The /teams/getAllMessages resource has a very low quota ceiling compared to other subscription resources — in some tenant configurations it is limited to a single active subscription per app registration. This makes the desync more impactful when it happens.
- The model=A vs no-model difference you tested is relevant — model=A and modelless subscriptions are tracked under the same quota for this resource, so switching between them does not work around the block.
- The /chats/getAllMessages subscription working fine is consistent with this being resource-specific quota tracking. The counters are maintained separately per resource type.
There is no self-service reset available for this. The quota counter can only be corrected by Microsoft on the backend. You will need to open a support ticket via the Azure portal.
When you do, include:
- Your request ID: a7db821c-8981-4721-ab30-bd513fb5dc3c
- Your app registration client ID
- The tenant ID
- A timestamp of when the last known subscription was active or deleted
- Confirmation that GET /v1.0/subscriptions and GET /beta/subscriptions both return empty
Support can inspect the backend quota table directly and manually decrement or reset the counter for your tenant and app combination.
In the meantime there is no known workaround — a different app registration on the same tenant will hit the same tenant-level quota if the limit is tenant-scoped rather than app-scoped, which varies by model.
I hope that helps.