shernova 1.0.2
shernova: ^1.0.2 copied to clipboard
Shernova Phone Verification API — core Flutter SDK (headless).
shernova #
Headless Flutter SDK for the Shernova Phone Verification API.
Quick Start (new Flutter app) #
flutter create my_app
cd my_app
# 1. SDK + optional UI
dart pub add shernova shernova_ui
# 2. Setup CLI (generates config, reads Android app id + SHA256)
dart pub add --dev shernova_cli
dart run shernova_cli setup --pk pk_test_YOUR_KEY --app-id YOUR_APP_UUID
# 3. Register Android package + SHA256 (see below)
Register Android signature #
After setup, register the printed package name and SHA256 in the Shernova dashboard, or via API:
curl -X POST "https://api.shernova.com/v1/apps/YOUR_APP_ID/android-signatures" \
-H "Authorization: Bearer YOUR_DASHBOARD_JWT" \
-H "X-Shernova-Organization-Id: YOUR_ORG_ID" \
-H "Content-Type: application/json" \
-d '{"package_name":"com.example.my_app","sha256":"YOUR_64_CHAR_SHA256","label":"Debug"}'
Local API during development #
| Target | --api-url value |
|---|---|
| Android emulator | http://10.0.2.2:3001 |
| Windows / iOS simulator / desktop | http://localhost:3001 |
| Production | https://api.shernova.com (default) |
dart run shernova_cli setup --pk pk_test_... --app-id ... --api-url http://10.0.2.2:3001
Minimal UI integration #
lib/main.dart:
import 'package:flutter/material.dart';
import 'package:shernova/shernova.dart';
import 'package:shernova_ui/shernova_ui.dart';
import 'shernova_config.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Shernova.init(shernovaConfig);
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: const Text('Verify phone')),
body: Center(
child: Builder(
builder: (context) => FilledButton(
onPressed: () async {
await verifyPhone(
context: context,
phoneNumber: '+201012345678',
);
},
child: const Text('Verify'),
),
),
),
),
);
}
}
Headless (no UI package) #
import 'package:shernova/shernova.dart';
import 'shernova_config.dart';
await Shernova.init(shernovaConfig);
final session = await Shernova.verify(phoneNumber: '+201012345678');
await for (final update in Shernova.watch(session.sessionId)) {
if (update.status == 'verified') {
final receipt = await Shernova.getReceipt(session.sessionId);
break;
}
}
Sandbox verification #
Sandbox uses pk_test_ / sk_test_ keys. After starting a session (status waiting), complete it with Simulate Ring:
Option A — Dashboard: open the session in your app dashboard and click Simulate Ring.
Option B — API (from your backend or terminal):
curl -X POST "https://api.shernova.com/v1/test/simulate-ring" \
-H "Authorization: Bearer sk_test_YOUR_SECRET_KEY" \
-H "Content-Type: application/json" \
-d '{"session_id":"SESSION_UUID"}'
The mobile app/SDK keeps polling via Shernova.watch() until status becomes verified, then fetch the receipt JWT with Shernova.getReceipt(sessionId).
Sandbox vs Live #
| Key prefix | Environment |
|---|---|
pk_test_ |
Sandbox — use /v1/test/simulate-ring to complete sessions |
pk_live_ |
Production |
Packages #
| Package | Purpose |
|---|---|
shernova |
Core headless SDK (this package) |
shernova_ui |
Optional verification screens |
shernova_cli |
Project setup CLI |
shernova_android_helpers |
Optional Android auto-return |
Register your Android package name + SHA256 before calling Shernova.init().