# Verify an Identity

## Verify Identity using Personally Identifiable Information

Verify identity using the name, address and date of birth provided by a user. This information is verified using trusted data sources.

{% tabs %}
{% tab title="Swift" %}

```swift
do {
    let input = VerifyIdentityInput(
        firstName: firstName, 
        lastName: lastName, 
        address: address, 
        city: city, 
        state: state, 
        postalCode: postalCode, 
        country: country, 
        dateOfBirth: dateOfBirth
    )
    let verifiedIdentity = try await identityVerificationClient.verifyIdentity(
        input: input
    )
    if verifiedIdentity.verified {
        // Identity verified succcessfully.
    } else {
        // Identity could not be verified.
    }
} catch {
    // Handle error. An error may be thrown if the backend is unable to perform
    // requested operation due to availability or security issues.
    // An error might be also be thrown for unrecoverable circumstances arising
    // from programmatic error or configuration error. For example, if the keychain
    // access entitlement is not set up correctly or basic system resources are
    // unavailable.
}
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
val input = VerifyIdentityInput(
    firstName = "John",
    lastName = "Smith",
    address = "222333 Peachtree Place",
    city = "Atlanta",
    state = "GA",
    postalCode = "30318",
    country = "US",
    dateOfBirth = "1975-02-28"
)
launch {
    try {
        val verifiedIdentity = withContext(Dispatchers.IO) {
            identityVerificationClient.verifyIdentity(
                input
            ) 
        }
        // The returned [verifiedIdentity] result has been verified.
    } catch (e: SudoIdentityVerificationException) {
        // Handle errors.
    }
}
```

{% endtab %}

{% tab title="TypeScript" %}

```typescript
try {
    const verifiedIdentity = await identityVerificationClient.verifyIdentity({
        firstName: 'John',
        lastName: 'Smith',
        address: '222333 Peachtree Place',
        city: 'Atlanta',
        state: 'GA',
        postalCode: '30318',
        country: 'US',
        dateOfBirth: '1975-02-28',
    })

    if (verifiedIdentity.verified) {
        // proceed to the next stage of the app
    }
    else {
        if (verifiedIdentity.canAttemptVerificationAgain) {
            // user is permitted to try again
        }
        else {
            if (verifiedIdentity.requiredVerificationMethod === 'GOVERNMENT_ID') {
                // can attempt verification with government issued
                // identity documents.
            }
            else {
                // maximum retries exceeded, or the reason for failed 
                // verification prevents retry, e.g. PII is of a deceased
                // person.
            }
        }
    }
}
catch (err) {
    // Handle errors
}
```

{% endtab %}
{% endtabs %}

* Name and address fields are case-insensitive.
* City and state are optional fields.
* The country value must be an ISO 3166-1 alpha-2 code returned from the `listSupportedCountries()` API.
* The format required for dateOfBirth is `yyyy-mm-dd`

As well as returning a boolean indicator of the result of identity verification, the verified identity also provides the following information about the state of the identity verification attempt:

* The `verificationMethod` property indicates the level of identity verification achieved for this user. Possible values are `NONE`, `KNOWLEDGE_OF_PII` and `GOVERNMENT_ID`.
* For successfully verified identities, the `verifiedAtEpochMs` property specifies when verification succeeded. Where verification is not successful, the property will be set to 0 and can be ignored.
* The `verificationLastAttemptedAtEpochMs` property specifies when the user last attempted identity verification, irrespective of whether verification was successful or not. For a user where identity verification has never been attempted, or where identity verification has not been attempted since an administrative reset of their identity verification status, the value will be 0.
* The `requiredVerificationMethod` property indicates the level of identity verification required for this user in order to successfully complete identity verification. Different Sudo Platform environments may have different minimum required levels as well as cases where some users may require to achieve a higher level of verification, either to unlock greater entitlements or to manage risk.
* The `canAttemptVerificationAgain` property indicates whether the Sudo Platform will accept new identity verification attempts for this user. This property will be set to `false` if the configured maximum number of retries is exceeded or earlier verification results do not permit retries to mitigate the risk of fraud, e.g. providing the PII of a deceased person.
* The `attemptsRemaining` property indicates the number of verification attempts remaining to the user. Subsequent failure attempts will decrease this value monotonically. Some failure cases, such as where fraud is suspected, will return `0` for this property irrespective of how many attempts are normally permissible.
* In Sudo Platform environments performing identity verification against live data sources, the `idScanUrl` property provides a link to a web page where a user can interactively take photos of their government issued identity documents and upload them for verification.
* The `consented` property will be set in environments where user consent is being managed by the Secure ID Verification service.

