SDKs & Libraries
Two families of SDK, split by what they're allowed to do. Server SDKs (Python, Node.js, PHP, Go) hold your secret key and can verify identity, touch billing, and do everything else in the API reference — never ship one of these into browser or mobile client code. Client SDKs (JavaScript, React Native, Flutter, Kotlin) only mint and join realtime calls/streams/chat using a publishable key minted by your own backend — they cannot verify identity or move money, by design.
Server SDKs
phone_number is required on live BVN checks — the upstream provider rejects the request without it. Test keys ignore it. All four also support /v1/verify/document, /v1/verify/liveness, and /v1/verify/face-match (multipart file uploads).
Python
Django, FastAPI, Flask · PyPIpip install identifyorgfrom identifyorg import IdentifyOrgClient
client = IdentifyOrgClient(api_key="io_live_xxxx")
# phone_number is required on live keys — the upstream provider
# rejects BVN checks without it. first_name/last_name/date_of_birth
# are optional, used for cross-match scoring.
result = client.verify_bvn(
bvn="12345678901",
phone_number="08012345678",
date_of_birth="1992-04-15",
)
print(result["match"], result["data"])
# File uploads (document OCR, liveness, face match) accept a file
# path, raw bytes, or an open file-like object
liveness = client.verify_liveness("selfie.jpg")
face = client.verify_face_match("selfie.jpg", "id_photo.jpg")Node.js
Express, Next.js API routes, NestJS · npmnpm install @identifyorg/node-sdkconst { IdentifyOrgClient } = require("@identifyorg/node-sdk");
const client = new IdentifyOrgClient({ apiKey: "io_live_xxxx" });
const result = await client.verify.bvn({
bvn: "12345678901",
phone_number: "08012345678", // required on live keys
date_of_birth: "1992-04-15", // optional, for cross-match
});
console.log(result.match, result.data);
// File uploads: pass a file path (string), a Buffer, or a Blob
const liveness = await client.verify.liveness("selfie.jpg");
const face = await client.verify.faceMatch("selfie.jpg", "id_photo.jpg");PHP
Laravel, Symfony · Packagistcomposer require identifyorg/sdk-php$client = new \IdentifyOrg\IdentifyOrgClient('io_live_xxxx');
// $phoneNumber required on live keys, $dateOfBirth optional (both ISO
// for date, e.g. "1992-04-15")
$result = $client->verifyBvn('12345678901', null, null, '1992-04-15', '08012345678');
echo $result['match'];
print_r($result['data']);
// File uploads take a filesystem path
$liveness = $client->verifyLiveness('/path/to/selfie.jpg');
$face = $client->verifyFaceMatch('/path/to/selfie.jpg', '/path/to/id.jpg');Go
Any Go service · pkg.go.devgo get github.com/Adewebs/identifyorg-goclient := identifyorg.NewClient("io_live_xxxx", "")
// dateOfBirth, phoneNumber — pass "" for anything you don't have;
// phoneNumber is required on live keys
result, err := client.VerifyBVN("12345678901", "", "", "1992-04-15", "08012345678", "")
fmt.Println(result.Match, result.Data)
// File uploads take a filesystem path
liveness, err := client.VerifyLiveness("selfie.jpg", "")
faceMatch, err := client.VerifyFaceMatch("selfie.jpg", "id_photo.jpg", "")Client SDKs
Realtime calls, live streaming, and chat only — no identity verification, no billing access. Mint a token server-side with one of the SDKs above (client.streaming.token(...) / client.chat.token(...)) and hand it to whichever of these matches your client platform.
JavaScript / TypeScript
Any browser app, script tag or bundler · npmnpm install @identifyorg/js-sdkimport { IdentifyOrg } from "@identifyorg/js-sdk";
// Publishable key only (io_test_pub_.../io_live_pub_...) — this SDK
// mints its own realtime tokens from your API key, it never verifies
// identity or touches billing
const identifyorg = new IdentifyOrg({ apiKey: "io_live_pub_xxxx" });
const call = await identifyorg.joinCall({
type: "video",
identity: "user-1",
localVideoEl: document.getElementById("local"),
remoteContainerEl: document.getElementById("remote"),
});React Native
Expo, bare RN · npmnpm install @identifyorg/react-native-sdkimport { IdentifyOrgClient, useIdentifyOrgCall } from "@identifyorg/react-native-sdk";
const client = new IdentifyOrgClient({ apiKey: "io_live_pub_xxxx" });
function CallScreen() {
const { join, room, connected } = useIdentifyOrgCall(client);
useEffect(() => {
join({ type: "video", identity: "user-1" });
}, []);
// render remote/local tracks from `room` with livekit-react-native's own components
}Flutter / Dart
iOS, Android, Web · pub.devflutter pub add identifyorg_flutterfinal client = IdentifyOrg(apiKey: 'io_live_pub_xxxx');
final call = await client.joinCall(
type: IdentifyOrgSessionType.video,
identity: 'user-1',
);
// render tracks from call.room with livekit_client's own widgetsKotlin
Android · JitPack// settings.gradle.kts
maven { url = uri("https://jitpack.io") }
// build.gradle.kts
implementation("com.github.Adewebs:identifyorg-kotlin:v0.1.0")val client = IdentifyOrg(apiKey = "io_live_pub_xxxx")
val call = client.joinCall(
context = context,
type = IdentifyOrgSessionType.VIDEO,
identity = "user-1",
)
// render tracks from call.room with livekit-android's own Compose/View components