plaid
>=9.0.0postconditions40functions23last verified2026-06-24coverage score85%Postconditions: what we check
- linkTokenCreate · api-errorerrorWhenPlaid API error (INVALID_REQUEST, INVALID_INPUT, RATE_LIMIT_EXCEEDED, API_ERROR) or network failure connecting to Plaid.Throws
Axios error. Access PlaidError via error.response.data. Fields include: error_type (e.g. 'RATE_LIMIT_EXCEEDED', 'API_ERROR'), error_code, error_message, request_id.Required handlingCaller MUST wrap in try-catch. A failed linkTokenCreate means the user cannot open Plaid Link at all. Handle RATE_LIMIT_EXCEEDED with backoff; return a 5xx to the client for API_ERROR. Never surface raw Plaid errors to end users.costmediumin prodimmediate exceptionusers seeservice unavailablevisibilityvisible - itemPublicTokenExchange · api-errorerrorWhenINVALID_INPUT / INVALID_PUBLIC_TOKEN (token already exchanged, expired, or malformed) or API_ERROR (internal Plaid error) or network failure.Throws
Axios error with PlaidError in error.response.data. INVALID_PUBLIC_TOKEN is the most common: token was already exchanged (double-submit) or expired after 30 minutes.Required handlingCaller MUST wrap in try-catch. Failure means the user's bank connection is lost — they must restart the Link flow. Store the access_token only after successful exchange. INVALID_PUBLIC_TOKEN should prompt the user to re-link, not be shown as a generic error.costmediumin prodimmediate exceptionusers seeservice unavailablevisibilityvisible - transactionsSync · api-errorerrorWhenITEM_ERROR / PRODUCT_NOT_READY (initial transaction pull still pending), ITEM_ERROR / ITEM_LOGIN_REQUIRED (user must re-authenticate), INSTITUTION_ERROR (bank connectivity failure), RATE_LIMIT_EXCEEDED, or network failure.Throws
Axios error with PlaidError in error.response.data. PRODUCT_NOT_READY is common on first call before the initial pull completes. ITEM_LOGIN_REQUIRED requires re-linking via Link update mode.Required handlingCaller MUST wrap in try-catch. This is typically called inside a webhook handler — an unhandled error silently breaks transaction sync. Handle PRODUCT_NOT_READY by retrying later; handle ITEM_LOGIN_REQUIRED by notifying the user to re-link their account.costmediumin prodimmediate exceptionusers seeservice unavailablevisibilityvisible - accountsGet · api-errorerrorWhenITEM_ERROR / ITEM_LOGIN_REQUIRED (credentials expired or revoked), INSTITUTION_ERROR (bank unavailable), INVALID_INPUT / INVALID_ACCESS_TOKEN, or network failure.Throws
Axios error with PlaidError in error.response.data. ITEM_LOGIN_REQUIRED is the most common production error -- the user's bank session expired and they must re-link.Required handlingCaller MUST wrap in try-catch. Surface ITEM_LOGIN_REQUIRED to the user as a prompt to update their bank connection. Other errors should return a 5xx to avoid exposing Plaid internals.costmediumin prodimmediate exceptionusers seeservice unavailablevisibilityvisible - authGet · api-errorerrorWhenITEM_ERROR / PRODUCT_NOT_READY (Auth product not yet initialized), ITEM_ERROR / ITEM_LOGIN_REQUIRED, INVALID_INPUT (institution does not support Auth), or network failure.Throws
Axios error with PlaidError in error.response.data. PRODUCT_NOT_READY means Auth hasn't been initialized yet for this Item. Some institutions require micro-deposit verification.Required handlingCaller MUST wrap in try-catch. Auth data is used for financial operations; unhandled errors can cause incorrect routing. Handle PRODUCT_NOT_READY with polling or retry logic. Handle ITEM_LOGIN_REQUIRED by prompting re-link.costmediumin prodimmediate exceptionusers seeservice unavailablevisibilityvisible - transferCreate · api-errorerrorWhenTRANSFER_ERROR (authorization expired, duplicate transfer, account closed), INVALID_INPUT (invalid account_id or amount), API_ERROR, or network failure. Authorization IDs expire after a short window; using an expired ID returns TRANSFER_ERROR / AUTHORIZATION_EXPIRED.Throws
Axios error with PlaidError in error.response.data. AUTHORIZATION_EXPIRED is common if too much time passes between authorization and creation. DUPLICATE_TRANSFER prevents double-charging.Required handlingCaller MUST wrap in try-catch. This is a financial operation -- an unhandled error can result in a silent failure where money was not moved but the app treats it as success. Log error.response.data.request_id for reconciliation. NEVER retry without checking transfer status first.costmediumin prodimmediate exceptionusers seeservice unavailablevisibilityvisible - identityGet · item-login-requirederrorWhenITEM_ERROR / ITEM_LOGIN_REQUIRED when the user's bank credentials have expired or been revoked. Identity data cannot be refreshed without re-authentication.Throws
Axios error with PlaidError in error.response.data. error_type = 'ITEM_ERROR', error_code = 'ITEM_LOGIN_REQUIRED'.Required handlingCaller MUST wrap in try-catch. Propagate ITEM_LOGIN_REQUIRED to trigger a re-link flow for the user. KYC verification must not silently proceed with stale or missing identity data.costhighin prodimmediate exceptionusers seelost datavisibilitysilent - identityGet · institution-errorwarningWhenINSTITUTION_ERROR / INSTITUTION_DOWN or INSTITUTION_NOT_RESPONDING when the bank is unavailable and identity data cannot be fetched.Throws
Axios error with PlaidError in error.response.data. error_type = 'INSTITUTION_ERROR'. Transient -- institution may recover without user action.Required handlingCaller MUST wrap in try-catch. Return a 503 to the client; do NOT mark KYC as failed. Queue for retry with backoff.costmediumin prodimmediate exceptionusers seeservice unavailablevisibilityvisible - liabilitiesGet · no-liability-accountserrorWhenITEM_ERROR / NO_LIABILITY_ACCOUNTS when the Item has no credit, student loan, PayPal, or mortgage accounts matching the product scope.Throws
Axios error with PlaidError in error.response.data. error_type = 'ITEM_ERROR', error_code = 'NO_LIABILITY_ACCOUNTS'.Required handlingCaller MUST wrap in try-catch. This is a legitimate data absence, not a service failure. Surface a user-friendly message: "No liability accounts found." Do not treat as a generic error.costlowin prodimmediate exceptionusers seeservice unavailablevisibilityvisible - liabilitiesGet · products-not-supportederrorWhenITEM_ERROR / PRODUCTS_NOT_SUPPORTED when the financial institution does not support the liabilities product. Common for smaller or international banks.Throws
Axios error with PlaidError in error.response.data. error_type = 'ITEM_ERROR', error_code = 'PRODUCTS_NOT_SUPPORTED'.Required handlingCaller MUST wrap in try-catch. Show user an institution-not-supported message and prompt to connect a different account. Do not retry.costlowin prodimmediate exceptionusers seeservice unavailablevisibilityvisible - liabilitiesGet · item-login-requirederrorWhenITEM_ERROR / ITEM_LOGIN_REQUIRED when the user's credentials have expired and liability data cannot be refreshed.Throws
Axios error with PlaidError in error.response.data. error_type = 'ITEM_ERROR', error_code = 'ITEM_LOGIN_REQUIRED'.Required handlingCaller MUST wrap in try-catch. Trigger re-link flow. Liability data used for underwriting must not be based on stale pre-error snapshots.costhighin prodimmediate exceptionusers seelost datavisibilitysilent - investmentsHoldingsGet · no-investment-accountserrorWhenITEM_ERROR / NO_INVESTMENT_ACCOUNTS when the Item has no investment accounts at the institution.Throws
Axios error with PlaidError in error.response.data. error_type = 'ITEM_ERROR', error_code = 'NO_INVESTMENT_ACCOUNTS'.Required handlingCaller MUST wrap in try-catch. Show a user-friendly message; this is a data absence, not a service error. Do not retry.costlowin prodimmediate exceptionusers seeservice unavailablevisibilityvisible - investmentsHoldingsGet · item-login-requirederrorWhenITEM_ERROR / ITEM_LOGIN_REQUIRED when credentials have expired and investment holdings data cannot be refreshed.Throws
Axios error with PlaidError in error.response.data. error_type = 'ITEM_ERROR', error_code = 'ITEM_LOGIN_REQUIRED'.Required handlingCaller MUST wrap in try-catch. Portfolio display must not show stale data without warning. Prompt re-link and flag holdings as potentially outdated.costmediumin prodimmediate exceptionusers seelost datavisibilitysilent - investmentsTransactionsGet · no-investment-accountserrorWhenITEM_ERROR / NO_INVESTMENT_ACCOUNTS when no investment accounts are available on the Item.Throws
Axios error with PlaidError in error.response.data. error_type = 'ITEM_ERROR', error_code = 'NO_INVESTMENT_ACCOUNTS'.Required handlingCaller MUST wrap in try-catch. Tax reporting features must handle this gracefully; do not attempt to generate empty tax forms on error.costmediumin prodimmediate exceptionusers seeservice unavailablevisibilityvisible - investmentsTransactionsGet · item-login-requirederrorWhenITEM_ERROR / ITEM_LOGIN_REQUIRED when credentials have expired.Throws
Axios error with PlaidError in error.response.data. error_type = 'ITEM_ERROR', error_code = 'ITEM_LOGIN_REQUIRED'.Required handlingCaller MUST wrap in try-catch. Investment transaction history for tax reporting cannot be incomplete. Prompt re-link immediately.costhighin prodimmediate exceptionusers seelost datavisibilitysilent - transactionsGet · item-login-requirederrorWhenITEM_ERROR / ITEM_LOGIN_REQUIRED when the user's credentials have expired and transaction data cannot be fetched.Throws
Axios error with PlaidError in error.response.data. error_type = 'ITEM_ERROR', error_code = 'ITEM_LOGIN_REQUIRED'.Required handlingCaller MUST wrap in try-catch. Transaction pipelines (ETL jobs, background sync) must detect ITEM_LOGIN_REQUIRED and notify the user to re-link, not silently skip the fetch.costmediumin prodimmediate exceptionusers seelost datavisibilitysilent - transactionsGet · product-not-readywarningWhenITEM_ERROR / PRODUCT_NOT_READY when the initial transaction pull is still in progress. Common immediately after Item creation.Throws
Axios error with PlaidError in error.response.data. error_type = 'ITEM_ERROR', error_code = 'PRODUCT_NOT_READY'.Required handlingCaller MUST wrap in try-catch. Use webhook (INITIAL_UPDATE, HISTORICAL_UPDATE) to trigger the first call rather than polling. Unhandled PRODUCT_NOT_READY in a sync job crashes the job loop.costlowin prodimmediate exceptionusers seeservice unavailablevisibilityvisible - transactionsRefresh · item-login-requirederrorWhenITEM_ERROR / ITEM_LOGIN_REQUIRED when credentials have expired and a fresh pull cannot be initiated.Throws
Axios error with PlaidError in error.response.data. error_type = 'ITEM_ERROR', error_code = 'ITEM_LOGIN_REQUIRED'.Required handlingCaller MUST wrap in try-catch. A failed refresh means the webhook will never fire. Notify the user to re-link rather than waiting indefinitely for a webhook that won't arrive.costmediumin prodimmediate exceptionusers seelost datavisibilitysilent - transactionsRefresh · institution-errorwarningWhenINSTITUTION_ERROR when the bank is temporarily unavailable and the refresh request cannot be queued.Throws
Axios error with PlaidError in error.response.data. error_type = 'INSTITUTION_ERROR'.Required handlingCaller MUST wrap in try-catch. Retry with exponential backoff. Do not surface institution errors to the user as permanent failures.costlowin prodimmediate exceptionusers seelost datavisibilitysilent - accountsBalanceGet · item-login-requirederrorWhenITEM_ERROR / ITEM_LOGIN_REQUIRED when the institution session has expired. Real-time balance cannot be fetched without valid credentials.Throws
Axios error with PlaidError in error.response.data. error_type = 'ITEM_ERROR', error_code = 'ITEM_LOGIN_REQUIRED'.Required handlingCaller MUST wrap in try-catch. A balance check failure before a payment MUST halt the payment flow. Do not use stale cached balance as a fallback; it may be outdated by hours or days.costhighin prodimmediate exceptionusers seeservice unavailablevisibilityvisible - accountsBalanceGet · institution-errorerrorWhenINSTITUTION_ERROR / INSTITUTION_DOWN or INSTITUTION_NOT_RESPONDING when the bank cannot respond in real time. More frequent than with accountsGet since accountsBalanceGet forces a live fetch.Throws
Axios error with PlaidError in error.response.data. error_type = 'INSTITUTION_ERROR'.Required handlingCaller MUST wrap in try-catch. If checking balance before a payment, fail-safe by blocking the payment rather than proceeding without balance verification. Return a user-friendly retry message.costhighin prodimmediate exceptionusers seeservice unavailablevisibilityvisible - itemGet · item-not-founderrorWhenINVALID_INPUT / ITEM_NOT_FOUND when the access_token references a deleted or non-existent Item. Common if the Item was removed via itemRemove but the access token is still stored in the database.Throws
Axios error with PlaidError in error.response.data. error_type = 'INVALID_INPUT', error_code = 'ITEM_NOT_FOUND' (or 'INVALID_ACCESS_TOKEN').Required handlingCaller MUST wrap in try-catch. ITEM_NOT_FOUND means the stored access_token is stale. Delete the token from the database and prompt the user to relink. Do not treat as a transient error.costmediumin prodimmediate exceptionusers seelost datavisibilitysilent - itemRemove · api-errorerrorWhenINVALID_INPUT / ITEM_NOT_FOUND (token already removed), API_ERROR, or network failure. A failed itemRemove means the Item is NOT removed from Plaid's system and billing continues.Throws
Axios error with PlaidError in error.response.data. ITEM_NOT_FOUND is benign (already removed); API_ERROR should be retried.Required handlingCaller MUST wrap in try-catch. Log the request_id for reconciliation. ITEM_NOT_FOUND should be treated as success (idempotent removal). API_ERROR must be retried to stop subscription billing. Only delete the access_token from the database after confirmed removal.costmediumin prodimmediate exceptionusers seelost datavisibilitysilent - transferAuthorizationCreate · transfer-account-blockederrorWhenTRANSFER_ERROR / TRANSFER_ACCOUNT_BLOCKED when a previous transfer involving the same end-user account resulted in an error (e.g., NSF, unauthorized return). Plaid blocks the account from future transfers.Throws
Axios error with PlaidError in error.response.data. error_type = 'TRANSFER_ERROR', error_code = 'TRANSFER_ACCOUNT_BLOCKED'.Required handlingCaller MUST wrap in try-catch. Account is permanently blocked for transfers -- do not retry. Prompt the user to link a different account. This is a risk signal, not a transient error.costhighin prodimmediate exceptionusers seeservice unavailablevisibilityvisible - transferAuthorizationCreate · transfer-unsupported-account-typeerrorWhenTRANSFER_ERROR / TRANSFER_UNSUPPORTED_ACCOUNT_TYPE when the account type does not support the requested ACH class (e.g., credit card account selected for an ACH debit).Throws
Axios error with PlaidError in error.response.data. error_type = 'TRANSFER_ERROR', error_code = 'TRANSFER_UNSUPPORTED_ACCOUNT_TYPE'.Required handlingCaller MUST wrap in try-catch. Show a clear error: the selected account type does not support this payment method. Ask the user to select a checking or savings account.costmediumin prodimmediate exceptionusers seeservice unavailablevisibilityvisible - transferAuthorizationCreate · item-login-requirederrorWhenITEM_ERROR / ITEM_LOGIN_REQUIRED when the user's credentials have expired and the authorization cannot be evaluated.Throws
Axios error with PlaidError in error.response.data. error_type = 'ITEM_ERROR', error_code = 'ITEM_LOGIN_REQUIRED'.Required handlingCaller MUST wrap in try-catch. Block the payment flow and prompt re-link before retrying the transfer. Authorization cannot proceed without valid credentials.costmediumin prodimmediate exceptionusers seeservice unavailablevisibilityvisible - transferGet · api-errorerrorWhenINVALID_INPUT when the transfer_id is invalid or does not exist in this client's scope, or API_ERROR on Plaid infrastructure failure.Throws
Axios error with PlaidError in error.response.data. error_type = 'INVALID_INPUT' or 'API_ERROR'.Required handlingCaller MUST wrap in try-catch. A failed transferGet should trigger a retry with backoff -- the transfer may still exist and be processing. Do not assume a failed GET means the transfer failed.costhighin prodimmediate exceptionusers seelost datavisibilitysilent - signalEvaluate · signal-errorerrorWhenSIGNAL_ERROR / INVALID_ACCOUNT_ID when the account has been removed or the account_id is no longer valid. Also ITEM_LOGIN_REQUIRED when bank data cannot be accessed.Throws
Axios error with PlaidError in error.response.data. error_type = 'SIGNAL_ERROR', error_code = 'INVALID_ACCOUNT_ID' or error_type = 'ITEM_ERROR', error_code = 'ITEM_LOGIN_REQUIRED'.Required handlingCaller MUST wrap in try-catch. A failed signal evaluation means risk cannot be assessed. Fail-safe by blocking the transfer rather than proceeding without a risk score. Log the request_id.costhighin prodimmediate exceptionusers seelost datavisibilitysilent - itemWebhookUpdate · api-errorwarningWhenINVALID_INPUT (invalid webhook URL format or HTTPS requirement not met), ITEM_ERROR / ITEM_NOT_FOUND (stale access_token), or API_ERROR.Throws
Axios error with PlaidError in error.response.data. Webhook URLs must be HTTPS; HTTP URLs are rejected with INVALID_INPUT.Required handlingCaller MUST wrap in try-catch. A failed webhook update means future transaction events won't reach the application. Verify webhook URL is HTTPS and retry on API_ERROR.costmediumin prodimmediate exceptionusers seelost datavisibilitysilent - transactionsRecurringGet · item-login-requirederrorWhenITEM_ERROR / ITEM_LOGIN_REQUIRED when the user's credentials have expired and recurring transaction analysis cannot be refreshed.Throws
Axios error with PlaidError in error.response.data. error_type = 'ITEM_ERROR', error_code = 'ITEM_LOGIN_REQUIRED'.Required handlingCaller MUST wrap in try-catch. Recurring transaction data used for bill prediction must not be stale. Surface re-link prompt.costmediumin prodimmediate exceptionusers seelost datavisibilitysilent - transactionsRecurringGet · product-not-readywarningWhenITEM_ERROR / PRODUCT_NOT_READY when the transactions product has not yet completed its initial pull for this Item.Throws
Axios error with PlaidError in error.response.data. error_type = 'ITEM_ERROR', error_code = 'PRODUCT_NOT_READY'.Required handlingCaller MUST wrap in try-catch. Wait for HISTORICAL_UPDATE webhook before calling this endpoint. Show a loading state to the user.costlowin prodimmediate exceptionusers seeservice unavailablevisibilityvisible - assetReportCreate · asset-report-creation-errorerrorWhenASSET_REPORT_ERROR (PRODUCT_NOT_ENABLED, NO_AUTH_ACCOUNTS, INVALID_PARENT, DATA_UNAVAILABLE) or per-Item ITEM_ERROR returned as causes[] entries. One access_token in the batch failing surfaces as a top-level error with a non-empty causes[] array — partial reports are NOT created.Throws
Axios error. Access PlaidError via error.response.data. Fields: error_type = 'ASSET_REPORT_ERROR', error_code (e.g. 'PRODUCT_NOT_ENABLED', 'NO_AUTH_ACCOUNTS', 'DATA_UNAVAILABLE'), causes[] (per-Item breakdown when multiple access_tokens were passed).Required handlingCaller MUST wrap in try-catch. Asset Report creation is the gating step for the entire lending verification flow — a silent failure here blocks loan applications. Inspect causes[] when batching multiple Items; you may need to re-link a single Item without aborting the whole report. Do NOT log the full error (request headers contain client_secret).costhighin prodimmediate exceptionusers seeservice unavailablevisibilityvisible - assetReportCreate · invalid-input-errorerrorWhenINVALID_INPUT when access_token is malformed/expired/revoked, when days_requested exceeds tier maximum (e.g. >730), or when options.user fields are missing required attributes for downstream consumers (Fannie Mae / Freddie Mac require specific user fields).Throws
Axios error with PlaidError in error.response.data. error_type = 'INVALID_INPUT', error_code (e.g. 'INVALID_ACCESS_TOKEN', 'INVALID_FIELD', 'TOO_MANY_VERIFICATION_ATTEMPTS').Required handlingCaller MUST wrap in try-catch. INVALID_INPUT is a programmer error — fix the request rather than retrying. Validate access_token format and days_requested ceiling client-side before calling.costmediumin prodimmediate exceptionusers seelost datavisibilitysilentSources[4] - assetReportCreate · rate-limit-exceededwarningWhenRATE_LIMIT_EXCEEDED when Asset Report creation rate exceeds tier limits. Particularly common in batch onboarding flows where hundreds of reports are generated in a short window (lender bulk-uploads, refinance bursts).Throws
Axios error with PlaidError in error.response.data. error_type = 'RATE_LIMIT_EXCEEDED', error_code = 'RATE_LIMIT'.Required handlingCaller MUST wrap in try-catch and implement exponential backoff with jitter. Asset Report creation is expensive — gate batch jobs at a known-safe RPS. Surface a delay banner to the user, NOT a hard error.costmediumin prodimmediate exceptionusers seedegraded performancevisibilityvisibleSources[23] - identityVerificationCreate · invalid-input-errorerrorWhenINVALID_INPUT when template_id is missing/unknown, client_user_id is invalid, or required user fields (e.g. email_address, phone_number) are missing for the chosen template. Common when a template requires SSN but the request omits it.Throws
Axios error with PlaidError in error.response.data. error_type = 'INVALID_INPUT', error_code (e.g. 'INVALID_FIELD', 'INVALID_TEMPLATE', 'MISSING_FIELDS').Required handlingCaller MUST wrap in try-catch. Identity verification is a gating step for account opening — failure here means the user cannot proceed. Validate template requirements server-side and surface a clear actionable error to the user.costhighin prodimmediate exceptionusers seeservice unavailablevisibilityvisible - identityVerificationCreate · idempotent-conflicterrorWhenINVALID_REQUEST / IDV_INVALID_TEMPLATE_OR_VERSION when the (client_user_id, template_id) pair already has an active verification and is_shareable is false. Plaid blocks duplicate sessions for the same user against the same template to prevent abuse and duplicate billing.Throws
Axios error with PlaidError in error.response.data. error_type = 'INVALID_REQUEST', error_code references the existing identity_verification_id in error_message.Required handlingCaller MUST wrap in try-catch. On this error, fetch the existing verification via identityVerificationGet using the id surfaced in error_message rather than retrying create. Do NOT show a generic "verification failed" — the user already has a session.costlowin prodimmediate exceptionusers seedegraded performancevisibilityvisibleSources[24] - identityVerificationCreate · api-errorerrorWhenAPI_ERROR (Plaid-side outage) or INSTITUTION_ERROR (downstream KYC provider unavailable). Document-verification flows depend on third-party OCR/document providers which can have independent outages.Throws
Axios error with PlaidError in error.response.data. error_type = 'API_ERROR' or 'INSTITUTION_ERROR'.Required handlingCaller MUST wrap in try-catch. Implement retry with exponential backoff for API_ERROR (transient). For INSTITUTION_ERROR, allow the user to retry but surface a degraded-state message rather than blocking.costmediumin prodimmediate exceptionusers seeservice unavailablevisibilityvisibleSources[25] - processorTokenCreate · invalid-account-iderrorWhenINVALID_INPUT / INVALID_ACCOUNT_ID when account_id does not belong to the Item identified by access_token, or when the account has been closed/removed at the institution. Also fires when processor name is not one of the supported enum values (e.g. typo'd 'stripe' as 'strype').Throws
Axios error with PlaidError in error.response.data. error_type = 'INVALID_INPUT', error_code = 'INVALID_ACCOUNT_ID' or 'INVALID_FIELD' for processor enum mismatch.Required handlingCaller MUST wrap in try-catch. The processor_token is the prerequisite for ANY payment flow — silent failure here means the user clicks "Pay" and nothing happens. Surface a re-link prompt for closed accounts.costhighin prodimmediate exceptionusers seeservice unavailablevisibilityvisible - processorTokenCreate · item-login-requirederrorWhenITEM_ERROR / ITEM_LOGIN_REQUIRED when the user's credentials at the institution have expired/been revoked. processorTokenCreate requires a healthy Item; cannot mint a processor_token from a broken one.Throws
Axios error with PlaidError in error.response.data. error_type = 'ITEM_ERROR', error_code = 'ITEM_LOGIN_REQUIRED'.Required handlingCaller MUST wrap in try-catch. Trigger Link in update mode to refresh credentials, then retry processorTokenCreate. Do NOT proceed with the payment flow against a stale processor_token.costhighin prodimmediate exceptionusers seeservice unavailablevisibilityvisible - processorTokenCreate · rate-limit-exceededwarningWhenRATE_LIMIT_EXCEEDED when processor token creation rate exceeds tier limits. Particularly common in batch reconciliation flows where many processor tokens are refreshed in sequence.Throws
Axios error with PlaidError in error.response.data. error_type = 'RATE_LIMIT_EXCEEDED', error_code = 'RATE_LIMIT'.Required handlingCaller MUST wrap in try-catch and implement exponential backoff. Pace batch processor-token refresh below the documented tier RPS.costmediumin prodimmediate exceptionusers seedegraded performancevisibilityvisibleSources[23]
Sources
Every postcondition cites at least one of these. Grouped by source type; numbered to match the footnotes above.
- [1]plaid.com/docs/api/tokensTokens
- [2]plaid.com/docs/errorsErrors
- [3]plaid.com/docs/api/tokensTokens
- [4]plaid.com/docs/errors/invalid-inputInvalid Input
- [5]plaid.com/docs/api/productsTransactions
- [6]plaid.com/docs/errors/itemItem
- [7]plaid.com/docs/api/accountsAccounts
- [8]plaid.com/docs/api/productsAuth
- [9]plaid.com/docs/api/productsTransfer
- [10]plaid.com/docs/api/productsIdentity
- [11]plaid.com/docs/api/productsLiabilities
- [12]plaid.com/docs/api/productsInvestments
- [13]plaid.com/docs/api/productsTransactions
- [14]plaid.com/docs/api/accountsAccounts
- [15]plaid.com/docs/api/itemsItems
- [16]plaid.com/docs/api/itemsItems
- [17]plaid.com/docs/errors/transferTransfer
- [18]plaid.com/docs/api/productsTransfer
- [19]plaid.com/docs/api/productsSignal
- [20]plaid.com/docs/api/itemsItems
- [21]plaid.com/docs/api/productsAssets
- [22]plaid.com/docs/errors/asset-reportAsset Report
- [23]plaid.com/docs/errors/rate-limit-exceededRate Limit Exceeded
- [24]plaid.com/docs/api/productsIdentity Verification
- [25]plaid.com/docs/errors/apiApi
- [26]plaid.com/docs/api/processorsProcessors
- [27]plaid.com/docs/link/update-modeUpdate Mode
Research notes
Curator notes from SOURCES.md captured when the profile was written so you can verify the reasoning, not just the rules.
Sources — plaid
Official Documentation
| URL | Description | Used For |
|---|---|---|
| https://plaid.com/docs/api/ | Plaid API reference | Overall API surface |
| https://plaid.com/docs/errors/ | Error types overview | Postcondition: api-error |
| https://plaid.com/docs/errors/item/ | ITEM_ERROR codes (30+ codes) | transactionsSync, accountsGet, authGet |
| https://plaid.com/docs/errors/invalid-input/ | INVALID_INPUT codes | itemPublicTokenExchange |
| https://plaid.com/docs/errors/api/ | API_ERROR (internal Plaid) | All functions |
| https://plaid.com/docs/api/tokens/#linktokencreate | linkTokenCreate endpoint | linkTokenCreate function |
| https://plaid.com/docs/api/tokens/#itempublictokenexchange | itemPublicTokenExchange endpoint | itemPublicTokenExchange function |
| https://plaid.com/docs/api/products/transactions/#transactionssync | transactionsSync endpoint | transactionsSync function |
| https://plaid.com/docs/api/accounts/#accountsget | accountsGet endpoint | accountsGet function |
| https://plaid.com/docs/api/products/auth/#authget | authGet endpoint | authGet function |
| https://plaid.com/docs/api/products/transfer/#transfercreate | transferCreate endpoint | transferCreate function |
SDK Source
| URL | Description |
|---|---|
| https://github.com/plaid/plaid-node | Official plaid-node GitHub repo |
| https://github.com/plaid/plaid-node/blob/master/CHANGELOG.md | SDK version history |
| https://www.npmjs.com/package/plaid | npm package page (v41.4.0 latest) |
Key Evidence
From https://plaid.com/docs/errors/:
"Each error response includes an error_type and error_code. Use these fields for programmatic error handling, not the HTTP status code."
"We recommend against logging the full error object in production, as it may include sensitive information such as your Plaid API keys in the request configuration."
From SDK source — all PlaidApi methods are generated from OpenAPI spec using
typescript-axios generator. They return Promise<AxiosResponse<T>> and throw
Axios errors on non-2xx responses. The PlaidError payload is in error.response.data.
SDK Version Notes
- v9-v13: First OpenAPI-generated rewrite;
PlaidApiclass introduced - v14+: Stable
Configuration+PlaidApipattern (targeted semver) - v19: Removed index signatures for stricter TypeScript
- v41.4.0: Current latest (as of 2026-03-12)