Everything an AI agent can do with the Plaid API.

A reference guide for building AI agents: every method, how to authenticate, and the permissions each one needs.

Endpoints24
API version2020-09-14
Last updated23 June 2026
Orientation

How the Plaid API works.

The Plaid API is how an app or AI agent connects to a person's bank to read transactions, pull account and routing numbers, check balances, fetch identity, or read investments, liabilities, and income. Access is granted through a client_id and secret, plus an access token for the connected bank, and each product like Auth or Transactions must be enabled and consented to before its endpoints return anything. Plaid pins the API to a dated version and pushes events to a webhook when data changes.

24Endpoints
9Capability groups
16Read
8Write
10Permissions
Authentication
Plaid authenticates almost every call with a client_id and secret, sent in the JSON body or the PLAID-CLIENT-ID and PLAID-SECRET headers, not OAuth. The secret is tied to one environment, Sandbox or Production, so the same call runs against simulated or live data depending on which secret is used. Most product endpoints also need an access_token that names the connected bank Item to act on.
Permissions
Plaid has no OAuth scopes on first-party calls. What an agent can reach is gated by Products, like Auth, Transactions, Identity, Investments, Liabilities, and Income, which must be enabled when the Item is created in /link/token/create and consented to by the account holder. An endpoint returns data only if its product is turned on for that Item, so access is governed by product configuration plus user consent rather than by a token scope.
Versioning
Plaid pins the API to a dated version through the Plaid-Version header, with the current version dated 2020-09-14. A fixed date keeps response shapes stable, and moving to a newer dated version is a deliberate choice that can carry breaking changes, like the 2020-09-14 cut that removed public_key auth in favour of client_id and secret.
Data model
Plaid is built around the Item, one login at one financial institution, holding one or more accounts. A user connects an Item through Link, which returns a public_token that /item/public_token/exchange turns into a long-lived access_token. Every endpoint is a POST that takes a JSON body and returns JSON, and a state change is announced by a webhook carrying a webhook_type and webhook_code.
Connect & authenticate

Connection & authentication methods.

How an app or AI agent connects to Plaid determines what it can reach. A call is made against a Plaid environment with a client_id and secret, an access token names which connected bank Item it acts on, and Plaid pushes events to a registered webhook. A hosted server also exposes Plaid dashboard tools to agents.

Ways to connect

REST API

The REST API takes JSON request bodies over HTTPS and returns JSON. Every endpoint is a POST, called against a Plaid environment at https://sandbox.plaid.com or https://production.plaid.com. A call carries a client_id and secret, and most calls also carry an access_token naming the connected Item to act on. The Plaid-Version header pins the dated API version.

Best forConnecting an app or AI agent to Plaid.
Governed byThe client_id and secret, plus the products enabled on the Item and the account holder's consent.
Docs ↗

Webhooks

Plaid POSTs a JSON webhook to the URL registered on an Item when data changes or an asynchronous job finishes. Each carries a webhook_type and webhook_code. The receiver verifies the Plaid-Verification header, a JWT signed with ES256, by fetching the public key from /webhook_verification_key/get, checking the request_body_sha256 claim against the raw body, and rejecting anything older than 5 minutes.

Best forReceiving Plaid events at an app or AI agent.
Governed byThe JWT signature and the verification key.
Docs ↗

Dashboard MCP server

A hosted Model Context Protocol server at https://api.dashboard.plaid.com/mcp/ exposes Plaid dashboard tools to AI agents, for debugging Items, reviewing Link conversion analytics, and checking usage metrics. It authenticates with an OAuth token carrying the mcp:dashboard scope, obtained through the client_credentials grant. Plaid notes the server is under active development with limited support, so it is not yet a stable interface.

Best forConnecting an AI agent to Plaid dashboard diagnostics through MCP.
Governed byThe OAuth token and its mcp:dashboard scope.
Docs ↗
Authentication

client_id and secret

