This fictional used car marketplace application shows you how to verify a user's identity using Plaid Identity Verification. This application uses NodeJS on the backend, and vanilla JavaScript on the frontend.
For a video tour and walkthrough of this sample app, check out the Plaid Identity Verification: Demo Video.
We recommend having node version 16.x.x or later before attempting to run this application.
First, if you haven't already done so, sign up for your free Plaid API keys.
You may not have access to Identity Verification initially. Confirm your access in the Plaid Dashboard by selecting the dropdown list on the upper left with your team name. If you see "Identity Verification & Monitor" as one of the options, you have access. Otherwise, talk to your account manager or file a support ticket to request access to Identity Verification.
Using https:
git clone https://github.com/plaid/idv-quickstart
cd idv-quickstart
Alternatively, if you use ssh:
git clone git@github.com:plaid/idv-quickstart.git
cd idv-quickstart
Run npm install
inside your directory to install of the Node packages required
for this application to run.
Head over to the "Identity Verification and Monitor" section of the dashboard (you can find it in the drop-down list on the upper left).
Select "Switch to Sandbox" on the bottom left of your screen to set up a template in Sandbox mode
If there's already an Identity Verification template you want to use, you can skip ahead to the next section.
Otherwise, click the New Template button.
Fill out the Setup form however you'd like. We checked Attempt to auto-fill customer PII because it's fun to see. :) Note that you are required to enter a real working URL as your privacy policy link. You should also leave Verify Phone Number with SMS checked -- you would only uncheck this if your application already verifies the user's phone number through a separate mechanism.
Pick any color you'd like on the Design screen.
For the Workflow, you can configure the behavior you'd like to see under Workflow Management.
PII Verification
Selfie Behavior
You can leave Rulesets with the default values for now, but we'll come back to this soon.
Click Publish changes and exit the editor.
Copy .env.template
to a new file called .env
. Then open up .env
in your
favorite code editor and fill out the values.
cp .env.template .env
You can get your PLAID_CLIENT_ID
and PLAID_SECRET
values from the Keys section
of the Plaid dashboard
You can keep sandbox
as your environment.
For TEMPLATE_ID
, we'll need the ID of the Identity Verification template that
you created above. You can do this by selecting your template from the
templates screen, selecting
the template you created, and then clicking the Integration button on top.
You can leave LIGHTNING_ONLY_NO_SMS_ID
blank for now. We'll return to this in
a future step.
NOTE: .env files are a convenient local development tool. Never run a production application using an environment file with secrets in it. Use some kind of Secrets Manager (provided by most commercial cloud providers) instead
This application makes use of webhooks in certain flows so that it can receive messages from Plaid that the user is done with their Identity Verification process. If you want to see this part of the application in action, you will need to tell Plaid what webhook receiver it should send these messages to.
This webhook receiver will need to be available to the public in order for Plaid
to communicate with it. If you don't wish to publish this sample application to
a public server, one common option is to use a tool like
ngrok to open up a tunnel from the outside world to a
specific port running on localhost
.
The sample application users a separate server to receive webhooks running on port 8001, so if you have ngrok installed, you can run
ngrok http 8001
to open up a tunnel from the outside world to this server. The final URL will be
the domain that ngrok has created, plus the path /server/receive_webhook
. It
will probably look something like:
https://abde-123-4-567-8.ngrok.io/server/receive_webhook
Unlike many other Plaid products, you won't configure the webhook URL when creating an Item. Instead, you'll use the Plaid dashboard at https://dashboard.plaid.com/team/webhooks to tell Plaid what endpoint to call when sending webhooks. From this page:
You can also repeat the process for the "step updated" and "retried" events if you want to see them in action, although our application doesn't do anything with these.
At this point, any webhooks called by Identity Verification will be sent to the URL you specified. If you ever restart ngrok and end up with a new domain, make sure to add the new webhook to the dashboard.
The code that is used to process these endpoints is contained in the
webhookServer.js
file.
You can run your application by typing
npm run watch
on the command line. If there are no issues, you should see a message telling you that you can open up http://localhost:8000/ to view your running app!
Baby You Can Buy My Car is a fictional marketplace app that requires users to verify their identity before they can fully sign up for the app. This sample application simulates four different ways that a user could verify their identity. Obviously, in a real app, you wouldn't present all four options to a user; this is just for demonstration purposes.
Create an account or sign in with a existing account to start the process.
The Standard flow involves users verifying their identity through Link, the client-side widget that Plaid provides to developers that handles most of the UI work for you.
To activate the standard flow, click the Verify My Identity button. If you are running in Sandbox mode, Plaid Identity Verification will only accept one identity, that of Leslie Knope with the values specified here. The UI in Sandbox mode will also give you these values in the upper-right side of the screen.
With Lightning verification, if you fill out these values correctly, your identity will be accepted.
If you fill out these values incorrectly (and have selected the appropriate workflow), Identity Verification will fall back to Document verification.
In Document verification, you will be asked to take pictures of an appropriate piece of identification using your phone. In the Sandbox environment, the application will assume you always submit a valid drivers license with the same name and date of birth as that of our test user. (Leslie Knope, January 18, 1975)
So if you wish to see what a "failed Lightning, but passed Documentation" flow looks like, try entering a different phone number, social security number, and/or address, but make sure to enter the correct name and birthday.
You should view the code for the full details, but essentially:
/link/token/create
endpoint,
and passes this token back up to the client./identity_verification/get
with this
session ID. It will receive information about the user's verification
attempt, like whether it was successful or not, the userID associated with
this session, and information like the user's full name and mailing address.If you have the user's email address, you should include it when creating the link token in step 2 -- Identity Verification runs a number of different fraud checks against this email. It is considered best practice to verify the user's email address before submitting it, something we are not doing in our sample app.
If you want to see more details about a user's latest Identity Verification attempt, the best place to do this would be the Identity Verification section of the Plaid Dashboard. Click into the verificaiton template you used in the demo. From there, you'll be able to see full details about every user attempt by status: What they entered, why they might have failed, and you can perform important actions like ask your user to retry different steps.
You can also see details about a user's Identity Verification attempts by
expanding the "Debug Tools" section and clicking the "See my most recent
attempt" button or the "See all my IDV attempts" button. The former will have
our server make a call to /identity_verification/get
(passing along the most
recent IDV session ID, which we fetch from our database). The latter will have
our server make a call to /identity_verification/list
(passing along the
user's ID).
We summarize these results on screen, but you can also look at your browser's JavaScript console to see the full object that gets returned from these calls.
These Debug Tools are there to demonstrate what kind of results you might get
back from /identity_verification/get
and /identity_verification/list
. It
would be rare for a typical client application to make calls to these endpoints
or share this information with the user.
Once a user has completed an Identity Verification attempt, they typically cannot retry it without you, the developer, initiating it on their behalf. To do this, select the user's Identity Verification attempt in the Plaid dashboard (whether it has succeeded or failed) and click the Request Retry option underneath their name. You can choose to retry the entire attempt from the beginning, or perform a special Identity Verification flow.
Note that requesting a retry will create a new Identity Verification session.
You can see a list of all of the user's Identity Verification sessions by
looking at the results of the /identity_verification/list
call, as described
above.
As you're testing Identity Verification, you might notice that your attempts start to fail because your user failed the Risk Check. This is a check that looks for risky behavior such as a user trying to verify multiple identities from the same device or the same IP address, something that commonly occurs when you're testing Identity Verification.
If you want to allow this on a case-by-case basis, you can manually select the failed Identity Verification attempt in the Plaid dashboard and then click Override Result in the Potential Risks section. Click the "Verify my Identity" button again in the browser and your Identity Verification session will succeed.
If you want to allow this permanently, you can edit the template in the Plaid dashboard:
In some cases, you might already have information about your user that Identity Verification will want, such as your user's full name, phone number, date of birth, or mailing address. Rather than put your user through the trouble of entering this information a second time, you can "kick-start" your user's Identity Verification process by sending this information to Plaid before starting the Identity Verification flow.
To try out the pre-fill flow, click on the Pre-fill some data button. We'll simulate entering the name, date of birth, and mailing address for our test user. Then click the Verify my identity button. You'll notice that when you verify your user's identity this time, you'll have much fewer fields to fill out.
Note that you have to add the user's information before starting the Identity Verification flow. You can't add it once the process has begun.
Again, make sure to view the code for the full details, but essentially:
/identity_verification/create
to initiate an
Identity Verification session, adding in whatever information we already know
about the user./identity_verification/create
.
This is fine -- there's no need to regenerate a new Link token.user_id
which was used to generate the Link token is the same as the user_id
which
was used to create a Identity Verification session, and it won't ask the user
to enter information that it already received in step 1.It is not necessary for you to verify information like the user's name or mailing address before sending it to Plaid -- that's what Identity Verification is for (with the exception of the user's email address, which we recommend you verify). However, it should be made clear when you collect this information from the user that they should be sending you legitimate data that will be used for identity verification purposes.
Typically, when your users complete the Identity Verification process, they'll do so within your application using Link, Plaid's client-side widget that handles all of the UI work for you. But you also have the option of generating a URL that you can direct your users to in order to complete the process.
The most common scenario for using a shareable URL is when a company hasn't integrated Identity Verification into their app, but needs to occasionally verify a user's identity on an ad hoc basis. For example, a customer's account might be flagged for suspicious activity and your customer service team will want to verify their identity as an extra security step. This is typically done through the Plaid dashboard:
get_basic_user_info
call
in your browser.You should be able to see your customer's Identity Verification status, along with the data they entered, in the appropriate section of the panel for the Identity Verification template. ("In progress", "Passed", "Failed", etc.)
It's less common to use a shareable URL within your application if you've already integrated the Plaid API -- most applications would prefer that their users stay within their application via the Link widget rather than switch to another tab or another browser. But we've included this process here for completeness.
To try generating a Shareable URL in the browser, click the Generate a Shareable URL button. You will be given a URL to follow that opens up the Identity Verification process in a new window.
When you're done (assuming you have webhooks working), your client page should update after a few seconds to reflect your verified identity. If you don't have webhooks working, you can click the Simulate receiving a webhook button to complete the process.
/identity_verification/create
to initiate a
Identity Verification session, adding the is_shareable: true
argument to
indicate that we want to generate a URL that can be shared with the user.STATUS_UPDATED
webhook with the Identity Verification session ID./identity_verification/get
with this
session ID and it will update your user's entry in the database accordingly./server/fake_webhook
endpoint on
the server will pretend as though it has received a webhook for this user by
looking up the most recent Identity Verification session ID that we have
stored for this user. Then it will perform steps 4-5 with this session ID.In some cases, your application may already have all of the information you need to verify your user without any additional input from them. Alternately, you might want to build a completely custom frontend without using Link. In these situations, you can attempt to verify your user's identity completely on the server.
For the backend-only flow to work, you'll need to make sure you're using an Identity Verification template that is using the "Lightning Only" flow, and doesn't require SMS verification.
To create a new template, follow the steps for creating an Identity Verification template at the beginning of this readme, but with the following exceptions:
Warning: You should only skip verifying your user's phone number in Identity Verification if your application is already performing this verification on its own.
Copy the template ID for the template you just created, and paste that into your
.env file as the value for the LIGHTNING_ONLY_NO_SMS_ID
entry. If you're
running npm run watch
, the server should automatically restart.
You can then start the backend-only flow by checking the Terms of Service checkbox, and then clicking the Server-only verification button. If you have webhooks working, your application should update after a few seconds with your newly identified user.
If you don't have webhooks working, you can click the Simulate receiving a webhook button, and your application should update as well
Note that Identity Verification sessions created this way will not show up in the "See all my IDV attempts" results, because that call is made using your original Identity Verification template.
/identity_verification/create
to initiate a
Identity Verification session, sending across all of the data Plaid would
need to verify the user's identity, including their name, address, phone
number, and last 4 digits of their social security number.
gave_consent: true
value to indicate that our user has
consented to their data being shared with Plaid for verification purposes.
(This is usually mentioned as part of your application's terms of service.
Please consult with your legal counsel on the actual wording to use -- our
law background consists of watching reruns of Judge Judy.)STATUS_UPDATED
webhook with the Identity Verification session ID./identity_verification/get
with this
session ID and it updates your user's entry in the database accordingly./server/fake_webhook
endpoint on
the server will pretend as though it has received a webhook for this user by
looking up the most recent Identity Verification session ID that we have
stored for this user and then running steps 3-4.