Link Web SDK
Reference for integrating with the Link JavaScript SDK and React SDK
Prefer to learn with code examples? Check out our GitHub repo with working example Link implementations for both JavaScript and React.
Installation
Select group for content switcherInclude the Plaid Link initialize script on each page of your site. It must always be loaded directly from https://cdn.plaid.com, rather than included in a bundle or hosted yourself. Unlike Plaid's other SDKs, the JavaScript web SDK is not versioned; cdn.plaid.com will automatically provide the latest available SDK.
<script src="https://cdn.plaid.com/link/v2/stable/link-initialize.js"></script>To get started with Plaid Link for React, clone the GitHub repository and review the example application and README, which provide reference implementations.
Next, you'll need to install the react-plaid-link package.
With npm:
npm install --save react-plaid-linkWith yarn:
yarn add react-plaid-linkThen import the necessary components and types:
import {
usePlaidLink,
PlaidLinkOptions,
PlaidLinkOnSuccess,
} from 'react-plaid-link';CSP directives
If you are using a Content Security Policy (CSP), use the following directives to allow Link traffic:
default-src https://cdn.plaid.com/;
script-src 'unsafe-inline' https://cdn.plaid.com/link/v2/stable/link-initialize.js;
frame-src https://cdn.plaid.com/;
connect-src https://production.plaid.com/;If using Sandbox instead of Production, make sure to update the connect-src directive to point to the appropriate server (https://sandbox.plaid.com).
If your organization does not allow the use of unsafe-inline, you can use a CSP nonce instead.
Creating a Link token
Before you can create an instance of Link, you need to first create a link_token. A link_token can be configured for
different Link flows and is used to control much of Link's behavior. To learn how to create a new
link_token, see the API Reference entry for /link/token/create.
Create
Plaid.create accepts one argument, a configuration Object, and returns an Object with three functions, open, exit, and destroy. Calling open will open Link and display the Consent Pane view, calling exit will close Link, and calling destroy will clean up the iframe.
It is recommended to call Plaid.create when initializing the view that is responsible for loading Plaid, as this will allow Plaid to pre-initialize Link, resulting in lower UI latency upon calling open, which can increase Link conversion.
When using the React SDK, this method is called usePlaidLink and returns an object with four values, open, exit, ready, and error. The values open and exit behave as described above. ready is a passthrough for onLoad and will be true when Link is ready to be opened. error is populated only if Plaid fails to load the Link JavaScript. There is no separate method to destroy Link in the React SDK, as unmount will automatically destroy the Link instance.
Note: Control whether or not your Link integration uses the Account Select view from the Dashboard.
Properties
tokenlink_token to authenticate your app with Link. This is a short lived, one-time use token that should be unique for each Link session. In addition to the primary flow, a link_token can be configured to launch Link in update mode. See the /link/token/create endpoint for a full list of configurations.onLoadplaidLinkHandler.open() prior to the onLoad callback will be delayed until the module is fully loaded.receivedRedirectUrireceivedRedirectUri is required to support OAuth authentication flows when re-launching Link on a mobile device.keypublic_key is no longer used for new implementations of Link. If your integration is still using a public_key, please contact Plaid support or your account manager.// The usePlaidLink hook manages Plaid Link creation
// It does not return a destroy function;
// instead, on unmount it automatically destroys the Link instance
const config: PlaidLinkOptions = {
onSuccess: (public_token, metadata) => {}
onExit: (err, metadata) => {}
onEvent: (eventName, metadata) => {}
token: 'GENERATED_LINK_TOKEN',
};
const { open, exit, ready } = usePlaidLink(config);
onSuccess
The onSuccess callback is called when a user successfully links an Item. It takes two arguments: the public_token and a metadata object.
Properties
public_tokennull. If using Document Income or Payroll Income, the public_token will be returned, but is not used.metadatainstitutionnull.name'Wells Fargo'institution_idaccountsaccounts will only include selected accounts.idaccount_idnamemasktypesubtypeverification_statuspending_automatic_verification: The Item is pending automatic verificationpending_manual_verification: The Item is pending manual micro-deposit verification. Items remain in this state until the user successfully verifies the deposit.automatically_verified: The Item has successfully been automatically verifiedmanually_verified: The Item has successfully been manually verifiedverification_expired: Plaid was unable to automatically verify the deposit within 7 calendar days and will no longer attempt to validate the Item. Users may retry by submitting their information again through Link.verification_failed: The Item failed manual micro-deposit verification because the user exhausted all 3 verification attempts. Users may retry by submitting their information again through Link.database_matched: The Item has successfully been verified using Plaid's data sources.database_insights_pending: The Database Insights result is pending and will be available upon Auth request.null: Neither micro-deposit-based verification nor database verification are being used for the Item.class_typebusiness or personal account.accountaccounts instead.link_session_idtransfer_statusCOMPLETE– The transfer was completed.INCOMPLETE– The transfer could not be completed. For help, see Troubleshooting Transfer UI.
COMPLETE, INCOMPLETEimport {
PlaidLinkOnSuccess,
PlaidLinkOnSuccessMetadata,
} from 'react-plaid-link';
const onSuccess = useCallback<PlaidLinkOnSuccess>(
(public_token: string, metadata: PlaidLinkOnSuccessMetadata) => {
// log and save metadata
// exchange public token (if using Item-based products)
fetch('//yourserver.com/exchange-public-token', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: {
public_token,
},
});
},
[],
);
{
institution: {
name: 'Wells Fargo',
institution_id: 'ins_4'
},
accounts: [
{
id: 'ygPnJweommTWNr9doD6ZfGR6GGVQy7fyREmWy',
name: 'Plaid Checking',
mask: '0000',
type: 'depository',
subtype: 'checking',
verification_status: null
},
{
id: '9ebEyJAl33FRrZNLBG8ECxD9xxpwWnuRNZ1V4',
name: 'Plaid Saving',
mask: '1111',
type: 'depository',
subtype: 'savings'
}
...
],
link_session_id: '79e772be-547d-4c9c-8b76-4ac4ed4c441a'
}onExit
The onExit callback is called when a user exits Link without successfully linking an Item, or when an error occurs during Link initialization. onExit takes two arguments, a nullable error object and a metadata object. The metadata parameter is always present, though some values may be null. Note that onExit will not be called when Link is destroyed in some other way than closing Link, such as the user hitting the browser back button or closing the browser tab on which the Link session is present.
Properties
errorerror_typeerror_codeerror_type has a specific set of error_codes.error_messagedisplay_messagenull if the error is not related to user action. This may change over time and is not safe for programmatic use.metadatainstitutionnull.nameWells Fargoinstitution_idstatusrequires_questionsrequires_selectionsrequires_codechoose_devicerequires_credentialsrequires_account _selectionrequires_oauthinstitution_not_foundinstitution_not _supportedlink_session_idrequest_idimport {
PlaidLinkOnExit,
PlaidLinkOnExitMetadata,
PlaidLinkError,
} from 'react-plaid-link';
const onExit = useCallback<PlaidLinkOnExit>(
(error: PlaidLinkError, metadata: PlaidLinkOnExitMetadata) => {
// log and save error and metadata
// handle invalid link token
if (error != null && error.error_code === 'INVALID_LINK_TOKEN') {
// generate new link token
}
// to handle other error codes, see https://plaid.com/docs/errors/
},
[],
);
{
error_type: 'ITEM_ERROR',
error_code: 'INVALID_CREDENTIALS',
error_message: 'the credentials were not correct',
display_message: 'The credentials were not correct.',
}{
institution: {
name: 'Wells Fargo',
institution_id: 'ins_4'
},
status: 'requires_credentials',
link_session_id: '36e201e0-2280-46f0-a6ee-6d417b450438',
request_id: '8C7jNbDScC24THu'
}onEvent
The onEvent callback is called at certain points in the Link flow. It takes two arguments, an eventName string and a metadata object.
The metadata parameter is always present, though some values may be null. Note that new eventNames, metadata keys, or view names may be added without notice.
The OPEN, LAYER_READY, LAYER_NOT_AVAILABLE, and LAYER_AUTOFILL_NOT_AVAILABLE events will fire in real time; subsequent events will fire at the end of the Link flow, along with the onSuccess or onExit callback. Callback ordering is not guaranteed; onEvent callbacks may fire before, after, or surrounding the onSuccess or onExit callback, and event callbacks are not guaranteed to fire in the order in which they occurred. If you need to determine the exact time when an event happened, use the timestamp in the metadata.
The following callback events are stable, which means that they are suitable for programmatic use in your application's logic: OPEN, EXIT, HANDOFF, SELECT_INSTITUTION, ERROR, BANK_INCOME_INSIGHTS_COMPLETED, IDENTITY_VERIFICATION_PASS_SESSION, IDENTITY_VERIFICATION_FAIL_SESSION, IDENTITY_MATCH_FAILED, IDENTITY_MATCH_PASSED, LAYER_READY, LAYER_NOT_AVAILABLE, LAYER_AUTOFILL_NOT_AVAILABLE. The remaining callback events are informational and subject to change and should be used for analytics and troubleshooting purposes only.
Properties
eventNameAUTO_SUBMIT_PHONE/link/token/create call and the user has previously consented to receive OTP codes from Plaid.BANK_INCOME_INSIGHTS _COMPLETEDCLOSE_OAUTHCONNECT_NEW _INSTITUTIONERRORerror_code metadata.FAIL_OAUTHHANDOFFIDENTITY_MATCH_FAILEDIDENTITY_MATCH_PASSEDIDENTITY_VERIFICATION _START_STEPview_name.IDENTITY_VERIFICATION _PASS_STEPview_name.IDENTITY_VERIFICATION _FAIL_STEPview_name.IDENTITY_VERIFICATION _PENDING_REVIEW_STEPIDENTITY_VERIFICATION _CREATE_SESSIONIDENTITY_VERIFICATION _RESUME_SESSIONIDENTITY_VERIFICATION _PASS_SESSIONIDENTITY_VERIFICATION _FAIL_SESSIONIDENTITY_VERIFICATION _PENDING_REVIEW _SESSIONIDENTITY_VERIFICATION _OPEN_UIIDENTITY_VERIFICATION _RESUME_UIIDENTITY_VERIFICATION _CLOSE_UILAYER_AUTOFILL_NOT _AVAILABLELAYER_NOT_AVAILABLELAYER_READYopen() may now be called.MATCHED_SELECT _INSTITUTIONrouting_number was provided when calling /link/token/create. For details on which scenario is triggering the event, see metadata.matchReason.OPENOPEN_MY_PLAIDOPEN_OAUTHSEARCH_INSTITUTIONSELECT_AUTH_TYPEselection metadata to indicate the user's selection.SELECT_BRANDSELECT_BRAND event is only emitted for large financial institutions with multiple online banking portals.SELECT_DEGRADED _INSTITUTIONDEGRADED health status and was shown a corresponding message.SELECT_DOWN _INSTITUTIONDOWN health status and was shown a corresponding message.SELECT_FILTERED _INSTITUTIONSELECT_INSTITUTIONSKIP_SUBMIT_PHONESUBMIT_ACCOUNT_NUMBERaccount_number_mask metadata to indicate the mask of the account number the user provided.SUBMIT_CREDENTIALSSUBMIT_DOCUMENTSSUBMIT_DOCUMENTS_ERRORSUBMIT_DOCUMENTS _SUCCESSSUBMIT_MFASUBMIT_OTPSUBMIT_PHONESUBMIT_ROUTING_NUMBERrouting_number metadata to indicate user's routing number.TRANSITION_VIEWTRANSITION_VIEW event indicates that the user has moved from one view to the next.VERIFY_PHONEVIEW_DATA_TYPESmetadataaccount_number_maskaccount_number_mask is empty. Emitted by SUBMIT_ACCOUNT_NUMBER.error_typeERROR, EXIT.error_codeERROR, EXIT.error_messageERROR, EXIT.exit_statusEXITinstitution_idinstitution_nameinstitution_search _querySEARCH_INSTITUTION.is_update_modeOPEN.match_reasonreturning_user or routing_number if emitted by: MATCHED_SELECT_INSTITUTION.
Otherwise, this will be SAVED_INSTITUTION or AUTO_SELECT_SAVED_INSTITUTION if emitted by: SELECT_INSTITUTION.routing_numberSUBMIT_ROUTING_NUMBER.mfa_typecode, device, questions, selections. Emitted by: SUBMIT_MFA and TRANSITION_VIEW when view_name is MFAview_nameTRANSITION_VIEW.ACCEPT_TOSCONNECTEDCONSENTCREDENTIALDOCUMENTARY _VERIFICATIONERROREXITINSTANT_MICRODEPOSIT _AUTHORIZEDKYC_CHECKLOADINGMFANUMBERSNUMBERS_SELECT _INSTITUTIONOAUTHPROFILE_DATA_REVIEWRECAPTCHARISK_CHECKSAME_DAY_MICRODEPOSIT _AUTHORIZEDSCREENINGSELECT_ACCOUNTSELECT_AUTH_TYPESELECT_BRANDSELECT_INSTITUTIONSELECT_SAVED_ACCOUNTSELECT_SAVED _INSTITUTIONSELFIE_CHECKSUBMIT_PHONEUPLOAD_DOCUMENTSVERIFY_PHONEVERIFY_SMSrequest_idlink_session_idlink_session_id is a unique identifier for a single session of Link. It's always available and will stay constant throughout the flow. Emitted by: all events.timestamp2017-09-14T14:42:19.350Z. Emitted by: all events.selectionflow_type_manual or flow_type_instant. Emitted by: SELECT_AUTH_TYPE.import {
PlaidLinkOnEvent,
PlaidLinkOnEventMetadata,
PlaidLinkStableEvent,
} from 'react-plaid-link';
const onEvent = useCallback<PlaidLinkOnEvent>(
(
eventName: PlaidLinkStableEvent | string,
metadata: PlaidLinkOnEventMetadata,
) => {
// log eventName and metadata
},
[],
);
{
error_type: 'ITEM_ERROR',
error_code: 'INVALID_CREDENTIALS',
error_message: 'the credentials were not correct',
exit_status: null,
institution_id: 'ins_4',
institution_name: 'Wells Fargo',
institution_search_query: 'wellsf',
mfa_type: null,
view_name: 'ERROR'
request_id: 'm8MDnv9okwxFNBV',
link_session_id: '30571e9b-d6c6-42ee-a7cf-c34768a8f62d',
timestamp: '2017-09-14T14:42:19.350Z',
selection: null,
}open()
Calling open will display the Consent Pane view to your user, starting the Link flow. Once open is called, you will begin receiving events via the onEvent callback.
Properties
const { open, exit, ready } = usePlaidLink(config);
// Open Link
if (ready) {
open();
}
exit()
The exit function allows you to programmatically close Link. Calling exit will trigger either the onExit or onSuccess callbacks.
The exit function takes a single, optional argument, a configuration Object.
Properties
forcetrue, Link will exit immediately. If false, or the option is not provided, an exit confirmation screen may be presented to the user.const { open, exit, ready } = usePlaidLink(config);
// Graceful exit - Link may display a confirmation screen
// depending on how far the user is in the flow
exit();
const { open, exit, ready } = usePlaidLink(config);
// Force exit - Link exits immediately
exit({ force: true });
destroy()
The destroy function allows you to destroy the Link handler instance, properly removing any DOM artifacts that were created by it. Use destroy() when creating new replacement Link handler instances in the onExit callback.
Properties
// On unmount usePlaidLink hook automatically destroys any
// existing link instance
submit
The submit function is currently only used in the Layer product. It allows the client application to submit additional user-collected data to the Link flow (e.g. a user phone number).
Properties
phone_numberdate_of_birthconst { open, exit, submit } = usePlaidLink(config);
// After collecting a user phone number...
submit({
"phone_number": "+14155550123"
});
OAuth
Using Plaid Link with an OAuth flow requires some additional setup instructions. For details, see the OAuth Guide.
Supported browsers
Plaid officially supports Link on the latest versions of Chrome, Firefox, Safari, and Edge. Browsers are supported on Windows, Mac, Linux, iOS, and Android. Previous browser versions are also supported, as long as they are actively maintained; Plaid does not support browser versions that are no longer receiving patch updates, or that have been assigned official end of life (EOL) or end of support (EOS) status.
Ad-blocking software is not officially supported with Link web, and some ad-blockers have known to cause conflicts with Link.
Example code in Plaid Pattern
For a real-life example of using Plaid Link for React, see LaunchLink.tsx. This file illustrates the code for implementation of Plaid Link for React for the Node-based Plaid Pattern sample app.