The `requiredVerificationMethod` and `canAttemptVerificationAgain` properties can be used in a client application to guide a user's identity verification journey. For example, an application might attempt to verify using PII until achieving success, or `canAttemptVerificationAgain` is set to false. In the latter case, if the `requiredVerificationMethod` is set to `GOVERNMENT_ID`, the user could be directed to upload their id document, either via the `verifyIdentityDocument` API described below, or by rendering the web page indicated by the `idScanUrl` property described above.

When `requiredVerificationMethod` is returned set to `GOVERNMENT_ID`, the `acceptableDocumentTypes` list will be set to the list of document types that can be accepted to verify the user's identity.&#x20;

{% hint style="info" %}
Once the user's identity has been verified successfully the verification status, including verification method, is persisted on the user record in Sudo Platform and the user is not required to verify their identity again.
{% endhint %}

## Determine if a Face Image is Required with ID Document Verification

To check if a face image must be provided along with ID document at the time of document verification (see verifyIdentityDocument method described below):

{% tabs %}
{% tab title="Swift" %}

```swift
do {
    let faceImageRequired = try await identityVerificationClient.isFaceImageRequiredWithDocumentVerification(option: .remoteOnly)
} catch {
    // Handle error. An error may be thrown if the backend is unable to perform
    // requested operation due to availability or security issues.
    // An error might be also be thrown for unrecoverable circumstances arising
    // from programmatic error or configuration error. For example, if the keychain
    // access entitlement is not set up correctly or basic system resources are
    // unavailable.
}
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
CoroutineScope(Dispatchers.IO).launch {
    try {
        val faceImageRequired = identityVerificationClient.isFaceImageRequiredWithDocumentVerification()
    } catch (e: SudoIdentityVerificationException) {
        // Handle errors.
    }
}
```

{% endtab %}

{% tab title="TypeScript" %}

```typescript
try {
  const faceImageRequired = await identityVerificationClient.isFaceImageRequiredWithDocumentVerification()
}
catch (err) {
  // Handle errors
}
```

{% endtab %}
{% endtabs %}

The `isFaceImageRequiredWithDocumentVerification()` API returns a boolean value.

## Verify Identity using Identity Documents

Verify identity by validating images of a driver's license, passport or other government issued identity document.

Before a user's identity can be verified using identity documents, they must first attempt identity verification using personally identifiable information (see the API above).

{% tabs %}
{% tab title="Swift" %}

```swift
do {
    let verifiedIdentity = try await identityVerificationClient.verifyIdentityDocument(
        input: VerifyIdentityDocument(
            image: frontImage, 
            backImage: backImage,
            faceImage: faceImage, // only include if required
            country: country,
            documentType: .driverLicense
        )
    )
    if verifiedIdentity.verified {
        // Identity verified succcessfully.
    } else {
        // Identity could not be verified.
    }
} catch {
    // Handle error.
}
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
val input = VerifyIdentityDocumentInput(
    documentType = IdDocumentType.driverLicense,
    country = "US",
    imageBase64 = encodedDocumentFrontImage,
    backImageBase64 = encodedDocumentBackImage
    faceImageBase64: encodedFaceImage, // only include if required
)
launch {
    try {
        val verifiedIdentity = withContext(Dispatchers.IO) {
            identityVerificationClient.verifyIdentityDocument(
                input
            ) 
        }
        // The returned [verifiedIdentity] result has been verified.
    } catch (e: SudoIdentityVerificationException) {
        // Handle errors.
    }
}
```

{% endtab %}

{% tab title="TypeScript" %}

```typescript
try {
  const verifiedIdentity = await identityVerificationClient.verifyIdentityDocument({
    documentType: IdDocumentType.driverLicense,
    country: 'US',
    imageBase64: encodedDocumentFrontImage,
    backImageBase64: encodedDocumentBackImage,
    faceImageBase64: encodedFaceImage, // only include if required
  })
}
catch (err) {
  // Handle errors
}
```

