Preparing your verification workspace…
NO OTP · OTP-LESS · OTP IS GONE. Login · Register · Forgot → openVerify(verifyUrl). On-device SIM / Contacts match. Themed WebView. Webhook identity.verified. No SMS codes. No QR in the primary UX.
After the user Allows access, the SDK collects lines in the background. Server matches the session phone to any reported line. Plain browsers cannot read lines (agent-style shell with Try again only).
| Stack | Path | Devices | Line sources |
|---|---|---|---|
| Java / Kotlin | android/ | Android | SIM, device info, Contacts |
| Swift | ios/ | iOS | Contacts Me, owner contacts |
| Capacitor / Ionic | packages/capacitor | Android + iOS | Native SDK per OS |
| Cordova | packages/cordova | Android + iOS | Native SDK per OS |
| Flutter | packages/flutter | Android + iOS | Native SDK per OS |
| React Native | packages/react-native | Android + iOS | Native SDK per OS |
| Expo | packages/expo | Android + iOS (Dev Client) | Same as RN · Expo Go unsupported |
Clone once, then install per stack. Full guides on GitHub.
git clone https://github.com/kreatedeviq/truzzt-sdk.git
Android — Gradle module
include ':truzzt-sdk'
project(':truzzt-sdk').projectDir = new File(settingsDir, '../truzzt-sdk/android')
// dependencies { implementation project(':truzzt-sdk') }
iOS — Swift Package Manager
.package(url: "https://github.com/kreatedeviq/truzzt-sdk.git", from: "2.0.0") // product: TruzztSdk
Capacitor
npm install ./truzzt-sdk/packages/capacitor npx cap sync
Cordova
cordova plugin add ./truzzt-sdk/packages/cordova
Flutter
# pubspec.yaml
dependencies:
truzzt_flutter:
git:
url: https://github.com/kreatedeviq/truzzt-sdk.git
path: packages/flutter
# then: flutter pub get
React Native
npm install ./truzzt-sdk/packages/react-native
Expo (Dev Client — not Expo Go)
npm install ./truzzt-sdk/packages/expo ./truzzt-sdk/packages/react-native # app.json plugins: ["@truzzt/expo"] npx expo prebuild && npx expo run:android
POST /secure-api/v1/verifications with Bearer API key, projectId, phone, countryCode, purpose (login | register | forgot_password), returnUrl, cancelUrl, optional theme.verifyUrl (pairUrl is the same URL — legacy alias).configure(apiKey, projectId[, theme]) then openVerify({ url: verifyUrl })./secure-api/identity/verify.matched: true + webhook identity.verified + redirect to returnUrl.Try the flow: agent/app demo or install the Agent APK.
Match the verify WebView to your app. Set palette in any combination of:
configure(…, theme) in the SDKtheme object on POST /secure-api/v1/verificationsverifyUrl (SDK wrappers append configured theme automatically)| Key | Use |
|---|---|
accent | Preloader / spinner |
background | Page background |
text | Primary text |
muted | Secondary text |
primary | Buttons / emphasis |
appName | Header title |
logoUrl | Logo image URL |
await Truzzt.configure({
apiKey: 'trz_live_…',
projectId: 'proj_…',
theme: {
primary: '#0B1F3A',
accent: '#FFC83D',
background: '#071525',
text: '#F7F4EE',
muted: '#94A3B8',
appName: 'My App',
logoUrl: 'https://…'
}
})
| Method | Purpose |
|---|---|
configure({ apiKey, projectId, baseUrl?, theme? }) | Required; validates plan via /sdk/access |
requestPermissions() | Phone + Contacts (Android); Contacts (iOS) |
getSimPhones() | Collected lines (debug / pre-check) |
openVerify({ url, theme? }) | Themed WebView → match → result object |
{
"matched": true,
"status": "completed",
"matchedSlot": "sim1",
"matchedSource": "sim_chip",
"sessionId": "sess_…",
"platform": "android" | "ios"
}
Treat the webhook identity.verified as the source of truth for your backend.
Android: sim_chip, device_info_api, sim_settings, contacts_saved:…, optional dialer_star06.
iOS: contacts_me, settings_phone_my_number, settings_cellular_sim1/sim2, contacts_saved:… — no SIM chip MSISDN.
Android: INTERNET, network state, phone state/numbers, contacts — to match the account phone on-device (OTP-less). Not used: Camera, Call Phone, SMS.
iOS: Contacts only (NSContactsUsageDescription) — My Card / “My number” / “رقمي”. Apple blocks SIM MSISDN.
Play — Phone: Confirm SIM/line owns the account number during verify. No calls/SMS/ads.
Play — Contacts: Owner-labelled numbers only when SIM hides MSISDN. Not a contacts sync.
Copy sheet: docs/PERMISSIONS.md
TruzztSdk.configure(apiKey, projectId, null, themeJson); TruzztSdk.requestPermissions(this); startActivityForResult(TruzztSdk.verifyIntent(this, verifyUrl), 9101);
TruzztSdk.configure(apiKey: key, projectId: proj, theme: theme)
TruzztSdk.openVerify(from: self, sessionUrl: verifyUrl) { result in … }
import Truzzt from '@truzzt/capacitor'
await Truzzt.configure({ apiKey, projectId, theme })
await Truzzt.openVerify({ url: verifyUrl })
Truzzt.configure({ apiKey, projectId, theme }, ok, err)
Truzzt.openVerify({ url: verifyUrl }, ok, err)
await TruzztFlutter.configure(apiKey: k, projectId: p, theme: {...});
final r = await TruzztFlutter.openVerify(verifyUrl);
import { configure, openVerify } from '@truzzt/react-native'
await configure({ apiKey, projectId, theme })
const r = await openVerify({ url: verifyUrl })
EXPO.md · Expo Go not supported
// app.json plugins: ["@truzzt/expo"]
import { configure, openVerify } from '@truzzt/expo'
await configure({ apiKey, projectId, theme })
const r = await openVerify({ url: verifyUrl })
| Symptom | Fix |
|---|---|
SDK_REQUIRED / browser verify | Use openVerify in SDK or Agent — not Chrome alone |
| Permission denied | requestPermissions; user must Allow |
| Empty lines (iOS) | Contacts Me or "My number" / "رقمي" contact |
| Expo Go | Use prebuild + Dev Client + native link |
PLAN_REQUIRED | Subscribe after free year |
git clone https://github.com/kreatedeviq/truzzt-sdk.git cd truzzt-sdk # docs: ANDROID · IOS · CAPACITOR · CORDOVA · FLUTTER · REACT_NATIVE · EXPO