GuidesRecipesAPI ReferenceChangelog
Guides

Refresh External Bank Accounts

How do I refresh an expired Plaid bank connection?

Overview

Plaid bank connections expire periodically and require the customer to re-authenticate with their financial institution. When a connection expires, the external bank account's state transitions to refresh_required and the account cannot be used for transactions until the customer completes Plaid's Update Mode flow.

❗️

Transactions disabled

No transactions can be performed with an external bank account in the refresh_required state.

Detect the refresh_required state

Poll GET /api/external_bank_accounts/{external_bank_account_guid} and check the state field.

{
  "guid": "external_bank_account_guid",
  "name": "Customer Checking Account",
  "asset": "USD",
  "account_kind": "plaid",
  "bank_guid": "bank_guid",
  "customer_guid": "customer_guid",
  "state": "refresh_required",
  "failure_code": null,
  "created_at": "2026-01-01T12:00:00.000Z",
  "updated_at": "2026-01-15T12:00:00.000Z"
}

Refresh the bank connection

Guide the customer through Plaid's Update Mode in five steps:

  1. Detect the refresh_required state by polling GET /api/external_bank_accounts/{external_bank_account_guid}.
  2. Create a workflow with POST /api/workflows using kind: link_token_update and the external_bank_account_guid that needs to be refreshed. Read the plaid_link_token from the response.
  3. Initialize Plaid Link with the plaid_link_token in update mode.
  4. The customer re-authenticates with their financial institution through the Plaid Link flow.
  5. Update the external bank account state by calling PATCH /api/external_bank_accounts/{external_bank_account_guid} with state set to completed.
⚠️

Manual state update required

The Platform does not automatically update the external bank account state after the customer re-authenticates. Your application must explicitly call PATCH /api/external_bank_accounts/{external_bank_account_guid} with { "state": "completed" } to transition the account out of the refresh_required state.

Create the update workflow

POST /api/workflows
Content-Type: application/json
Authorization: Bearer YOUR_TOKEN

{
  "type": "plaid",
  "kind": "link_token_update",
  "language": "en",
  "link_customization_name": "default",
  "external_bank_account_guid": "external_bank_account_guid",
  "redirect_uri": "https://yourapp.com/api/plaid-redirect-uri"
}

Finalize the refresh

After the customer completes the Plaid Link update flow, call the patch external bank account endpoint to finalize the refresh:

PATCH /api/external_bank_accounts/{external_bank_account_guid}
Content-Type: application/json
Authorization: Bearer YOUR_TOKEN

{
  "state": "completed"
}

Sandbox testing

To test the full update mode flow, force an external bank account into the refresh_required state using the patch external bank account endpoint:

PATCH /api/external_bank_accounts/{external_bank_account_guid}
Content-Type: application/json
Authorization: Bearer YOUR_TOKEN

{
  "state": "refresh_required"
}

This simulates an expired bank connection so you can verify that your application handles the update mode flow correctly.

Next steps