Microsoft Teams Error Guide: 'reauthorizationRequired' Graph Subscription Lifecycle — Renew and Reauthorize
Fix Microsoft Graph 'reauthorizationRequired' events for Teams subscriptions: handle the event, reauthorize then renew, and stop missing channel messages.
- #microsoft-teams
- #adaptive-cards
- #troubleshooting
- #errors
Stuck on this Microsoft Teams error? Get the free incident triage checklist
A one-page PDF — the exact steps to isolate, fix, and verify a production error like this one. No spam, unsubscribe anytime.
Overview
Microsoft Graph delivers a lifecycle notification with lifecycleEvent: reauthorizationRequired when a Teams change subscription (for chat messages, channel messages, or presence) needs its authorization refreshed. If your service ignores it, Graph stops delivering change notifications and your bot silently goes deaf.
{
"value": [{
"subscriptionId": "8ee44408-0679-472a-bc02-4f6e0b3f3f2b",
"subscriptionExpirationDateTime": "2026-07-10T18:23:45.0000000Z",
"lifecycleEvent": "reauthorizationRequired",
"resource": "teams/{team-id}/channels/{channel-id}/messages",
"tenantId": "aaaabbbb-cccc-dddd-eeee-ffff00001111"
}]
}
Symptoms
- Change notifications for Teams messages stop arriving even though the subscription hasn’t expired yet.
- Your
lifecycleNotificationUrlreceivesreauthorizationRequired(and sometimessubscriptionRemoved) events you aren’t handling. - Messages posted during a token/credential rotation window are never delivered.
- Subscriptions to
/teams/.../messagesor/chats/.../messagesare especially affected because they carry short, frequently re-validated authorization. - Renewal calls succeed but notifications remain dark until you also reauthorize.
Common Root Causes
- No lifecycle handler — the subscription was created without a
lifecycleNotificationUrl, or the endpoint drops the event. - Ignoring reauthorizationRequired — treating lifecycle events as informational instead of acting on them.
- Credential/consent change — an admin revoked or re-consented an app permission, invalidating the subscription’s cached authorization.
- Encryption certificate rotation — for rich (resource-data) notifications, the
encryptionCertificatechanged and Graph wants reauthorization. - Clock/expiry drift — not renewing before
subscriptionExpirationDateTime; Teams message subscriptions max out around 60 minutes and must be renewed aggressively.
Diagnostic Workflow
Confirm the subscription and its short expiry window:
curl -H "Authorization: Bearer ${GRAPH_TOKEN}" \
"https://graph.microsoft.com/v1.0/subscriptions/${SUBSCRIPTION_ID}"
{
"id": "8ee44408-0679-472a-bc02-4f6e0b3f3f2b",
"resource": "teams/{team-id}/channels/{channel-id}/messages",
"changeType": "created,updated",
"notificationUrl": "https://ops.example.com/graph/notify",
"lifecycleNotificationUrl": "https://ops.example.com/graph/lifecycle",
"expirationDateTime": "2026-07-10T18:23:45Z"
}
Reauthorize the subscription in response to the lifecycle event:
curl -X POST -H "Authorization: Bearer ${GRAPH_TOKEN}" \
"https://graph.microsoft.com/v1.0/subscriptions/${SUBSCRIPTION_ID}/reauthorize"
Then renew (extend) it, capping at the resource maximum:
curl -X PATCH -H "Authorization: Bearer ${GRAPH_TOKEN}" \
-H "Content-Type: application/json" \
"https://graph.microsoft.com/v1.0/subscriptions/${SUBSCRIPTION_ID}" \
-d '{ "expirationDateTime": "2026-07-10T19:20:00Z" }'
Your lifecycle endpoint must echo validationToken on setup and 202 the events fast:
POST /graph/lifecycle?validationToken=abc -> 200 text/plain "abc"
POST /graph/lifecycle (event body) -> 202 Accepted (then process async)
Example Root Cause Analysis
An on-call bot subscribed to teams/{team}/channels/{channel}/messages to mirror incident chatter into a war-room dashboard. It renewed subscriptions every 50 minutes but never implemented a lifecycleNotificationUrl. During a routine app-secret rotation, Graph emitted reauthorizationRequired — which went nowhere — and stopped delivering notifications. The renewal PATCH kept succeeding (extending expiry), so monitoring showed a “healthy” subscription while the war-room feed silently stalled for 40 minutes.
The fix: add a lifecycleNotificationUrl, and on reauthorizationRequired call POST /subscriptions/{id}/reauthorize immediately, followed by a PATCH renewal. They also added a watchdog that alerts if no notification arrives within 2x the expected interval, so a dark subscription pages a human instead of hiding behind a green expiry timestamp.
Prevention Best Practices
- Always create Teams message subscriptions with both
notificationUrlandlifecycleNotificationUrl. - Handle
reauthorizationRequiredby calling/reauthorize, then renew; handlesubscriptionRemovedby recreating the subscription. - Renew well before expiry — Teams message subscriptions are short-lived (~60 min); renew at ~50%.
- Persist subscription IDs and expiry, and run a reconciliation loop that recreates missing subscriptions.
- Add a liveness watchdog: alert when zero notifications arrive within an expected window, independent of expiry.
- Keep the encryption certificate current for resource-data notifications and reauthorize after rotation.
Quick Command Reference
# Reauthorize after a lifecycle event
curl -X POST -H "Authorization: Bearer $T" \
https://graph.microsoft.com/v1.0/subscriptions/$SUB/reauthorize
# Renew (extend expiry)
curl -X PATCH -H "Authorization: Bearer $T" -H "Content-Type: application/json" \
https://graph.microsoft.com/v1.0/subscriptions/$SUB \
-d '{"expirationDateTime":"2026-07-10T19:20:00Z"}'
# List all subscriptions to find stale ones
curl -H "Authorization: Bearer $T" https://graph.microsoft.com/v1.0/subscriptions
# Recreate after subscriptionRemoved
curl -X POST -H "Authorization: Bearer $T" -H "Content-Type: application/json" \
https://graph.microsoft.com/v1.0/subscriptions -d @subscription.json
Conclusion
reauthorizationRequired is Graph asking you to re-prove your subscription’s authorization before it keeps streaming Teams changes. Because a renewed subscription can still be un-reauthorized, expiry timestamps alone lie about health. Implement a lifecycle endpoint, reauthorize then renew on every event, recreate on removal, and add a delivery watchdog. That combination keeps your Teams message notifications flowing through credential rotations and consent changes instead of going silently dark.
Fixed it? Get 500 Microsoft Teams & DevOps AI prompts — free
500 battle-tested, copy-paste AI prompts engineered by a senior systems engineer — every one with fill-in placeholders and safety/back-out notes. Drop your email and it's yours.
- 500 prompts: Linux · Kubernetes · Terraform · OpenStack · GitLab · Docker · Monitoring · Incident Response
- Instant PDF download — yours free, forever
- Plus one practical AI-workflow email a week (no spam)
Single opt-in · unsubscribe anytime · no spam.
Did this fix your issue?
Get 500 Battle-Tested DevOps AI Prompts — Free
500 battle-tested, copy-paste AI prompts engineered by a senior systems engineer — every one with fill-in placeholders and safety/back-out notes. Drop your email and it's yours.
- 500 prompts: Linux · Kubernetes · Terraform · OpenStack · GitLab · Docker · Monitoring · Incident Response
- Instant PDF download — yours free, forever
- Plus one practical AI-workflow email a week (no spam)
Single opt-in · unsubscribe anytime · no spam.