Almost every Plaid endpoint authenticates with a client_id and a secret, sent in the JSON request body or in the PLAID-CLIENT-ID and PLAID-SECRET headers. The secret is specific to one environment, either Sandbox or Production, so the same call runs against simulated or live data depending on which secret is used. There are no OAuth scopes on first-party calls; what a call can reach is set by the products enabled on the Item, not by the credential.

Tokenclient_id + secret (per environment)
Best forServer-side calls to the Plaid API.
Docs ↗

Item access_token

Most product endpoints also require an access_token, returned by /item/public_token/exchange after a user connects a bank through Link. The token represents one connected Item and names which accounts and products a call acts on. It can be rotated with /item/access_token/invalidate and revoked by removing the Item.

TokenItem access_token (access-...)
Best forActing on a specific connected bank Item.
Docs ↗

Dashboard MCP OAuth

The hosted Dashboard MCP server uses an OAuth token rather than the client_id and secret. The token is minted through the client_credentials grant at the OAuth token endpoint, carries the mcp:dashboard scope, and expires after 15 minutes, with a refresh token to renew it.

TokenOAuth bearer token (mcp:dashboard scope)
Best forAuthenticating an AI agent to the Dashboard MCP server.
Docs ↗
Capability map

What an AI agent can do in Plaid.

The Plaid API is split into products an agent can act on, like Transactions, Auth, Identity, Investments, Liabilities, and Income. Each product must be enabled on an Item and consented to by the account holder before its endpoints return data, so what an agent can reach depends on which products are turned on, not on a token scope.

Link & tokens

2 endpoints

Methods for starting a Link session and minting the tokens that connect a bank.

A write here starts a connection flow and decides which products an Item can use.
View endpoints

Items

5 endpoints

Methods for exchanging tokens and managing a connected bank Item.

A write here can invalidate tokens or remove a connected bank entirely.
View endpoints

Accounts

2 endpoints

Methods for listing accounts on an Item and reading balances.

A read here exposes account names, masks, and balances.
View endpoints

Transactions

4 endpoints

Methods for reading transaction history and recurring streams.

A read here exposes a person's full transaction history.
View endpoints

Auth

1 endpoint

Methods for reading bank account and routing numbers for money movement.

A read here exposes account and routing numbers used to move money.
View endpoints

Identity

2 endpoints

Methods for reading account-holder identity and matching it against supplied data.

A read here exposes names, emails, phone numbers, and addresses on file.
View endpoints

Investments

3 endpoints

Methods for reading investment holdings and investment transactions.

A read here exposes holdings, securities, and investment activity.
View endpoints

Liabilities

1 endpoint

Methods for reading loan and credit-account liability data.

A read here exposes credit, mortgage, and student-loan details.
View endpoints

Income

4 endpoints

Methods for creating a user and reading bank and payroll income.

A read here exposes income, paystubs, and employment data.
View endpoints
Endpoint reference

Every Plaid API method.

Filter by method, access, or permission, or search any path. Select a row for version detail, rate limits, the related webhook event, and the source.

MethodEndpointWhat it doesAccessPermissionVersion
Methods for starting a Link session and minting the tokens that connect a bank.2

The products array set here decides which product endpoints the resulting Item can call.

Acts onlink_token
Permission (capability)Link
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Used by Hosted Link and Multi-Item Link, where tokens are not returned via a front-end callback.

Acts onlink_token
Permission (capability)Link
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Items

Methods for exchanging tokens and managing a connected bank Item.5

The access_token returned here is required by every product endpoint that acts on the Item.

Acts onaccess_token
Permission (capability)Items
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Read-only.

Acts onitem
Permission (capability)Items
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Irreversible for that connection; required to stop billing on the Item.

Acts onitem
Permission (capability)Items
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Plaid sends a WEBHOOK_UPDATE_ACKNOWLEDGED webhook to the new URL on success.

Acts onitem
Permission (capability)Items
VersionAvailable since the API’s base version
Webhook eventitem-webhook-update-acknowledged
Rate limitStandard limits apply

