Bank Income
Learn about Bank Income features and implementation
API Reference
View Income requests, responses, and example code
View Income APIQuickstart
View the starter Income sample app and code
View Income QuickstartIncome Verification Demo
Try a live Bank Income Verification experience
Try the demoOverview
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.
Integration process
- Call
/user/create
to create auser_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. - Call
/link/token/create
. In addition to the required parameters, you will need to provide the following:- For
user_token
, provide theuser_token
from/user/create
. - For
products
, use["income_verification"]
. You can also specify additional products. For more details, see Using Bank Income with other products. - For
income_verification.income_source_types
, usebank
. - 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.
- For
- On the client side, create an instance of Link using the
link_token
returned by/link/token/create
; for more details, see the Link documentation. - Open Link in your web or mobile client and listen to the
onSuccess
andonExit
callbacks, which will fire once the user has finished or exited the Link session. - If you are using other Plaid products such as Auth or Balance alongside Bank Income, call
/link/token/get
and make sure to capture eachpublic_token
from theresults.item_add_results
array. Exchange eachpublic_token
for anaccess_token
using/item/public_token/exchange
. For more details on token exchange, see the Token exchange flow. - To retrieve data, call
/credit/bank_income/get
with theuser_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.
To enable this flow, see Multi-Item Link. The previous Income-specific flow, which used the income_verification.bank_income.enable_multiple_items
setting in /link/token/create
and obtained public tokens from the /credit/sessions/get
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
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.
To capture an access_token
for use with other products, call /credit/sessions/get
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
documentation. You can then exchange these public_tokens
for access_tokens
using /item/public_token/exchange
.
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.
To do so, in the /link/token/create
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.
Bank Income Refresh
Bank Income Refresh is available as an optional add-on to Bank Income. With Bank Income Refresh, you will be able to get updated income data for a user. Existing income sources will be updated with new transactions, and new income sources will be added if detected.
To implement Bank Income Refresh:
On the webhooks page in the Dashboard, enable Bank Income Refresh webhooks and (optionally) Bank Income Refresh Update webhooks.
Call
/credit/bank_income/refresh
with theuser_token
for which you want an updated report.A
BANK_INCOME_REFRESH_COMPLETE
webhook will notify you when the process has finished. If the value of theresult
field in the webhook body isSUCCESS
, the report was updated. If it wasFAILURE
, send the user through update mode and then try calling/credit/bank_income/refresh
again.If the report was updated, when you next call
/credit/bank_income/get
or/credit/bank_income/pdf/get
, the refreshed version of the report will be returned. To see old versions of the report, call/credit/bank_income/get
with theoptions.count
parameter set to a number greater than 1.
Bank Income update notifications
To alert you to when you might want to call /credit/bank_income/refresh
, Income can send webhooks when a change has been detected in the user's income.
To subscribe to these notifications:
- On the webhooks page in the Dashboard, enable Bank Income Refresh Update webhooks.
- Call
/credit/bank_income/webhook/update
with theuser_token
you would like to enable andenable_webhooks: true
.
A BANK_INCOME_REFRESH_UPDATE
webhook will then be sent if any of the following occur:
- A new income stream has been detected
- An existing income steam has been updated with new transactions
- An existing income stream appears to have stopped
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
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 (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.
When using special Sandbox test credentials (such as user_bank_income
/ {}
), use the /sandbox/public_token/create
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. To load this data into Sandbox, copy and paste the JSON into a new custom user via the Sandbox Users pane in the Dashboard.
/credit/bank_income/get
can optionally be tested in Sandbox without using Link. Call /user/create
and pass the returned user_token
to /sandbox/public_token/create
. /sandbox/public_token/create
must be called with the following request body:
1{2 "client_id": "${PLAID_CLIENT_ID}",3 "secret": "${PLAID_SECRET}",4 "institution_id": "ins_20", //any valid institution id is fine5 "initial_products": ["income_verification"],6 "user_token": "user-token-goes-here", //use the user_token from the `/user/create` call made earlier7 "income_verification": {8 "income_source_types": ["bank"],9 "bank_income": {10 "days_requested": 120 //any number of days under 730 is valid11 }12 },13 "options": {14 "override_username": "user_bank_income", //or other test user from Credit and Income testing credentials15 "override_password": "{}"16 }17}
After calling /sandbox/public_token/create
, call /credit/bank_income/get
using the same user_token
. The output of /sandbox/public_token/create
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. Bank Income Refresh is billed on a per-request fee model. To view the exact pricing you may be eligible for, apply for Production access or contact Sales. For more details about pricing and billing models, see Plaid billing.
Next steps
If you're ready to launch to Production, see the Launch checklist.