{% endtab %}
{% endtabs %}

* Identity documents must be issued by a government agency.
* The document type can be one of `driverLicense`, `passport` or `idCard`.
* The country value must be an ISO 3166-1 alpha-2 code returned from the `listSupportedCountries()` API.
* Images of identification documents should be taken against a dark background, in a well-lit room and fill the majority of the image, with only a small border of the background surface showing.
* All four corners of the identification document must be visible in the image.
* Prior to Base64 encoding, the images should be in PNG, JPG or GIF format, and not exceed 5 MB in size each.
* When submitting a passport for verification, use the photo page image for both the front and back images.
* The face image parameter must only be included if required, based on the result of the `isFaceImageRequiredWithDocumentVerification` API described above.

Once submitted the document verification process can be immediate or may take some time. The status of the document verification process is returned in the `documentVerificationStatus` property of the result. The `documentVerificationStatus` property of the returned `VerifiedIdentity` can have the following values:

<table><thead><tr><th width="326">documentVerificationStatus value</th><th>Meaning</th></tr></thead><tbody><tr><td><code>notRequired</code></td><td>Required verification method does not require submission of an ID document</td></tr><tr><td><code>notAttempted</code></td><td>Required verification method requires submission of an ID document but ID document submission has not yet been performed.</td></tr><tr><td><code>captureInitiated</code></td><td>Applicable for verification using document capture, the capture URL has been generated by the provider but not yet opened.</td></tr><tr><td><code>captureLinkOpened</code></td><td>Applicable for verification using document capture, the capture URL has been opened but document submission has not yet been performed.</td></tr><tr><td><code>captureRetryLimitExceeded</code></td><td>Applicable for verification using document capture, the capture URL has been opened too many times according to the provider.</td></tr><tr><td><code>captureLinkTimeout</code></td><td>Applicable for verification using document capture, the capture URL was not opened within the allowed time window.</td></tr><tr><td><code>captureLinkExpired</code></td><td>Applicable for verification using document capture, the capture URL was never opened and has expired.</td></tr><tr><td><code>pending</code></td><td>Document verification could not be completed synchronously and status will need to be periodically checked. To check, call the <code>checkIdentityVerification</code> method.</td></tr><tr><td><code>documentUnreadable</code></td><td>The submitted document images could not be processed because they do not meet one or more of the criteria documented above.</td></tr><tr><td><code>succeeded</code></td><td>The submitted document images were able to be used to successfully verify the user's identity. This is a final state.</td></tr><tr><td><code>failed</code></td><td>The submitted document images were not able to be used to successfully verify the user's identity. This is a final state.</td></tr></tbody></table>

{% hint style="info" %}
Once the user's identity has been verified successfully the verification status is persisted on the user record and the user is not required to verify their identity again.
{% endhint %}

## Determine if a Face Image is Required with ID Document Capture

To check if a face image must be provided along with ID document at the time of document capture (see captureAndVerifyIdentityDocument method described below):

{% tabs %}
{% tab title="Swift" %}

```swift
do {
    let faceImageRequired = try await identityVerificationClient.isFaceImageRequiredWithDocumentCapture(option: .remoteOnly)
} catch {
    // Handle error. An error may be thrown if the backend is unable to perform
    // requested operation due to availability or security issues.
    // An error might be also be thrown for unrecoverable circumstances arising
    // from programmatic error or configuration error. For example, if the keychain
    // access entitlement is not set up correctly or basic system resources are
    // unavailable.
}
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
CoroutineScope(Dispatchers.IO).launch {
    try {
        val faceImageRequired = identityVerificationClient.isFaceImageRequiredWithDocumentCapture()
    } catch (e: SudoIdentityVerificationException) {
        // Handle errors.
    }
}
```

{% endtab %}

{% tab title="TypeScript" %}

```typescript
try {
  const faceImageRequired = await identityVerificationClient.isFaceImageRequiredWithDocumentCapture()
}
catch (err) {
  // Handle errors
}
```

{% endtab %}
{% endtabs %}

The `isFaceImageRequired()` API returns a boolean value.

## Capture and Verify Identity Document

#### Upload ID Document Images via API

Use this API to initiate an on-boarding process.  ID document images are provided to this API, which attempts to extract the identity information from the images of government issued ID documents, and then verify the identity using the extracted information.

