> For the complete documentation index, see [llms.txt](https://docs.tryterra.co/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tryterra.co/help-center/help-topics/no-data/connections-expiring-disconnecting/detect-expirations-via-webhooks-not-polling.md).

# How do I detect expired user connections?

To check whether a single connection is still valid, make a data request.

**To check whether a single connection is still valid, make a data request.** If it has been invalidated, the API returns an `authorisation has expired` error. Don't rely on the `active` flag for this.

**To detect expirations proactively, listen for** [**webhook events**](https://docs.tryterra.co/unified-api/managing-user-health-data/receiving-data-updates) **rather than polling:**

* Fitbit sends an explicit revocation notice that Terra forwards as a `deauth` webhook.
* Terra sends a `connection_error` webhook when a request it makes to the provider for that user is refused for authorisation reasons. It is sent at most once a day per connection; the user has to reconnect, and the reconnect gives a new `user_id` in the `auth` webhook.

**Don't rely on `connection_error` alone.** It only fires when Terra requests data from the provider and gets refused, so a connection can stop syncing without one, and `active` can stay `true`. Also alert when a user who normally syncs every day goes quiet.

To audit all users in an environment with their last data sync, use the `GET subscriptions` endpoint, which returns each user and their `last_webhook_update` timestamp. For a single user, `GET /v2/userInfo` returns the same field.
