---
title: "React Native SDK guide | Veriff.com"
slug: "react-native-sdk-guide"
description: "Integrate Veriff's React Native SDK with iOS and Android; learn setup, permissions, and customization for seamless verification flows."
updated: 2026-05-14T10:42:14Z
published: 2026-05-14T11:04:44Z
---

> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.veriff.com/llms.txt
> Use this file to discover all available pages before exploring further.

# React Native SDK guide

## Requirements and prerequisites

### Requirements

Integration with Veriff React Native SDK requires the project to target:

- iOS minimum version 15.1 or higher
- Android minimum version 8.0 (api 26) or higher

### Prerequisites

- You have an active account with Veriff (see the [Getting Started](/v1/docs/getting-started) section)
- You have an integration with Veriff (see the [Getting Started](/v1/docs/getting-started) section)
- You have set up webhook(s) to get replies from Veriff (see the [Webhooks](/v1/docs/webhooks-guide) section)

- If using Expo: add the plugin to `app.json` and use EAS Build
- If using React Native CLI: follow standard installation

---

## Add SDK to the project

### **Step 1: Add the Veriff React Native SDK**

Either to your `package.json` file:

```bash
npx yarn add @veriff/react-native-sdk
```

Or if using `npm`:

```bash
npm install @veriff/react-native-sdk --save
```

### **Step 2: Update Android**`build.gradle`**file**

Open the root `build.gradle` file in the `android` folder and add a new Maven destination to the repositories in the `allprojects` section. The best place is right after the local `node_modules` repositories and before the `google()` repository.

KotlinGroovy

```kotlin
allprojects {
    repositories {
        // ... local react native repos
        maven { url = uri("https://cdn.veriff.me/android/") } //veriff
        google()
        jcenter()
    }
}
```

```groovy
allprojects {
    repositories {
        // ... local react native repos
        maven { url "https://cdn.veriff.me/android/" } //veriff
        google()
        jcenter()
    }
}
```

---

## iOS specific configuration

#### Add Swift to the `ios` module

Veriff SDK requires your `ios` module to have some Swift code. If you do not have any Swift code yet then add a new `empty.swift` file in Xcode. If Xcode offers to add a bridging header then add it.

#### Update iOS `Podfile`

Open `Podfile` in the `ios` folder and make sure that `platform` is 15.1 or higher:

```swift
platform :ios, '15.1'
```

Also make sure your main target in the `Podfile` contains `use_native_modules!` directive:

```swift
target 'MyApp' do
  # pod 'foo'...

  config = use_native_modules!
end
```

### Usage descriptions

Veriff requires **camera, microphone, photo library and optionally NFC reader permissions** for capturing photos, video and scanning passports or ID cards during identification. **Your application is responsible for describing the reason why** camera, microphone, photo library and NFC reader are used. You need to add the three descriptions listed below to the `Info.plist` file of your application with the explanation of the usage.

- `NSCameraUsageDescription`
- `NSMicrophoneUsageDescription`
- `NSPhotoLibraryUsageDescription`

> [!CAUTION]
> Not adding these permissions will cause the system to shut down the application when it requests the permissions.

### Enable NFC scanning

The NFC scanning logic is provided as a separate framework. If this feature is enabled in your integration, you can add the framework by updating the `Podfile`:

```ruby
target 'MyApp' do
   ...
   pod 'VeriffNFCSDK'
   ...
end
```

<meta charset="utf-8">

### NFC scanning permissions

1. Add `NFCReaderUsageDescription` description to `Info.plist`.
2. In the Info.plist file, define the list of application IDs or AIDs it can connect to (the AID is a way of uniquely identifying an application on a ISO 7816 tag, which is usually defined by a standard)

```markup
<key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key>
<array>
	<string>D23300000045737445494420763335</string>
	<string>A0000002471001</string>
	<string>A0000002472001</string>
	<string>00000000000000</string>
</array>
```