Unlike the `verifyIdentityDocument()` API described above, `verifyIdentity()` API should not be called before calling the `captureAndVerifyIdentityDocument()` API.

{% tabs %}
{% tab title="Swift" %}

```swift
do {
    let verifiedIdentity = try await identityVerificationClient.captureAndVerifyIdentityDocument(
        input: VerifyIdentityDocument(
            image: frontImage, 
            backImage: backImage,
            faceImage: faceImage, // only include if required
            country: country,
            documentType: .driverLicense
        )
    )
    if verifiedIdentity.verified {
        // Identity verified succcessfully.
    } else {
        // Identity could not be verified.
    }
} catch {
    // Handle error.
}
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
val input = VerifyIdentityDocumentInput(
    documentType = IdDocumentType.driverLicense,
    country = "US",
    imageBase64 = encodedDocumentFrontImage,
    backImageBase64 = encodedDocumentBackImage
    faceImageBase64: encodedFaceImage, // only include if required
)
launch {
    try {
        val verifiedIdentity = withContext(Dispatchers.IO) {
            identityVerificationClient.captureAndVerifyIdentityDocument(
                input
            ) 
        }
        // The returned [verifiedIdentity] result has been verified.
    } catch (e: SudoIdentityVerificationException) {
        // Handle errors.
    }
}
```

{% endtab %}

{% tab title="TypeScript" %}

```typescript
try {
  const verifiedIdentity = await identityVerificationClient.captureAndVerifyIdentityDocument({
    documentType: IdDocumentType.driverLicense,
    country: 'US',
    imageBase64: encodedDocumentFrontImage,
    backImageBase64: encodedDocumentBackImage,
    faceImageBase64: encodedFaceImage, // only include if required
  })
}
catch (err) {
  // Handle errors
}
```

{% endtab %}
{% endtabs %}

* Identity documents must be issued by a government agency.
* The document type can be one of `driverLicense` or `idCard`. Passport images cannot be used as they do not provide a mechanism to verify address.
* The country value must be an ISO 3166-1 alpha-2 code returned from the `listSupportedCountries()` API.
* Images of identification documents should be taken against a dark background, in a well-lit room and fill the majority of the image, with only a small border of the background surface showing.
* All four corners of the identification document must be visible in the image.
* Prior to Base64 encoding, the images should be in PNG, JPG or GIF format, and not exceed 5 MB in size each.
* The face image parameter must only be included if required, based on the result of the `isFaceImageRequiredWithDocumentCapture` API described above.

#### Upload ID Document Images via Web Browser

Use this API to initiate an on-boarding process where ID document images are uploaded via a web browser.&#x20;

{% tabs %}
{% tab title="Swift" %}

```swift
do {
    let idDocumentCaptureInitiationInfo = try await identityVerificationClient.initiateIdentityDocumentCapture()
    // browse to idDocumentCaptureInitiationInfo.documentCaptureUrl
} catch {
    // Handle error.
}
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
launch {
    try {
        val idDocumentCaptureInitiationInfo = withContext(Dispatchers.IO) {
            identityVerificationClient.initiateIdentityDocumentCapture() 
        }
        // browse to idDocumentCaptureInitiationInfo.documentCaptureUrl
    } catch (e: SudoIdentityVerificationException) {
        // Handle errors.
    }
}
```

{% endtab %}

{% tab title="TypeScript" %}

```typescript
try {
  const idDocumentCaptureInitiationInfo = await identityVerificationClient.initiateIdentityDocumentCapture()
  // browse to idDocumentCaptureInitiationInfo.documentCaptureUrl 
}
catch (err) {
  // Handle errors
}
```

{% endtab %}
{% endtabs %}

* Identity documents must be issued by a government agency.
* Once obtained in a successful response to this API, the value of the `documentCaptureUrl` can be used to direct the end user to the web site where they can upload their ID document. The expiry time for the URL is also provided.
* The web site will guide the end user and preprocess ID document images to ensure they meet the provider requirements including brightness, contrast, glare and cropping.
* If facial comparison is configured in the environment, the web site will also guide the end user to capture a facial image.
* After completing the upload, the client application should call the API to Check Secure ID Verification Status to retrieve the result of the ID document capture and verification.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.sudoplatform.com/guides/identity-verification/verifying-an-identity.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
