# Manage inactive Financial Connections accounts

Learn why Financial Connections accounts become inactive and how to manage them.

Your customer’s linked Financial Connections accounts might become inactive for several reasons, including:

- The [OAuth](https://docs.stripe.com/financial-connections/fundamentals.md#how-stripe-links-financial-accounts) token provided to Stripe by their financial institution expires after a set period of time or because of inactivity.
- The financial institution changes their authentication requirements, such as requiring multi-factor authentication (MFA), or the customer changes their username and password.
- The customer revokes access through their online banking portal.
- The customer closes their account at their financial institution.

## Behavior by bank

The institutions in the following table require customers to reauthenticate.

| Institution name | Accounts affected | Details |
| --- | --- | --- |
| Bank of America | All accounts | The customer’s authentication expires after 1 year. |
| Bank of America | Accounts linked before July 1st, 2025 will be affected on August 1st, 2026. Accounts linked between then and April 17th, 2026 will be affected on a rolling basis. All accounts linked after April 17th, 2026 will be unaffected. | Bank of America is migrating all accounts to a new API version, and connections for accounts on the previous version will break. |

## Understand when an account becomes inactive 

We notify you when a Financial Connections account becomes inactive with the `financial_connections.account.deactivated` [webhook](https://docs.stripe.com/financial-connections/webhooks.md). Inactive Financial Connections accounts include additional status metadata in the `status_details.inactive` subhash.

You can’t repair every underlying cause for an inactive account. For example, you can’t repair a closed account unless your customer reopens it. Accounts that you can’t repair have a `status_details.inactive.action` of `none`.

You can [retrieve a Financial Connections account](https://docs.stripe.com/api/financial_connections/accounts/retrieve.md) at any time to check its status.

- The [`status_details.inactive.cause` property](https://docs.stripe.com/api/financial_connections/accounts/object.md?api-version=preview#financial_connections_account_object-status_details-inactive-cause) includes a high-level reason why a Financial Connections account is inactive. For example, when an account’s OAuth connection expires, its status is `access_expired`.
- The [`status_details.inactive.action` property](https://docs.stripe.com/api/financial_connections/accounts/object.md?api-version=preview#financial_connections_account_object-status_details-inactive-action) includes the action to take, if any, to reactivate the account. If your customer can reactivate the account by completing a relink authentication flow, its status is `relink_required`.

When `status_details.inactive.action` is `relink_required`, prompt your customer to complete the authentication flow to reactivate the account.

For example, you might create a webhook handler like the one below to process webhook events:

#### Python

```python
import stripe
import requests as r
from requests.auth import HTTPBasicAuth

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
client = stripe.StripeClient('<<YOUR_SECRET_KEY>>', stripe_version='2026-07-29.preview')

# If you're testing your webhook locally with the Stripe CLI you
# can find the endpoint's secret by running `stripe listen`
# Otherwise, find your endpoint's secret in your webhook settings in
# the Developer Dashboard
endpoint_secret = 'whsec_...'

@app.route('/webhook', methods=['POST'])
def webhook():
    event = None
    payload = request.data
    sig_header = request.headers["STRIPE_SIGNATURE"]

    try:
        event = client.construct_event(payload, sig_header, endpoint_secret)
    except ValueError as e:
        # Invalid payload
        raise e
    except stripe.error.SignatureVerificationError as e:
        # Invalid signature
        raise e

    if event["type"] == "financial_connections.account.deactivated":
        account = event["data"]["object"]

        if account["status"] == "inactive":
          if "status_details" in account:
            if account["status_details"]["inactive"]["action"] == "relink_required":
              prompt_user_to_relink(account)
          else:
            # if the account doesn't have `status_details`,
            # check that the event destination is configured
            # with the most recent public preview API version
        else:
          # No action to be taken.

    return jsonify(success=True)
```

The `status` and `status_details` of an account are also available when you retrieve a Financial Connections account.

```curl
curl https://api.stripe.com/v1/financial_connections/accounts/{{FINANCIALCONNECTIONSACCOUNT_ID}} \
  -u "<<YOUR_SECRET_KEY>>:" \
  -H "Stripe-Version: 2026-07-29.preview"
```

```json
{
  "id": "{{ACCOUNT_ID}}",
  "object": "financial_connections.account",
  //...,
  "authorization": "{{AUTHORIZATION_ID}}",
  "status": "inactive",
  "status_details": {
    "inactive": {
      "action": "relink_required",
      "cause": "access_expired"
    }
  }
}
```

## Understand when an account will become inactive in the future 

In some cases, such as when the [OAuth](https://docs.stripe.com/financial-connections/fundamentals.md#how-stripe-links-financial-accounts) token provided to Stripe by their financial institution expires after a set period of time, the API will provide information about when the account is expected to become `inactive`.

To determine whether an account falls into this category, [retrieve the Account](https://docs.stripe.com/api/financial_connections/accounts/retrieve.md) and check the additional metadata in the `status_details.active` subhash. If the subhash is empty, we don’t have information about future deactivation for this account.

- The `status_details.active.expected_deactivation_date` property includes the estimated date at which this account will become inactive.
- The [`status_details.active.cause` property](https://docs.stripe.com/api/financial_connections/accounts/object.md#financial_connections_account_object-status_details-active-cause) includes a high-level reason why we expect the Financial Connections account to become `inactive`. For example, when an account’s OAuth connection expires after a set period of time, its status would be `access_expired`.
- The [`status_details.active.action` property](https://docs.stripe.com/api/financial_connections/accounts/object.md#financial_connections_account_object-status_details-active-action) includes the action to take, if any, to prevent the account from becoming `inactive`. We set this property to `relink_required` when we expect completing the relink authentication flow to meaningfully change the `expected_deactivation_date`. For example, we won’t recommend prompting your user to relink their account until 30 days before deactivation for time-based OAuth expiration.

We notify you 30 days before a Financial Connections account is expected to deactivate with the `financial_connections.account.upcoming_deactivation` [webhook](https://docs.stripe.com/financial-connections/webhooks.md). When you receive this webhook, it is a good time to ask your customer to [relink](https://docs.stripe.com/financial-connections/relink.md) their account, or connect a new account, to avoid interruptions to data access.

If your integration prompts users to repair any Financial Connections account at the same institution rather than a specific account, you can view the `status_details.active` subhash on the [Financial Connections Authorization](https://docs.stripe.com/api/financial_connections/authorizations.md?api-version=preview) and listen to the `financial_connections.authorization.upcoming_deactivation` [webhook](https://docs.stripe.com/financial-connections/webhooks.md) instead.

## Learn more

- [Relink](https://docs.stripe.com/financial-connections/relink.md): Repair `inactive` accounts with the streamlined relink flow.
