Create a new Identity Verification
POST /identity_verification/create
Create a new Identity Verification for the user specified by the client_user_id and/or user_id field. At least one of these two fields must be provided. The requirements and behavior of the verification are determined by the template_id provided. If user_id is provided, there must be an associated user otherwise an error will be returned.
If you don't know whether an active Identity Verification exists for a given client_user_id and/or user_id, you can specify "is_idempotent": true in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated client_user_id and/or user_id, and template_id. If an Identity Verification is found, it will be returned unmodified with a 200 OK HTTP status code.
If user_id is not provided, you can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. If user_id is provided, user information can not be included in the request body. Please use the /user/update endpoint to update user data instead.
Request Body
Required
Request schema for /identity_verification/create
Parameters
client_user_id
/link/token/create client_user_id to be consistent. Personally identifiable information, such as an email address or phone number, should not be used in the client_user_id.
user_id
user_id generated by Plaid for the client-provided client_user_id. This field is currently in beta.
is_shareable
template_id
gave_consent
gave_consent is set to true, the accept_tos step will be marked as skipped and the end user’s session will start at the next step requirement.
user
email_address
phone_number
date_of_birth
name
address
id_number
Specifically, these fields are optional in that they can either be fully provided (satisfying every required field in their subschema) or omitted from the request entirely by not providing the key or value.
Providing these fields via the API will result in Link skipping the data collection process for the associated user. All verification steps enabled in the associated Identity Verification Template will still be run. Verification steps will either be run immediately, or once the user completes the accept_tos step, depending on the value provided to the gave_consent field.
If you are not using the shareable URL feature, you can optionally provide these fields via /link/token/create instead; both /identity_verification/create and /link/token/create are valid ways to provide this information. Note that if you provide a non-null user data object via /identity_verification/create, any user data fields entered via /link/token/create for the same client_user_id will be ignored when prefilling Link.
email_address
phone_number
date_of_birth
name
given_name
family_name
address
street
street2
city
region
postal_code
country
id_number
null. Otherwise, both fields are guaranteed to be filled.
value
type
client_user_id
user.client_user_id is deprecated. Please provide client_user_id at the root level instead.
client_id
client_id. The client_id is required and may be provided either in the PLAID-CLIENT-ID header or as part of a request body.
secret
secret. The secret is required and may be provided either in the PLAID-SECRET header or as part of a request body.
is_idempotent
client_user_id and template_id.
If idempotency is enabled, Plaid will return the existing Identity Verification. If idempotency is disabled, Plaid will reject the request with a 400 Bad Request status code if an Identity Verification already exists for the supplied client_user_id and template_id.
Response
A identity verification attempt represents a customer’s attempt to verify their identity, reflecting the required steps for completing the session, the results for each step, and information collected in the process.
Response Properties
id
client_user_id
/link/token/create client_user_id to be consistent. Personally identifiable information, such as an email address or phone number, should not be used in the client_user_id.
created_at
completed_at
previous_attempt_id
shareable_url
template
id
version
user
phone_number
date_of_birth
ip_address
email_address
name
given_name
family_name
address
street
street2
city
region
postal_code
country
id_number
null. Otherwise, both fields are guaranteed to be filled.
value
type
status
active - The Identity Verification attempt is incomplete. The user may have completed part of the session, but has neither failed or passed.
success - The Identity Verification attempt has completed, passing all steps defined to the associated Identity Verification template
failed - The user failed one or more steps in the session and was told to contact support.
expired - The Identity Verification attempt was active for a long period of time without being completed and was automatically marked as expired. Note that sessions currently do not expire. Automatic expiration is expected to be enabled in the future.
canceled - The Identity Verification attempt was canceled, either via the dashboard by a user, or via API. The user may have completed part of the session, but has neither failed or passed.
pending_review - The Identity Verification attempt template was configured to perform a screening that had one or more hits needing review.
steps
active - This step is the user’s current step. They are either in the process of completing this step, or they recently closed their Identity Verification attempt while in the middle of this step. Only one step will be marked as active at any given point.
success - The Identity Verification attempt has completed this step.
failed - The user failed this step. This can either call the user to fail the session as a whole, or cause them to fallback to another step depending on how the Identity Verification template is configured. A failed step does not imply a failed session.
waiting_for_prerequisite - The user needs to complete another step first, before they progress to this step. This step may never run, depending on if the user fails an earlier step or if the step is only run as a fallback.
not_applicable - This step will not be run for this session.
skipped - The retry instructions that created this Identity Verification attempt specified that this step should be skipped.
expired - This step had not yet been completed when the Identity Verification attempt as a whole expired.
canceled - The Identity Verification attempt was canceled before the user completed this step.
pending_review - The Identity Verification attempt template was configured to perform a screening that had one or more hits needing review.
manually_approved - The step was manually overridden to pass by a team member in the dashboard.
manually_rejected - The step was manually overridden to fail by a team member in the dashboard.
accept_tos
verify_sms
kyc_check
documentary_verification
selfie_check
watchlist_screening
risk_check
documentary_verification
documentary_verification step. This field will be null unless steps.documentary_verification has reached a terminal state of either success or failed.
status
documentary_verification step. This field will always have the same value as steps.documentary_verification.
documents
documentary_verification step. Each entry represents one user submission, where each submission will contain both a front and back image, or just a front image, depending on the document type.
Note: Plaid will automatically let a user submit a new set of document images up to three times if we detect that a previous attempt might have failed due to user error. For example, if the first set of document images are blurry or obscured by glare, the user will be asked to capture their documents again, resulting in at least two separate entries within documents. If the overall documentary_verification is failed, the user has exhausted their retry attempts.
status
documentary_verification.status that summarizes the verification outcome from one or more documents.
attempt
attempt field begins with 1 and increments with each subsequent document upload.
images
GET request for the associated Identity Verification attempt. A new expiring URL is generated with each request, so you can always rerequest the Identity Verification attempt if one of your URLs expires.
original_front
original_back
cropped_front
cropped_back
face
extracted_data
id_number
category
drivers_license - A driver’s license issued by the associated country, establishing identity without any guarantee as to citizenship, and granting driving privileges
id_card - A general national identification card, distinct from driver’s licenses as it only establishes identity
passport - A travel passport issued by the associated country for one of its citizens
residence_permit_card - An identity document issued by the associated country permitting a foreign citizen to temporarily reside there
resident_card - An identity document issued by the associated country permitting a foreign citizen to permanently reside there
visa - An identity document issued by the associated country permitting a foreign citizen entry for a short duration and for a specific purpose, typically no longer than 6 months
Note: This value may be different from the ID type that the user selects within Link. For example, if they select “Driver’s License” but then submit a picture of a passport, this field will say passport
expiration_date
issuing_country
issuing_region
date_of_birth
address
street, city, country. If any are missing or unable to be extracted, the address will be null.
region, and postal_code may be null based on the addressing system. For example:
Addresses from the United Kingdom will not include a region
Addresses from Hong Kong will not include postal code
Note: Optical Character Recognition (OCR) technology may sometimes extract incorrect data from a document.
street
city
region
postal_code
country
name
given_name
family_name
analysis
analysis object should help clarify why the document was rejected.
authenticity
match status for this field indicates that the document in the provided image seems to conform to the various formatting and security rules associated with the detected document.
image_quality
extracted_data
name
date_of_birth
expiration_date
no_data.
issuing_country
no_match on issuing_country fails the documentary_verification by editing your Plaid Template.
fraud_analysis_details
type_supported
portrait_presence_check
portrait_details_check
image_composition_check
integrity_check
detail_check
issue_date_check
image_quality_details
glare_check
dimensions_check
blur_check
human_review
status
success - The document passed the check.
failed - The document failed the check.
no_data - The document was submitted, but the document specialist review was not completed in time.
aamva_verification
is_verified
id_number
match - The field is an exact match with the state database.
no_match - The field is not an exact match with the state database.
no_data - The field was unable to be checked against state databases.
id_issue_date
match - The field is an exact match with the state database.
no_match - The field is not an exact match with the state database.
no_data - The field was unable to be checked against state databases.
id_expiration_date
match - The field is an exact match with the state database.
no_match - The field is not an exact match with the state database.
no_data - The field was unable to be checked against state databases.
street
match - The field is an exact match with the state database.
partial_match - The field is a partial match with the state database.
no_match - The field is not an exact match with the state database.
no_data - The field was unable to be checked against state databases.
city
match - The field is an exact match with the state database.
no_match - The field is not an exact match with the state database.
no_data - The field was unable to be checked against state databases.
postal_code
match - The field is an exact match with the state database.
partial_match - The field is a partial match with the state database.
no_match - The field is not an exact match with the state database.
no_data - The field was unable to be checked against state databases.
date_of_birth
match - The field is an exact match with the state database.
no_match - The field is not an exact match with the state database.
no_data - The field was unable to be checked against state databases.
gender
match - The field is an exact match with the state database.
no_match - The field is not an exact match with the state database.
no_data - The field was unable to be checked against state databases.
height
match - The field is an exact match with the state database.
no_match - The field is not an exact match with the state database.
no_data - The field was unable to be checked against state databases.
eye_color
match - The field is an exact match with the state database.
no_match - The field is not an exact match with the state database.
no_data - The field was unable to be checked against state databases.
first_name
match - The field is an exact match with the state database.
partial_match - The field is a partial match with the state database.
no_match - The field is not an exact match with the state database.
no_data - The field was unable to be checked against state databases.
middle_name
match - The field is an exact match with the state database.
partial_match - The field is a partial match with the state database.
no_match - The field is not an exact match with the state database.
no_data - The field was unable to be checked against state databases.
last_name
match - The field is an exact match with the state database.
partial_match - The field is a partial match with the state database.
no_match - The field is not an exact match with the state database.
no_data - The field was unable to be checked against state databases.
redacted_at
selfie_check
selfie_check step. This field will be null unless steps.selfie_check has reached a terminal state of either success or failed.
status
selfie_check step. This field will always have the same value as steps.selfie_check.
selfies
selfie_check step. Each entry represents one user submission.
status
selfie_check.status that summarizes the verification outcome from one or more selfies.
attempt
attempt field begins with 1 and increments with each subsequent selfie upload.
capture
image_url
video_url
analysis
analysis object should help clarify why the selfie was rejected.
document_comparison
liveness_check
facial_analysis
left_eye
right_eye
left_brow
right_brow
forehead
middle_forehead
nose
philtrum
mouth
jaw
left_cheek
right_cheek
kyc_check
kyc_check (Data Source Verification) step. This field will be null unless steps.kyc_check has reached a terminal state of either success or failed.
status
kyc_check step. This field will always have the same value as steps.kyc_check.
address
address field matched.
summary
match indicates that the provided input data was a strong match against external data.
partial_match indicates the data approximately matched against external data. For example, “Knope” vs. “Knope-Wyatt” for last name.
no_match indicates that Plaid was able to perform a check against an external data source and it did not match the provided input data.
no_data indicates that Plaid was unable to find external data to compare against the provided input data.
no_input indicates that Plaid was unable to perform a check because no information was provided for this field by the end user.
po_box
yes when a P.O. box is detected, no when Plaid confirmed the address is not a P.O. box, and no_data when Plaid was not able to determine if the address is a P.O. box.
type
no_data when Plaid does not have sufficient data to determine the address’s use.
street
match indicates that the provided input data was a strong match against external data.
partial_match indicates the data approximately matched against external data. For example, “Knope” vs. “Knope-Wyatt” for last name.
no_match indicates that Plaid was able to perform a check against an external data source and it did not match the provided input data.
no_data indicates that Plaid was unable to find external data to compare against the provided input data.
no_input indicates that Plaid was unable to perform a check because no information was provided for this field by the end user.
city
match indicates that the provided input data was a strong match against external data.
partial_match indicates the data approximately matched against external data. For example, “Knope” vs. “Knope-Wyatt” for last name.
no_match indicates that Plaid was able to perform a check against an external data source and it did not match the provided input data.
no_data indicates that Plaid was unable to find external data to compare against the provided input data.
no_input indicates that Plaid was unable to perform a check because no information was provided for this field by the end user.
region
match indicates that the provided input data was a strong match against external data.
partial_match indicates the data approximately matched against external data. For example, “Knope” vs. “Knope-Wyatt” for last name.
no_match indicates that Plaid was able to perform a check against an external data source and it did not match the provided input data.
no_data indicates that Plaid was unable to find external data to compare against the provided input data.
no_input indicates that Plaid was unable to perform a check because no information was provided for this field by the end user.
postal_code
match indicates that the provided input data was a strong match against external data.
partial_match indicates the data approximately matched against external data. For example, “Knope” vs. “Knope-Wyatt” for last name.
no_match indicates that Plaid was able to perform a check against an external data source and it did not match the provided input data.
no_data indicates that Plaid was unable to find external data to compare against the provided input data.
no_input indicates that Plaid was unable to perform a check because no information was provided for this field by the end user.
international_details
address field matched for fields that are only present on an international KYC check.
building
match indicates that the provided input data was a strong match against external data.
partial_match indicates the data approximately matched against external data. For example, “Knope” vs. “Knope-Wyatt” for last name.
no_match indicates that Plaid was able to perform a check against an external data source and it did not match the provided input data.
no_data indicates that Plaid was unable to find external data to compare against the provided input data.
no_input indicates that Plaid was unable to perform a check because no information was provided for this field by the end user.
county
match indicates that the provided input data was a strong match against external data.
partial_match indicates the data approximately matched against external data. For example, “Knope” vs. “Knope-Wyatt” for last name.
no_match indicates that Plaid was able to perform a check against an external data source and it did not match the provided input data.
no_data indicates that Plaid was unable to find external data to compare against the provided input data.
no_input indicates that Plaid was unable to perform a check because no information was provided for this field by the end user.
district
match indicates that the provided input data was a strong match against external data.
partial_match indicates the data approximately matched against external data. For example, “Knope” vs. “Knope-Wyatt” for last name.
no_match indicates that Plaid was able to perform a check against an external data source and it did not match the provided input data.
no_data indicates that Plaid was unable to find external data to compare against the provided input data.
no_input indicates that Plaid was unable to perform a check because no information was provided for this field by the end user.
house_number
match indicates that the provided input data was a strong match against external data.
partial_match indicates the data approximately matched against external data. For example, “Knope” vs. “Knope-Wyatt” for last name.
no_match indicates that Plaid was able to perform a check against an external data source and it did not match the provided input data.
no_data indicates that Plaid was unable to find external data to compare against the provided input data.
no_input indicates that Plaid was unable to perform a check because no information was provided for this field by the end user.
subpremise
match indicates that the provided input data was a strong match against external data.
partial_match indicates the data approximately matched against external data. For example, “Knope” vs. “Knope-Wyatt” for last name.
no_match indicates that Plaid was able to perform a check against an external data source and it did not match the provided input data.
no_data indicates that Plaid was unable to find external data to compare against the provided input data.
no_input indicates that Plaid was unable to perform a check because no information was provided for this field by the end user.
thoroughfare
match indicates that the provided input data was a strong match against external data.
partial_match indicates the data approximately matched against external data. For example, “Knope” vs. “Knope-Wyatt” for last name.
no_match indicates that Plaid was able to perform a check against an external data source and it did not match the provided input data.
no_data indicates that Plaid was unable to find external data to compare against the provided input data.
no_input indicates that Plaid was unable to perform a check because no information was provided for this field by the end user.
name
name field matched.
summary
match indicates that the provided input data was a strong match against external data.
partial_match indicates the data approximately matched against external data. For example, “Knope” vs. “Knope-Wyatt” for last name.
no_match indicates that Plaid was able to perform a check against an external data source and it did not match the provided input data.
no_data indicates that Plaid was unable to find external data to compare against the provided input data.
no_input indicates that Plaid was unable to perform a check because no information was provided for this field by the end user.
given_name
match indicates that the provided input data was a strong match against external data.
partial_match indicates the data approximately matched against external data. For example, “Knope” vs. “Knope-Wyatt” for last name.
no_match indicates that Plaid was able to perform a check against an external data source and it did not match the provided input data.
no_data indicates that Plaid was unable to find external data to compare against the provided input data.
no_input indicates that Plaid was unable to perform a check because no information was provided for this field by the end user.
family_name
match indicates that the provided input data was a strong match against external data.
partial_match indicates the data approximately matched against external data. For example, “Knope” vs. “Knope-Wyatt” for last name.
no_match indicates that Plaid was able to perform a check against an external data source and it did not match the provided input data.
no_data indicates that Plaid was unable to find external data to compare against the provided input data.
no_input indicates that Plaid was unable to perform a check because no information was provided for this field by the end user.
date_of_birth
date_of_birth field matched.
summary
match indicates that the provided input data was a strong match against external data.
partial_match indicates the data approximately matched against external data. For example, “Knope” vs. “Knope-Wyatt” for last name.
no_match indicates that Plaid was able to perform a check against an external data source and it did not match the provided input data.
no_data indicates that Plaid was unable to find external data to compare against the provided input data.
no_input indicates that Plaid was unable to perform a check because no information was provided for this field by the end user.
day
match indicates that the provided input data was a strong match against external data.
partial_match indicates the data approximately matched against external data. For example, “Knope” vs. “Knope-Wyatt” for last name.
no_match indicates that Plaid was able to perform a check against an external data source and it did not match the provided input data.
no_data indicates that Plaid was unable to find external data to compare against the provided input data.
no_input indicates that Plaid was unable to perform a check because no information was provided for this field by the end user.
month
match indicates that the provided input data was a strong match against external data.
partial_match indicates the data approximately matched against external data. For example, “Knope” vs. “Knope-Wyatt” for last name.
no_match indicates that Plaid was able to perform a check against an external data source and it did not match the provided input data.
no_data indicates that Plaid was unable to find external data to compare against the provided input data.
no_input indicates that Plaid was unable to perform a check because no information was provided for this field by the end user.
year
match indicates that the provided input data was a strong match against external data.
partial_match indicates the data approximately matched against external data. For example, “Knope” vs. “Knope-Wyatt” for last name.
no_match indicates that Plaid was able to perform a check against an external data source and it did not match the provided input data.
no_data indicates that Plaid was unable to find external data to compare against the provided input data.
no_input indicates that Plaid was unable to perform a check because no information was provided for this field by the end user.
id_number
id_number field matched.
summary
match indicates that the provided input data was a strong match against external data.
partial_match indicates the data approximately matched against external data. For example, “Knope” vs. “Knope-Wyatt” for last name.
no_match indicates that Plaid was able to perform a check against an external data source and it did not match the provided input data.
no_data indicates that Plaid was unable to find external data to compare against the provided input data.
no_input indicates that Plaid was unable to perform a check because no information was provided for this field by the end user.
phone_number
phone field matched.
summary
match indicates that the provided input data was a strong match against external data.
partial_match indicates the data approximately matched against external data. For example, “Knope” vs. “Knope-Wyatt” for last name.
no_match indicates that Plaid was able to perform a check against an external data source and it did not match the provided input data.
no_data indicates that Plaid was unable to find external data to compare against the provided input data.
no_input indicates that Plaid was unable to perform a check because no information was provided for this field by the end user.
area_code
match indicates that the provided input data was a strong match against external data.
partial_match indicates the data approximately matched against external data. For example, “Knope” vs. “Knope-Wyatt” for last name.
no_match indicates that Plaid was able to perform a check against an external data source and it did not match the provided input data.
no_data indicates that Plaid was unable to find external data to compare against the provided input data.
no_input indicates that Plaid was unable to perform a check because no information was provided for this field by the end user.
risk_check
risk_check step.
status
behavior
behavior attributes of risk check, when available.
user_interactions
genuine indicates the user has high familiarity with the data they are providing, and that fraud is unlikely.
neutral indicates some signals are present in between risky and genuine, but there are not enough clear signals to determine an outcome.
risky indicates the user has low familiarity with the data they are providing, and that fraud is likely.
no_data indicates there is not sufficient information to give an accurate signal.
fraud_ring_detected
yes indicates that fraud ring activity was detected.
no indicates that fraud ring activity was not detected.
no_data indicates there was not enough information available to give an accurate signal.
bot_detected
yes indicates that automated activity was detected.
no indicates that automated activity was not detected.
no_data indicates there was not enough information available to give an accurate signal.
risk_level
email
email attributes of risk check.
is_deliverable
breach_count
first_breached_at
last_breached_at
domain_registered_at
domain_is_free_provider
domain_is_custom
domain_is_disposable
top_level_domain_is_suspicious
linked_services
risk_level
factors
phone
phone attributes of risk check.
linked_services
risk_level
factors
devices
device attributes of risk check.
ip_proxy_type
none_detected indicates the user is not on a detectable proxy network.
tor indicates the user was using a Tor browser, which sends encrypted traffic on a decentralized network and is somewhat similar to a VPN (Virtual Private Network).
vpn indicates the user is on a VPN (Virtual Private Network)
web_proxy indicates the user is on a web proxy server, which may allow them to conceal information such as their IP address or other identifying information.
public_proxy indicates the user is on a public web proxy server, which is similar to a web proxy but can be shared by multiple users. This may allow multiple users to appear as if they have the same IP address for instance.
ip_spam_list_count
ip_timezone_offset
risk_level
factors
identity_abuse_signals
identity abuse, e.g. stolen and synthetic identity fraud. These attributes are only available for US identities and some signals may not be available depending on what information was collected.
synthetic_identity
score - A score from 0 to 100 indicating the likelihood that the user is a synthetic identity.
score
risk_level
first_party_synthetic_fraud
risk_level
third_party_synthetic_fraud
risk_level
stolen_identity
score - A score from 0 to 100 indicating the likelihood that the user is a stolen identity.
score
risk_level
network
risk_level
factors
verify_sms
verify_sms step.
status
verify_sms step. This field will always have the same value as steps.verify_sms.
verifications
verify_sms step. Each entry represents one user-submitted phone number. Phone number edits, and in some cases error handling due to edge cases like rate limiting, may generate additional verifications.
status
attempt
phone_number
delivery_attempt_count
solve_attempt_count
initially_sent_at
last_sent_at
redacted_at
watchlist_screening_id
beacon_user_id
user_id
user_id generated by Plaid for the client-provided client_user_id. This field is currently in beta.
redacted_at
request_id