Used for credential rotation after a suspected leak.

Acts onaccess_token
Permission (capability)Items
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Accounts

Methods for listing accounts on an Item and reading balances.2

Free to call; returns cached balances rather than a real-time check.

Acts onaccount
Permission (capability)Accounts
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Gated by the Balance product, sold only alongside another product such as Auth or Transactions.

Acts onbalance
Permission (capability)Balance
VersionAvailable since the API’s base version
Webhook eventNone
Rate limit5/min, 30/hr per Item

Transactions

Methods for reading transaction history and recurring streams.4

Cursor-based; pair with the SYNC_UPDATES_AVAILABLE webhook to fetch only on change.

Acts ontransaction
Permission (capability)Transactions
VersionAvailable since the API’s base version
Webhook eventtransactions-sync-updates-available
Rate limit50/min per Item

Superseded by /transactions/sync for new integrations.

Acts ontransaction
Permission (capability)Transactions
VersionAvailable since the API’s base version
Webhook eventNone
Rate limit30/min per Item

Read-only.

Acts onrecurring_transaction
Permission (capability)Transactions
VersionAvailable since the API’s base version
Webhook eventtransactions-recurring-update
Rate limitStandard limits apply

An on-demand refresh that is billed separately and tightly rate-limited.

Acts ontransaction
Permission (capability)Transactions
VersionAvailable since the API’s base version
Webhook eventNone
Rate limit2/min, 120/hr, 2,880/day per Item

Auth

Methods for reading bank account and routing numbers for money movement.1

Gated by the Auth product; returns ACH, EFT, BACS, or IBAN numbers depending on region.

Acts onaccount_numbers
Permission (capability)Auth
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Identity

Methods for reading account-holder identity and matching it against supplied data.2

Only name data is guaranteed; other fields come back empty if the institution does not provide them.

Acts onowner
Permission (capability)Identity
VersionAvailable since the API’s base version
Webhook eventNone
Rate limit15/min per Item

Returns match scores from 0 to 100 for name, phone, email, and address.

Acts onowner
Permission (capability)Identity
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Investments

Methods for reading investment holdings and investment transactions.3

Read-only.

Acts onholding
Permission (capability)Investments
VersionAvailable since the API’s base version
Webhook eventholdings-default-update
Rate limitStandard limits apply

Read-only; paginated and returned in reverse-chronological order.

Acts oninvestment_transaction
Permission (capability)Investments
VersionAvailable since the API’s base version
Webhook eventinvestments-transactions-default-update
Rate limitStandard limits apply

An on-demand refresh without requiring the user to re-authenticate.

Acts oninvestment_transaction
Permission (capability)Investments
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Liabilities

Methods for reading loan and credit-account liability data.1

Read-only; includes APRs, payment terms, and balances.

Acts onliability
Permission (capability)Liabilities
VersionAvailable since the API’s base version
Webhook eventliabilities-default-update
Rate limitStandard limits apply

Income

Methods for creating a user and reading bank and payroll income.4

Called before /link/token/create for Income, Plaid Check, Multi-Item Link, and Plaid Protect.

Acts onuser
Permission (capability)Income
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Read-only; analyzes deposits to identify income sources, amounts, and frequencies.

Acts onbank_income
Permission (capability)Income
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Read-only; sourced from connected payroll providers or uploaded documents.

Acts onpayroll_income
Permission (capability)Income
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply

Read-only.

Acts onsession
Permission (capability)Income
VersionAvailable since the API’s base version
Webhook eventNone
Rate limitStandard limits apply
No endpoints match those filters.
Webhooks

Webhook events.

Plaid notifies an app when something changes on an Item or when an asynchronous job finishes, like new transactions being ready to fetch or an Item entering an error state. It sends a JSON body naming a webhook_type and webhook_code, so an integration learns about activity without polling.

