Bank Income 
============

#### Learn about Bank Income features and implementation 

Get started with Bank Income

[API Reference](https://plaid.com/docs/api/products/income/index.html.md) [Quickstart](https://github.com/plaid/income-sample) [Income Verification Demo](https://plaid.coastdemo.com/share/66fb0a180582208ffa82103e?zoom=100)

#### Overview 

Bank Income allows you to instantly retrieve net income information from a user-connected bank account, supporting both irregular or gig income and W-2 income. Data available includes a breakdown of income streams to the account, as well as recent and historical income.

[Prefer to learn by watching? Get an overview of how Income works in just 3 minutes!](https://www.youtube.com/watch?v=Hc-MpibSxJE)

For all new integrations supporting end users based in the US, Plaid recommends the use of [Consumer Report](https://plaid.com/docs/check/index.html.md) instead of Bank Income. Consumer Report's income solution provides FCRA compliant insights and bundles income calculations (historical average income, forecasted income, predicted next payment date) in a single report. For more information, see [Plaid Check Consumer Report](https://plaid.com/docs/check/index.html.md) .

#### No-code Income integration with the Credit Dashboard 

Bank Income can be used as part of a no-code integration flow. This integration mode is available only when using Income alongside Assets. For more details, see the [Assets no-code integration guide](https://plaid.com/docs/assets/index.html.md#no-code-integration-with-the-credit-dashboard) .

#### Integration process 

New customers integrating with Bank Income after December 10, 2025 must request access to user tokens by contacting sales or their account manager, or filing a support ticket via the Dashboard. If access is not requested, [/user/create](https://plaid.com/docs/api/users/index.html.md#usercreate) will not generate a user token, and will generate only a `user_id` instead. For details, see [New User APIs](https://plaid.com/docs/api/users/user-apis/index.html.md) .

1.  Call [/user/create](https://plaid.com/docs/api/users/index.html.md#usercreate) to create a `user_token` that will represent the end user interacting with your application. This step will only need to be done once per end user. If you are using multiple Income types, do not repeat this step when switching to a different Income type. If you do not receive a `user_token` when calling [/user/create](https://plaid.com/docs/api/users/index.html.md#usercreate) , contact your account manager or file a support ticket to request access. For more details, see [New User APIs](https://plaid.com/docs/api/users/user-apis/index.html.md) .
2.  Call [/link/token/create](https://plaid.com/docs/api/link/index.html.md#linktokencreate) . In addition to the required parameters, you will need to provide the following:
    *   For `user_token`, provide the `user_token` from [/user/create](https://plaid.com/docs/api/users/index.html.md#usercreate) .
    *   For `products`, use `["income_verification"]`. You can also specify additional products. For more details, see [Using Bank Income with other products](https://plaid.com/docs/income/bank-income/index.html.md#using-bank-income-with-other-products) .
    *   For `income_verification.income_source_types`, use `bank`.
    *   Set `income_verification.bank_income.days_requested` to the desired number of days.
    *   Provide a `webhook` URI with the endpoint where you will receive Plaid webhooks.
3.  On the client side, create an instance of Link using the `link_token` returned by [/link/token/create](https://plaid.com/docs/api/link/index.html.md#linktokencreate) ; for more details, see the [Link documentation](https://plaid.com/docs/link/index.html.md) .
4.  Open Link in your web or mobile client and listen to the `onSuccess` and `onExit` callbacks, which will fire once the user has finished or exited the Link session.
5.  If you are using other Plaid products such as Auth or Balance alongside Bank Income, call [/link/token/get](https://plaid.com/docs/api/link/index.html.md#linktokenget) and make sure to capture each `public_token` from the `results.item_add_results` array. Exchange each `public_token` for an `access_token` using [/item/public\_token/exchange](https://plaid.com/docs/api/items/index.html.md#itempublic_tokenexchange) . For more details on token exchange, see the [Token exchange flow](https://plaid.com/docs/api/items/index.html.md#token-exchange-flow) .
6.  To retrieve data, call [/credit/bank\_income/get](https://plaid.com/docs/api/products/income/index.html.md#creditbank_incomeget) with the `user_token`.

#### Multi-Item sessions 

Many users get income deposited into multiple institutions. To help capture a user's full income profile, you can allow your users to link multiple accounts within the same link session on web integrations.

(An image of "Select bank, enter credentials, choose income transactions, and review income in Plaid's bank income flow.")

Bank Income Multi Item Link flow (some panes excluded)

To enable this flow, see [Multi-Item Link](https://plaid.com/docs/link/multi-item-link/index.html.md) . The previous Income-specific flow, which used the `income_verification.bank_income.enable_multiple_items` setting in [/link/token/create](https://plaid.com/docs/api/link/index.html.md#linktokencreate) and obtained public tokens from the [/credit/sessions/get](https://plaid.com/docs/api/products/income/index.html.md#creditsessionsget) endpoint, has been deprecated and replaced with a generic Multi-Item Link flow that supports all Plaid and Plaid Check products.

#### Using Bank Income with other products 

Bank Income Items are fully compatible with other Plaid Item-based products, including Auth, Transactions, Balance, and Assets.

When initializing Link, if you plan to use Bank Income and Assets in the same session, it is recommended to put both `income_verification` and `assets` in the [/link/token/create](https://plaid.com/docs/api/link/index.html.md#linktokencreate) `products` array. If you plan to use Bank Income with Transactions, you should not put `transactions` in the `products` array, as this may increase latency. For more details, see [Choosing how to initialize Link](https://plaid.com/docs/link/initializing-products/index.html.md) .

To capture an `access_token` for use with other products, call [/credit/sessions/get](https://plaid.com/docs/api/products/income/index.html.md#creditsessionsget) after receiving the `onExit` or `onSuccess` callback from Link. This endpoint will return all `public_token`s for every Item linked to a given `user_token`. For details on the API schema, see the [/credit/sessions/get](https://plaid.com/docs/api/products/income/index.html.md#creditsessionsget) documentation. You can then exchange these `public_tokens` for `access_tokens` using [/item/public\_token/exchange](https://plaid.com/docs/api/items/index.html.md#itempublic_tokenexchange) .

#### Verifying Bank Income for existing Items 

If your user has already connected their depository bank account to your application for a different product, you can add Bank Income to the existing Item via [update mode](https://plaid.com/docs/link/update-mode/index.html.md) .

To do so, in the [/link/token/create](https://plaid.com/docs/api/link/index.html.md#linktokencreate) request described above, populate the `access_token` field with the access token for the Item. If the user connected their account less than two years ago, they can bypass the Link credentials pane and complete just the Income Verification step. Otherwise, they will be prompted to complete the full Plaid Bank Income Link flow.

#### Institution coverage 

To determine whether an institution supports Bank Income, you can use the Dashboard status page (look for "Bank Income") or the [/institutions/get](https://plaid.com/docs/api/institutions/index.html.md#institutionsget) endpoint (look for or filter by the `income_verification` product). The `income` product returned by these surfaces represents a legacy product and does not indicate coverage for Bank Income.

#### Testing Bank Income 

In Sandbox, you can use the user `user_bank_income` with the password `{}`. The basic [Sandbox credentials](https://plaid.com/docs/sandbox/test-credentials/index.html.md#sandbox-simple-test-credentials) (`user_good`/`pass_good`) will not return data when used to test Bank Income.

Plaid also has additional test users for scenarios such as joint accounts, bonus income, and different levels of creditworthiness: for details, see [Credit and Income testing credentials](https://plaid.com/docs/sandbox/test-credentials/index.html.md#credit-and-income-testing-credentials) .

When using special Sandbox test credentials (such as `user_bank_income` / `{}`), use the [/sandbox/public\_token/create](https://plaid.com/docs/api/sandbox/index.html.md#sandboxpublic_tokencreate) flow or a non-OAuth test institution, such as First Platypus Bank (`ins_109508`). Special test credentials may be ignored when using the Sandbox Link OAuth flow.

If you'd like to test Bank Income with custom data, Plaid provides several [test JSON configuration objects](https://github.com/plaid/sandbox-custom-users/tree/main/income) . To load this data into Sandbox, copy and paste the JSON into a new custom user via the [Sandbox Users pane](https://dashboard.plaid.com/developers/sandbox) in the Dashboard.

[/credit/bank\_income/get](https://plaid.com/docs/api/products/income/index.html.md#creditbank_incomeget) can optionally be tested in Sandbox without using Link. Call [/user/create](https://plaid.com/docs/api/users/index.html.md#usercreate) and pass the returned `user_token` to [/sandbox/public\_token/create](https://plaid.com/docs/api/sandbox/index.html.md#sandboxpublic_tokencreate) . [/sandbox/public\_token/create](https://plaid.com/docs/api/sandbox/index.html.md#sandboxpublic_tokencreate) must be called with the following request body:

/sandbox/public\_token/create request for Bank Income testing

```bash
{
  "client_id": "${PLAID_CLIENT_ID}",
  "secret": "${PLAID_SECRET}",
  "institution_id": "ins_20", //any valid institution id is fine
  "initial_products": ["income_verification"],
  "user_token": "user-token-goes-here", //use the user_token from the `/user/create` call made earlier
  "options": {
    "override_username": "user_bank_income", //or other test user from Credit and Income testing credentials
    "override_password": "{}",
    "income_verification": {
      "income_source_types": ["bank"],
      "bank_income": {
        "days_requested": 120 //any number of days under 730 is valid
      }
    }
  }
}
```

After calling [/sandbox/public\_token/create](https://plaid.com/docs/api/sandbox/index.html.md#sandboxpublic_tokencreate) , call [/credit/bank\_income/get](https://plaid.com/docs/api/products/income/index.html.md#creditbank_incomeget) using the same `user_token`. The output of [/sandbox/public\_token/create](https://plaid.com/docs/api/sandbox/index.html.md#sandboxpublic_tokencreate) will not be used, but calling it initializes the user token for testing.

#### Bank Income pricing 

Bank Income is billed on a [one-time fee model](https://plaid.com/docs/account/billing/index.html.md#one-time-fee) . Bank Income Refresh is billed on a [per-request fee model](https://plaid.com/docs/account/billing/index.html.md#per-request-flat-fee) . To view the exact pricing you may be eligible for, [apply for Production access](https://dashboard.plaid.com/overview/production) or [contact sales](https://plaid.com/contact/) . For more details about pricing and billing models, see [Plaid billing](https://plaid.com/docs/account/billing/index.html.md) .

#### Next steps 

If you're ready to launch to Production, see the [Launch checklist](https://plaid.com/docs/launch-checklist/index.html.md) .

#### Launch Center 

See next steps to launch in Production

[Launch](https://dashboard.plaid.com/developers/launch-center)