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 disabledNo transactions can be performed with an external bank account in the
refresh_requiredstate.
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:
- Detect the
refresh_requiredstate by pollingGET /api/external_bank_accounts/{external_bank_account_guid}. - Create a workflow with
POST /api/workflowsusingkind: link_token_updateand theexternal_bank_account_guidthat needs to be refreshed. Read theplaid_link_tokenfrom the response. - Initialize Plaid Link with the
plaid_link_tokenin update mode. - The customer re-authenticates with their financial institution through the Plaid Link flow.
- Update the external bank account state by calling
PATCH /api/external_bank_accounts/{external_bank_account_guid}withstateset tocompleted.
Manual state update requiredThe 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 therefresh_requiredstate.
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
Updated 10 days ago