EventWhat it signalsTriggered by
TRANSACTIONS: SYNC_UPDATES_AVAILABLENew transaction updates are ready to fetch through /transactions/sync./transactions/sync
TRANSACTIONS: RECURRING_TRANSACTIONS_UPDATERecurring transaction streams on an Item have new updates./transactions/recurring/get
HOLDINGS: DEFAULT_UPDATENew or changed investment holdings are available to fetch./investments/holdings/get
INVESTMENTS_TRANSACTIONS: DEFAULT_UPDATENew investment transactions are available to fetch./investments/transactions/get
LIABILITIES: DEFAULT_UPDATENew or updated liabilities have been detected on a liabilities Item./liabilities/get
ITEM: WEBHOOK_UPDATE_ACKNOWLEDGEDAn Item's webhook URL was updated, confirmed at the new URL./item/webhook/update
No events match that search.
Rate limits & pagination

Rate limits, pagination & request size.

Plaid limits how often each endpoint can be called, both per connected Item and across the whole account, and the ceilings differ by endpoint.

Request rate

Plaid limits each endpoint both per connected Item and across the whole account, and the ceilings differ by endpoint. Per Item, /transactions/sync allows 50 requests a minute, /transactions/get 30, /identity/get 15, /accounts/balance/get 5 a minute and 30 an hour, and the on-demand /transactions/refresh just 2 a minute, 120 an hour, and 2,880 a day; per account the ceilings run far higher, like 20,000 a minute for /transactions/get. Going over returns HTTP 429 with error_type RATE_LIMIT_EXCEEDED and an endpoint-specific code such as TRANSACTIONS_LIMIT or ACCOUNTS_LIMIT. Per-method ceilings are shown on each row.

Pagination

Pagination depends on the product. /transactions/sync is cursor-based: it returns added, modified, and removed transactions plus a next_cursor and a has_more flag, and a caller keeps calling until has_more is false. Older endpoints like /transactions/get and /investments/transactions/get use offset and count over a date range. A request is capped by a per-call count, so large result sets are read across several pages.

Request size

A single /transactions/get or /investments/transactions/get call returns at most 500 transactions, set by the count parameter, with offset advancing through the rest. /transactions/sync caps each page at 500 by default through its count parameter. Investment transaction history reaches back up to 24 months.

Errors

Status codes & error handling.

The status codes an agent should handle, and what to do about each.

StatusCodeMeaningWhat to do
400INVALID_REQUESTThe request was malformed, for example a missing or unknown field or a structurally bad body.Read error_message, fix the request shape, and resend. It is not retryable as-is.
400INVALID_INPUTThe request was well-formed but a value was wrong, like a bad access_token or invalid credentials.Correct the offending field, such as the access_token or client_id and secret, and resend.
429RATE_LIMIT_EXCEEDEDToo many requests hit a per-Item or per-client limit, with a specific code like TRANSACTIONS_LIMIT or ACCOUNTS_LIMIT.Back off and retry with exponential backoff, and smooth the request rate per Item.
400ITEM_ERRORSomething is wrong with the Item itself, for example ITEM_LOGIN_REQUIRED when stored credentials are no longer valid.Send the user through Link's update mode to repair the Item before retrying.
400INSTITUTION_ERRORThe financial institution is unavailable or returned an error, often a temporary outage on its side.Treat as transient: retry later with backoff and surface a try-again message to the user.
500API_ERRORAn internal error on Plaid's side, or planned maintenance.Retry with backoff, and contact Plaid support if it persists.
Versioning & freshness

Version history.

Plaid pins the API to a dated version through the Plaid-Version header, so a fixed date keeps response shapes stable until an integration chooses to move up.

Version history

What changed, and when

Latest version2020-09-14
2020-09-14Current version
Current version

The current dated API version, pinned with the Plaid-Version header. It removed public_key authentication, so calls authenticate with client_id and secret. It also stopped returning a removed boolean from /item/remove, made country_codes mandatory for institutions endpoints, and restructured /processor/auth/get to match /auth/get.

What changed
  • Removed public_key authentication; calls now require client_id and secret.
  • /item/remove no longer returns a removed boolean.
  • country_codes made mandatory for institutions endpoints.
  • /processor/auth/get response restructured to match /auth/get.
