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

# Choosing an SDK

> Pick between Dojah's widget SDKs, which render the hosted verification UI inside your app, and the API clients that call the REST endpoints from your server.

Two ways to integrate in code: **widget SDKs** render Dojah’s hosted verification UI inside your app, while **API clients** call the REST endpoints from your server. Here’s how to pick — plus the configuration and response model shared by every widget SDK.

## Widget SDKs vs API clients

|          | Widget SDKs                               | API clients               |
| -------- | ----------------------------------------- | ------------------------- |
| Runs on  | The client (web / mobile app)             | Your server               |
| UI       | Dojah’s hosted flow, built in EasyOnboard | None — you build your own |
| Uses     | App ID + **public** key                   | App ID + **secret** key   |
| Best for | End-to-end onboarding with no UI work     | Direct, individual checks |

## Available SDKs

**Widget SDKs** — drop-in verification UI:

* [Web (JavaScript)](/api-reference/widget-sdks/web-javascript)
* [React](/api-reference/widget-sdks/react)
* [React Native](/api-reference/widget-sdks/react-native)
* [Flutter](/api-reference/widget-sdks/flutter)
* [iOS (Swift)](/api-reference/widget-sdks/ios-swift)
* [Android (Kotlin)](/api-reference/widget-sdks/android-kotlin)

**API clients** — call the REST API from your backend:

* [PHP](/api-reference/api-clients/php) · [Java](/api-reference/api-clients/java) · [Python](/api-reference/api-clients/python) · [Go](/api-reference/api-clients/go) · [TypeScript](/api-reference/api-clients/typescript)

## Packages and repositories

| Platform            | Package                                                                                 | Source                                                                                                            |
| ------------------- | --------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| Web (JavaScript)    | [widget.dojah.io/widget.js](https://widget.dojah.io/widget.js)                          | —                                                                                                                 |
| React               | [dojah-kyc-sdk-react](https://www.npmjs.com/package/dojah-kyc-sdk-react)                | [React-Js-sdk](https://github.com/dojah-inc/React-Js-sdk)                                                         |
| React Native (CLI)  | [dojah-kyc-sdk-react\_native](https://www.npmjs.com/package/dojah-kyc-sdk-react_native) | [dojah-react-native-sdk](https://github.com/dojah-inc/dojah-react-native-sdk)                                     |
| React Native (Expo) | [dojah-kyc-sdk-react-expo](https://www.npmjs.com/package/dojah-kyc-sdk-react-expo)      | [dojah\_kyc\_sdk\_rn\_expo](https://github.com/dojah-inc/dojah_kyc_sdk_rn_expo)                                   |
| Flutter (native)    | [dojah\_kyc\_sdk\_flutter](https://pub.dev/packages/dojah_kyc_sdk_flutter)              | [Dojah-flutter-sdk](https://github.com/dojah-inc/Dojah-flutter-sdk)                                               |
| Flutter (WebView)   | [flutter\_dojah\_kyc](https://pub.dev/packages/flutter_dojah_kyc)                       | [Flutter-SDK](https://github.com/dojah-inc/Flutter-SDK)                                                           |
| iOS (Swift)         | SPM / CocoaPods                                                                         | [sdk-swift](https://github.com/dojah-inc/sdk-swift) · [releases](https://github.com/dojah-inc/sdk-swift/releases) |
| Android (Kotlin)    | [JitPack](https://jitpack.io/#dojah-inc/sdk-kotlin)                                     | [sdk-kotlin](https://github.com/dojah-inc/sdk-kotlin)                                                             |

## Configuration options

The **web** widgets (JavaScript, React, and the Flutter WebView build) take an options object:

| Option      | Type   | Required | Description                                                              |
| ----------- | ------ | -------- | ------------------------------------------------------------------------ |
| `app_id`    | string | Yes      | Your application’s App ID from the dashboard.                            |
| `p_key`     | string | Yes      | Your public key (safe to use on the client).                             |
| `type`      | string | Yes      | Widget type — `custom`, `verification`, `identification`, or `liveness`. |
| `config`    | object | No       | Flow config, primarily `{ widget_id }` from EasyOnboard.                 |
| `user_data` | object | No       | Prefill `first_name`, `last_name`, `dob`, `residence_country`, `email`.  |
| `gov_data`  | object | No       | Prefill government IDs such as `bvn`, `nin`.                             |
| `metadata`  | object | No       | Any key/value pairs echoed back to you and in webhooks.                  |

<Note>
  **Mobile SDKs are simpler.** React Native, Flutter, iOS and Android launch with just a **WidgetID** (plus an optional reference ID and email). The whole flow — checks, branding, data collection — is configured in [EasyOnboard](/dashboard-guide/workflows/easyonboard) and identified by that WidgetID.
</Note>

## Handling the response

The web widgets report flow events through callbacks:

| Callback              | When it fires                                                  |
| --------------------- | -------------------------------------------------------------- |
| `onSuccess(response)` | The flow finished and submitted — `response` holds the result. |
| `onError(err)`        | Something failed during the flow.                              |
| `onClose()`           | The user closed the widget.                                    |

<Tip>
  Always confirm a verification **server-side** via [webhooks](/api-reference/core-concepts/webhooks-signatures) — never trust the client `success` event alone. Mobile flows report results via webhooks and the EasyOnboard [Verifications](/dashboard-guide/workflows/easyonboard/verifications) tab.
</Tip>
