action plaid_identity_verification_get {
label: "Retrieve Identity Verification"
description: "Retrieve a previously created identity verification."
provider: plaid
method: POST
path: "/identity_verification/get"
encoding: json
input: {
type: "object"
description: "Request input for fetching an identity verification"
required: ["identity_verification_id"]
properties: {
client_id: {
type: "string"
description: "Your Plaid API `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."
}
identity_verification_id: {
type: "string"
description: "ID of the associated Identity Verification attempt."
}
secret: {
type: "string"
description: "Your Plaid API `secret`. The `secret` is required and may be provided either in the `PLAID-SECRET` header or as part of a request body."
}
}
}
output: {
type: "object"
description: "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."
required: ["client_user_id", "completed_at", "created_at", "documentary_verification", "id", "kyc_check", "previous_attempt_id", "redacted_at", "request_id", "shareable_url", "status", "steps", "template", "user", "watchlist_screening_id"]
properties: {
client_user_id: {
type: "string"
description: "An identifier to help you connect this object to your internal systems. For example, your database ID corresponding to this object."
}
completed_at: {
type: "string"
format: "date-time"
description: "An ISO8601 formatted timestamp."
}
created_at: {
type: "string"
format: "date-time"
description: "An ISO8601 formatted timestamp."
}
documentary_verification: {
type: "object"
description: "Data, images, analysis, and results from the `documentary_verification` step. This field will be `null` unless `steps.documentary_verification` has reached a terminal state of either `success` or `failed`."
required: ["documents", "status"]
properties: {
documents: {
type: "array"
description: "An array of documents submitted to the `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.\n\nNote: 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."
items: {
type: "object"
description: "Images, extracted data, and analysis from a user's identity document"
required: ["analysis", "attempt", "extracted_data", "images", "status", "redacted_at"]
properties: {
analysis: {
type: "object"
description: "High level descriptions of how the associated document was processed. If a document fails verification, the details in the `analysis` object should help clarify why the document was rejected."
required: ["authenticity", "image_quality", "extracted_data"]
properties: {
authenticity: {
type: "string"
description: "High level summary of whether the document in the provided image matches the formatting rules and security checks for the associated jurisdiction.\n\nFor example, most identity documents have formatting rules like the following:\n\n\nThe image of the person's face must have a certain contrast in order to highlight skin tone\n\n\nThe subject in the document's image must remove eye glasses and pose in a certain way\n\n\nThe informational fields (name, date of birth, ID number, etc.) must be colored and aligned according to specific rules\n\n\nSecurity features like watermarks and background patterns must be present\n\nSo a `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."
enum: ["match", "partial_match", "no_match", "no_data"]
}
extracted_data: {
type: "object"
description: "Analysis of the data extracted from the submitted document."
required: ["name", "date_of_birth", "expiration_date", "issuing_country"]
properties: {
date_of_birth: {
type: "string"
description: "A match summary describing the cross comparison between the subject's date of birth, extracted from the document image, and the date of birth they separately provided to the identity verification attempt."
enum: ["match", "partial_match", "no_match"]
}
expiration_date: {
type: "string"
description: "A description of whether the associated document was expired when the verification was performed.\n\nNote: In the case where an expiration date is not present on the document or failed to be extracted, this value will be `no_data`."
enum: ["not_expired", "expired", "no_data"]
}
issuing_country: {
type: "string"
description: "A binary match indicator specifying whether the country that issued the provided document matches the country that the user separately provided to Plaid.\n\nNote: You can configure whether a `no_match` on `issuing_country` fails the `documentary_verification` by editing your Plaid Template."
enum: ["match", "no_match"]
}
name: {
type: "string"
description: "A match summary describing the cross comparison between the subject's name, extracted from the document image, and the name they separately provided to identity verification attempt."
enum: ["match", "partial_match", "no_match"]
}
}
}
image_quality: {
type: "string"
description: "A high level description of the quality of the image the user submitted.\n\nFor example, an image that is blurry, distorted by glare from a nearby light source, or improperly framed might be marked as low or medium quality. Poor quality images are more likely to fail OCR and/or template conformity checks.\n\nNote: By default, Plaid will let a user recapture document images twice before failing the entire session if we attribute the failure to low image quality."
enum: ["high", "medium", "low"]
}
}
}
attempt: {
type: "number"
description: "The `attempt` field begins with 1 and increments with each subsequent document upload."
}
extracted_data: {
type: "object"
description: "Data extracted from a user-submitted document."
required: ["id_number", "category", "expiration_date", "issuing_country", "issuing_region"]
properties: {
category: {
type: "string"
description: "The type of identity document detected in the images provided. Will always be one of the following values:\n\n `drivers_license` - A driver's license for the associated country\n\n `id_card` - A general national identification card, distinct from driver's licenses\n\n `passport` - A passport for the associated country\n\n `residence_permit_card` - An identity document permitting a foreign citizen to temporarily reside in the associated country\n\n `resident_card` - An identity document permitting a foreign citizen to permanently reside in the associated country\n\nNote: 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`"
enum: ["drivers_license", "id_card", "passport", "residence_permit_card", "resident_card"]
}
expiration_date: {
type: "string"
format: "date"
description: "A date in the format YYYY-MM-DD (RFC 3339 Section 5.6)."
}
id_number: {
type: "string"
description: "Alpha-numeric ID number extracted via OCR from the user's document image."
}
issuing_country: {
type: "string"
description: "Valid, capitalized, two-letter ISO code representing the country of this object. Must be in ISO 3166-1 alpha-2 form."
}
issuing_region: {
type: "string"
description: "An ISO 3166-2 subdivision code. Related terms would be \"state\", \"province\", \"prefecture\", \"zone\", \"subdivision\", etc."
}
}
}
images: {
type: "object"
description: "URLs for downloading original and cropped images for this document submission. The URLs are designed to only allow downloading, not hot linking, so the URL will only serve the document image for 60 seconds before expiring. The expiration time is 60 seconds after the `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."
required: ["original_front", "original_back", "cropped_front", "cropped_back", "face"]
properties: {
cropped_back: {
type: "string"
description: "Temporary URL that expires after 60 seconds for downloading a cropped image containing just the back of the document. Might be null if the back of the document was not collected."
}
cropped_front: {
type: "string"
description: "Temporary URL that expires after 60 seconds for downloading a cropped image containing just the front of the document."
}
face: {
type: "string"
description: "Temporary URL that expires after 60 seconds for downloading a crop of just the user's face from the document image. Might be null if the document does not contain a face photo."
}
original_back: {
type: "string"
description: "Temporary URL that expires after 60 seconds for downloading the original image of the back of the document. Might be null if the back of the document was not collected."
}
original_front: {
type: "string"
description: "Temporary URL that expires after 60 seconds for downloading the uncropped original image of the front of the document."
}
}
}
redacted_at: {
type: "object"
additionalProperties: true
}
status: {
type: "string"
description: "An outcome status for this specific document submission. Distinct from the overall `documentary_verification.status` that summarizes the verification outcome from one or more documents."
enum: ["success", "failed", "manually_approved"]
}
}
}
}
status: {
type: "string"
description: "The outcome status for the associated Identity Verification attempt's `documentary_verification` step. This field will always have the same value as `steps.documentary_verification`."
}
}
}
id: {
type: "string"
description: "ID of the associated Identity Verification attempt."
}
kyc_check: {
type: "object"
description: "Additional information for the `kyc_check` step. This field will be `null` unless `steps.kyc_check` has reached a terminal state of either `success` or `failed`."
required: ["address", "date_of_birth", "id_number", "name", "phone_number", "status"]
properties: {
address: {
type: "object"
description: "Result summary object specifying how the `address` field matched."
required: ["po_box", "summary", "type"]
properties: {
po_box: {
type: "string"
description: "Field describing whether the associated address is a post office box. Will be `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."
enum: ["yes", "no", "no_data"]
}
summary: {
type: "string"
description: "An enum indicating the match type between data provided by user and data checked against an external data source.\n\n\n`match` indicates that the provided input data was a strong match against external data.\n\n`partial_match` indicates the data approximately matched against external data. For example, \"Knope\" vs. \"Knope-Wyatt\" for last name.\n\n`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.\n\n`no_data` indicates that Plaid was unable to find external data to compare against the provided input data.\n\n`no_input` indicates that Plaid was unable to perform a check because no information was provided for this field by the end user."
enum: ["match", "partial_match", "no_match", "no_data", "no_input"]
}
type: {
type: "string"
description: "Field describing whether the associated address is being used for commercial or residential purposes.\n\nNote: This value will be `no_data` when Plaid does not have sufficient data to determine the address's use."
enum: ["residential", "commercial", "no_data"]
}
}
}
date_of_birth: {
type: "object"
description: "Result summary object specifying how the `date_of_birth` field matched."
required: ["summary"]
properties: {
summary: {
type: "object"
additionalProperties: true
}
}
}
id_number: {
type: "object"
description: "Result summary object specifying how the `id_number` field matched."
required: ["summary"]
properties: {
summary: {
type: "object"
additionalProperties: true
}
}
}
name: {
type: "object"
description: "Result summary object specifying how the `name` field matched."
required: ["summary"]
properties: {
summary: {
type: "object"
additionalProperties: true
}
}
}
phone_number: {
type: "object"
description: "Result summary object specifying how the `phone` field matched."
required: ["summary"]
properties: {
summary: {
type: "object"
additionalProperties: true
}
}
}
status: {
type: "string"
description: "The outcome status for the associated Identity Verification attempt's `kyc_check` step. This field will always have the same value as `steps.kyc_check`."
}
}
}
previous_attempt_id: {
type: "string"
description: "The ID for the Identity Verification preceding this session. This field will only be filled if the current Identity Verification is a retry of a previous attempt."
}
redacted_at: {
type: "object"
additionalProperties: true
}
request_id: {
type: "string"
description: "A unique identifier for the request, which can be used for troubleshooting. This identifier, like all Plaid identifiers, is case sensitive."
}
shareable_url: {
type: "string"
description: "A shareable URL that can be sent directly to the user to complete verification"
}
status: {
type: "string"
description: "The status of this Identity Verification attempt.\n\n\n`active` - The Identity Verification attempt is incomplete. The user may have completed part of the session, but has neither failed or passed.\n\n`success` - The Identity Verification attempt has completed, passing all steps defined to the associated Identity Verification template\n\n`failed` - The user failed one or more steps in the session and was told to contact support.\n\n`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.\n\n`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.\n\n`pending_review` - The Identity Verification attempt template was configured to perform a screening that had one or more hits needing review."
enum: ["active", "success", "failed", "expired", "canceled", "pending_review"]
}
steps: {
type: "object"
description: "Each step will be one of the following values:\n\n\n`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.\n\n`success` - The Identity Verification attempt has completed this step.\n\n`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.\n\n`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.\n\n`not_applicable` - This step will not be run for this session.\n\n`skipped` - The retry instructions that created this Identity Verification attempt specified that this step should be skipped.\n\n`expired` - This step had not yet been completed when the Identity Verification attempt as a whole expired.\n\n`canceled` - The Identity Verification attempt was canceled before the user completed this step.\n\n`pending_review` - The Identity Verification attempt template was configured to perform a screening that had one or more hits needing review.\n\n`manually_approved` - The step was manually overridden to pass by a team member in the dashboard.\n\n`manually_rejected` - The step was manually overridden to fail by a team member in the dashboard."
required: ["accept_tos", "documentary_verification", "kyc_check", "risk_check", "selfie_check", "verify_sms", "watchlist_screening"]
properties: {
accept_tos: {
type: "string"
description: "The status of a step in the identity verification process."
enum: ["success", "active", "failed", "waiting_for_prerequisite", "not_applicable", "skipped", "expired", "canceled", "pending_review", "manually_approved", "manually_rejected"]
}
documentary_verification: {
type: "object"
additionalProperties: true
}
kyc_check: {
type: "object"
additionalProperties: true
}
risk_check: {
type: "object"
additionalProperties: true
}
selfie_check: {
type: "object"
additionalProperties: true
}
verify_sms: {
type: "object"
additionalProperties: true
}
watchlist_screening: {
type: "object"
additionalProperties: true
}
}
}
template: {
type: "object"
description: "The resource ID and version number of the template configuring the behavior of a given identity verification."
required: ["id", "version"]
properties: {
id: {
type: "string"
description: "ID of the associated Identity Verification template."
}
version: {
type: "number"
description: "Version of the associated Identity Verification template."
}
}
}
user: {
type: "object"
description: "The identity data that was either collected from the user or provided via API in order to perform an identity verification."
required: ["address", "date_of_birth", "email_address", "id_number", "ip_address", "name"]
properties: {
address: {
type: "object"
description: "Even if an address has been collected, some fields may be null depending on the region's addressing system. For example:\n\nAddresses from the United Kingdom will not include a region\n\nAddresses from Hong Kong will not include postal code"
required: ["city", "country", "postal_code", "region", "street", "street2"]
properties: {
city: {
type: "string"
description: "City from the end user's address"
}
country: {
type: "object"
additionalProperties: true
}
postal_code: {
type: "string"
description: "The postal code for the associated address. Between 2 and 10 alphanumeric characters. For US-based addresses this must be 5 numeric digits."
}
region: {
type: "object"
additionalProperties: true
}
street: {
type: "string"
description: "The primary street portion of an address. If the user has submitted their address, this field will always be filled."
}
street2: {
type: "string"
description: "Extra street information, like an apartment or suite number."
}
}
}
date_of_birth: {
type: "object"
additionalProperties: true
}
email_address: {
type: "string"
format: "email"
description: "A valid email address."
}
id_number: {
type: "object"
description: "ID number submitted by the user, currently used only for the Identity Verification product. If the user has not submitted this data yet, this field will be `null`. Otherwise, both fields are guaranteed to be filled."
required: ["type", "value"]
properties: {
type: {
type: "string"
description: "A globally unique and human readable ID type, specific to the country and document category. For more context on this field, see [Hybrid Input Validation](https://plaid.com/docs/identity-verification/hybrid-input-validation)."
enum: ["ar_dni", "au_drivers_license", "au_passport", "br_cpf", "ca_sin", "cl_run", "cn_resident_card", "co_nit", "dk_cpr", "eg_national_id", "es_dni", "es_nie", "hk_hkid", "in_pan", "it_cf", "jo_civil_id", "jp_my_number", "ke_huduma_namba", "kw_civil_id", "mx_curp", "mx_rfc", "my_nric", "ng_nin", "nz_drivers_license", "om_civil_id", "ph_psn", "pl_pesel", "ro_cnp", "sa_national_id", "se_pin", "sg_nric", "tr_tc_kimlik", "us_ssn", "us_ssn_last_4", "za_smart_id"]
}
value: {
type: "string"
description: "Value of identity document value typed in by user. Alpha-numeric, with all formatting characters stripped."
}
}
}
ip_address: {
type: "string"
description: "An IPv4 or IPV6 address."
}
name: {
type: "object"
description: "The full name provided by the user. If the user has not submitted their name, this field will be null. Otherwise, both fields are guaranteed to be filled."
required: ["family_name", "given_name"]
properties: {
family_name: {
type: "string"
description: "A string with at least one non-whitespace character, with a max length of 100 characters."
}
given_name: {
type: "string"
description: "A string with at least one non-whitespace character, with a max length of 100 characters."
}
}
}
phone_number: {
type: "string"
description: "A phone number in E.164 format."
}
}
}
watchlist_screening_id: {
type: "string"
description: "ID of the associated screening."
}
}
}
}