2019-05-29Requires migration
2019 version

Expanded international support across Auth and Identity. Auth numbers grew to include BACS (UK) and international IBAN and BIC formats, Identity moved owner data onto each account and renamed fields for international use, and a country field was added to identity and transactions.

What changed
  • Auth numbers expanded to BACS (UK) and international IBAN and BIC.
  • Identity data moved to account owners; zip renamed postal_code, state renamed region.
  • Address fields became nullable instead of empty strings.
  • Account type brokerage renamed to investment.
  • Institutions responses now include country_codes.
2018-05-22Requires migration
2018 version

Restructured Auth account numbers to support both US ACH and Canadian EFT formats, and added currency-code fields to accounts and transactions.

What changed
  • Auth numbers restructured from a flat list to support ACH (US) and EFT (Canada).
  • Added iso_currency_code and unofficial_currency_code to accounts and transactions.
2017-03-08Feature update
First versioned release

The earliest dated API version, the baseline before the later international and authentication changes.

What changed
  • Initial versioned release of the Plaid API.

Pin a version with the Plaid-Version header and move up deliberately.

Plaid API changelog ↗
Questions

Plaid API, answered.

How does Plaid authentication work, and are there scopes?+
Almost every endpoint takes a client_id and a secret, sent in the JSON body or the PLAID-CLIENT-ID and PLAID-SECRET headers. There are no OAuth scopes on first-party calls. What a call can reach is set by which Products are enabled on the Item and what the account holder consented to, not by a permission attached to the credential.
What is an Item and an access_token?+
An Item is one user's login at one financial institution, holding its accounts. After a user connects a bank through Link, Plaid returns a short-lived public_token, which /item/public_token/exchange turns into a long-lived access_token. That access_token is passed to product endpoints to name which connected bank a call acts on.
What's the difference between /transactions/sync and /transactions/get?+
/transactions/sync is the recommended model. It is cursor-based and returns added, modified, and removed transactions since the last cursor, so an integration processes only what changed, prompted by the SYNC_UPDATES_AVAILABLE webhook. /transactions/get is the older method, fetching a date range with offset pagination, and is kept for existing integrations.
How does Plaid handle API versioning?+
Plaid pins the API to a dated version through the Plaid-Version header, with the current version dated 2020-09-14. A fixed date keeps response shapes stable until an integration chooses to move up. Newer dated versions can include breaking changes, so upgrades are deliberate; the 2020-09-14 cut, for instance, removed public_key authentication in favour of client_id and secret.
How do I verify a webhook really came from Plaid?+
Each webhook carries a Plaid-Verification header, a JWT signed with ES256. The receiver reads the key id from the JWT header, fetches the matching public key from /webhook_verification_key/get, verifies the signature, checks the request_body_sha256 claim against the raw body, and rejects anything issued more than 5 minutes ago to block replays.
Why is an endpoint returning no data even though the call succeeds?+
An endpoint only returns data when its product is enabled on the Item. If Auth, Identity, or another product was not in the products array at /link/token/create, or the account holder did not consent to it, the related endpoint returns empty or an error. Some fields, like Identity beyond the account holder's name, are also only as complete as the institution provides.
Related

More finance API guides for agents

What is Bollard AI?

Control what every AI agent can do in Plaid.

Bollard AI sits between a team's AI agents and Plaid. Grant each agent exactly the access it needs, read or write, product by product, and every call is checked and logged.

  • Set read, write, or full access per agent, never a shared Plaid secret.
  • Denied by default, so an agent reaches only what has been explicitly allowed.
  • Every call recorded in plain English: who, what, where, and the decision.
Plaid
Finance Agent
Read transactions ResourceOffReadFull use
Read account & routing numbers ResourceOffReadFull use
Identity data ResourceOffReadFull use
Remove an Item ActionOffReadFull use
Per-agent access, set in Bollard AI, not in Plaid