1. Introduce a new entitlement for NFC scanning, a feature made available from iOS 13 onwards. Xcode automatically adds this entitlement when you activate the Near Field Communication Tag Reading feature in the target Signing & Capabilities. Following the activation of this feature, the *.entitlements file should include the TAG format.

```markup
<key>com.apple.developer.nfc.readersession.formats</key>
<array>
    <string>TAG</string>
</array>
```

### Set the iOS target in Xcode

Make sure that the **iOS Deployment Target**in Xcode (under Project > target > Info > Deployment Target) is set to iOS `15.1` or later.

---

## Start a verification flow

### **Step 1: Import Veriff in your code**

Import it to the file that will use the React Native SDK.

```swift
import VeriffSdk from '@veriff/react-native-sdk';
```

### **Step 2: Start the verification flow**

Launch Veriff using the defined parameters below:

```typescript
import VeriffSdk from '@veriff/react-native-sdk';
```

| Parameters | Description |
| --- | --- |
| `sessionUrl`* | A combination of the `base URL` and the `sessionToken`, created as soon as a verification session is created. You can find its value in the response payload of your <meta charset="utf-8">[POST /sessions](https://veriff-dev-documentation.document360.io/apidocs/v1sessions)[↗] call, as `verification.url`. See [Create a verification session](/v1/docs/how-to-generate-sessions-manually) article for more info. |

### What happens after the end-user leaves the flow?

When the end-user leaves the verification flow, i.e. a session is canceled or finished, the Veriff SDK is closed. The end-user is taken back to your application. The **end-user flow completion status** is returned to the host application, see [Verification session status](/v1/docs/react-native-sdk-guide#how-to-get-verification-session-status) explanation below for more info.

---

## Verification session status

The result returned by `launchVeriff` will have a `status` field that is one of either `VeriffSdk.statusDone`, `VeriffSdk.statusCanceled` or `VeriffSdk.statusError`.

In case of `statusError` there will be a error code (not human-readable) in the `error` field.

> [!NOTE]
> **This is not the verification session decision.**
> 
> This indicates whether the end-user was able to complete all the steps in the verification flow or not.

```typescript
var result = await VeriffSdk.launchVeriff({ sessionUrl: SESSION_URL });
switch (result.status) {
  case VeriffSdk.statusDone:
    // end-user submitted the images and completed the flow
    // note that this does not mean a final decision yet
    break;
  case VeriffSdk.statusCanceled:
    // end-user canceled the flow before completing
    break;
  case VeriffSdk.statusError:
    // the flow could not be completed due to an error
    console.log("Veriff verification failed with error=" + result.error);
    break;
}
```

---

## Verification session decision

Veriff returns info about the verification session decision, extracted data, registries checks etc via **webhooks**. You need to set up webhooks and tie them to your system.

→*See Webhooks Guide > [Set up webhooks](https://veriff-dev-documentation.document360.io/docs/webhooks-guide#set-up-webhooks) sub-section for detailed overview of the setup process*

---

## Customize the SDK

> [!NOTE]
> <meta charset="utf-8">SDK customization is optional

It is possible to customize the look and feel of the UI to match your branding. You can change primitives such as colors and fonts, set the language settings for the SDK, and change if/how an intro screen is displayed.

### Match the brand

Veriff React Native SDK allows the customization of your brand's colors, font and logo in the SDK flow.

Note: all custom values for branding are optional. If a value is not provided for them, the default Veriff color and logo will be used.

**Pass the optional parameters** when launching Veriff:

```typescript
var result = await VeriffSdk.launchVeriff({
    sessionUrl: SESSION_URL,
    branding: {
      logo: 'parrot', // see alternative options for logo below
      background: '#ff00ff',
      onBackground: '#ffffff',
      onBackgroundSecondary: '#ff00ff',
      onBackgroundTertiary: '#000000',
      primary: '#333333',
      onPrimary: '#444444',
      secondary: '#333333',
      onSecondary: '#444444',
      outline: '#444444',
      cameraOverlay: '#59496a',
      onCameraOverlay: '#e27e23',
      error: '#333333',
      success: '#444444',
      feedbackSuccess: '#1f7a44',
      onFeedbackSuccess: '#ffffff',
      feedbackError: '#7a1f1f',
      onFeedbackError: '#ffffff',
      buttonRadius: 28,
      iOSFont: {
        regular: 'Font-Regular',
        medium: 'Font-Medium',
        bold: 'Font-Bold',
      },
      androidFont: {
        regular: 'font_regular',
        medium: 'font-medium',
        bold: 'font_bold',
      }
    },
  });
```

For logo, the image assets need to be added into:

- `Xcode` assets in the iOS project, and
- `drawable folders` in the Android project

In the example above you would need to add an image asset named 'parrot' into Xcode assets and 'parrot.png' to Android drawable folder `android/src/main/res`.

*→ See the [Visual SDK customization guides](https://devdocs.veriff.com/docs/sdk-guide#visual-sdk-customization-guides) article for design examples*

### **Alternative ways to provide the logo**

Instead of using platform-specific image assets, you can provide a URI to an image which will then be used:

```typescript
var result = await VeriffSdk.launchVeriff({
    sessionUrl: SESSION_URL,
    branding: {
      logo: { uri: 'http://example.com/logo/parrot.jpg' },
    },
  });
```

React Native assets are also supported through `resolveAssetSource`:

```typescript
const resolveAssetSource = require('react-native/Libraries/Image/resolveAssetSource');
const parrot = require('./img/parrot.png');

var result = await VeriffSdk.launchVeriff({
    sessionUrl: SESSION_URL,
    branding: {
      logo: resolveAssetSource(parrot),
    },
  });
```

### Intro screen

In some cases, it is possible to replace the Veriff’s generic introduction screen with a custom intro screen.

> [!NOTE]
> <meta charset="utf-8">Check with your **Solutions Engineer** to confirm if this feature can be enabled for your integration

If it is possible, the following will happen:

- You agree your own introduction screen visuals and copy with our Solutions Engineer and get relevant legal documents signed in case they are needed
- After that Veriff will enable custom introduction screen from backend for your integrations
- After you have implemented your own introduction screen you can change the configuration option specified below

```typescript
var result = await VeriffSdk.launchVeriff({
    sessionUrl: SESSION_URL,
    locale: 'et',
    customIntroScreen: true
  });
```

> [!CAUTION]
> Adding the configuration alone in your app is not enough to enable the custom intro screen. Make sure to contact your solutions engineer so they can enable the feature for your integration.

### User interface language settings

The Veriff RN SDK allows setting the language of the SDK. In order to use this language, pass the `locale` as in example below.

```typescript
var result = await VeriffSdk.launchVeriff({
    sessionUrl: SESSION_URL,
    locale: 'et'
  });
```

*→ See*[*Supported languages in SDKs*](/v1/docs/sdk-guide#supported-languages)*article for more info*

---

## Changelog

| Date | Description |
| --- | --- |
| May 14, 2026 | Updated **Match the brand** section with new branding colors |
| Jan 20, 2026 | - Removed note “When using Expo” - Added guidelines for Expo and for React Native CLI to [Prerequisites](/v1/docs/react-native-sdk-guide#prerequisites) |
| Dec 12, 2025 | Duplicate word removed |
| Jun 19, 2025 | iOS minimum version updated from 13.4 to 15.1 |
| Jun 6, 2025 | “Enable NFC scanning” section added |

A **process where the end-user submits the data** required to get verified.

Also referred to as the "end-user flow".

## Related

- [Create verification session](/how-to-generate-sessions-manually.md)
- [Intro to the API](/quick-guide-of-idv-using-the-api.md)
- [Webhooks Guide](/webhooks-guide.md)
- [Backwards compatible changes](/backwards-compatible-changes.md)
- [React Native changelog](/react-native-changelog.md)
- [React Native SDK migration guide](/react-native-sdk-migration-guide.md)
- [Android SDK guide](/android-sdk-guide.md)
- [iOS SDK guide](/ios-sdk-guide.md)
