arkadia_sdk
SDK officiel de l'API Arkadia pour Flutter : envoyez l'activité et les ventes de votre application, lisez votre quota et vos statistiques.
- File d'attente hors ligne, renvois automatiques sans doublon (clé d'idempotence)
- Envoi automatique quand l'app passe en arrière-plan
- Android, iOS, web, desktop
Installation
flutter pub add arkadia_sdk
Démarrage
import 'package:arkadia_sdk/arkadia_sdk.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await ArkadiaClient.init(
apiKey: 'ark_live_…', // onglet « API » de votre espace Arkadia
appCode: 'APP-XXXX-XXXX',
platform: defaultTargetPlatform.name,
appVersion: '2.3.0',
debug: kDebugMode,
);
runApp(const MyApp());
}
ArkadiaClient.screenView('dashboard', previousScreen: 'login');
ArkadiaClient.sessionStart(userId: hashedUserId);
ArkadiaClient.sessionEnd(342);
ArkadiaClient.featureUsed('export_pdf', metadata: {'format': 'a4'});
ArkadiaClient.crash('StateError', e.toString(), stackTrace: st.toString());
// Ventes — montants en centimes (9 900 XOF = 990000)
ArkadiaClient.subscriptionStarted('pro', 990000, 'monthly', userId: hashedUserId);
ArkadiaClient.purchaseCompleted('module-crm', 'Module CRM', 250000);
ArkadiaClient.trialStarted('pro', 14);
// Event générique
ArkadiaClient.track('app.onboarding_completed', properties: {'durationSeconds': 120});
Les events partent toutes les 30 secondes, dès qu'un lot est plein, quand l'app passe en arrière-plan, ou avec await ArkadiaClient.flush(). Les crashs partent immédiatement. Pour userId, envoyez un identifiant anonymisé.
Les raccourcis de vente (subscriptionStarted, purchaseCompleted…) sont de la télémétrie : ils alimentent vos statistiques mais ne sont pas des ventes. Une vente réelle passe par ArkadiaClient.licenses.checkout().
Licences
Arkadia vend vos licences (paiement GeniusPay), émet les clés et les contrôle. Toute app éditée par Arkadia doit vérifier sa licence au démarrage.
final licence = await ArkadiaClient.licenses.validate();
if (!licence.valid) showPaywall(licence.status); // none, expired, revoked, offline_expired…
validate() interroge Arkadia au plus une fois par heure (force: true pour forcer). Hors ligne, il vérifie le dernier jeton signé par Arkadia (7 jours au plus, jamais au-delà de la période de grâce).
// Achat
final offres = await ArkadiaClient.licenses.products();
final vente = await ArkadiaClient.licenses.checkout(
productId: offres.first['productId'] as String,
buyer: {'name': 'Awa Koné', 'email': 'awa@exemple.ci', 'phone': '+2250700000000'},
successUrl: 'https://mon-app.ci/paiement/ok',
errorUrl: 'https://mon-app.ci/paiement/erreur',
);
await launchUrl(Uri.parse(vente['checkoutUrl'] as String)); // page GeniusPay
// Au retour dans l'app :
final result = await ArkadiaClient.licenses.completeCheckout();
if (result.license?.valid ?? false) unlockApp();
// Clé saisie par l'utilisateur, essai, renouvellement
await ArkadiaClient.licenses.activate(cleSaisie);
await ArkadiaClient.licenses.startTrial(productId: 'APP-…-essai', email: email);
await ArkadiaClient.licenses.renew(buyer: acheteur, successUrl: ok, errorUrl: ko);
Les erreurs de l'API (device_limit_reached, license_not_found, trial_already_used…) sont levées en ArkadiaApiException.
Quota et statistiques
final status = await ArkadiaClient.status();
final quota = status['quota'] as Map<String, dynamic>;
print('${quota['used_this_month']} / ${quota['limit']} events ce mois');
final stats = await ArkadiaClient.analytics(
from: DateTime.utc(2026, 9, 1),
to: DateTime.utc(2026, 9, 30),
);
Ces méthodes lèvent une ArkadiaApiException (statusCode, code, message) en cas d'erreur.
Webhooks
Les webhooks se vérifient côté serveur. En Node.js, utilisez @arkadiadev/sdk/webhooks ; dans un autre langage, calculez HMAC-SHA256(secret, "<t>.<corps brut>") en hexadécimal et comparez-le à la valeur v1 de l'en-tête X-Arkadia-Signature: t=<t>,v1=<signature> (en refusant un t vieux de plus de 5 minutes).
Limites
| Clé live | Clé test | |
|---|---|---|
| Events par requête | 50 | 20 |
| Events par minute | 300 | 60 |
Lectures (status, analytics) par minute |
60 | 30 |
Le SDK respecte automatiquement ces limites et l'en-tête Retry-After.
Libraries
- arkadia_sdk
- SDK officiel de l'API Arkadia pour Flutter.