Notik Offerwall SDK for Flutter

A fully native Flutter SDK for integrating the Notik Offerwall into your app. Users complete offers (installs, surveys, games, tasks) and earn rewards.

Unlike wrapper SDKs that embed a black-box native view, this SDK provides a fully customizable Flutter UI with native platform channels for deep hardware info collection.

Features

  • Native offerwall UI with search, category filter, sort, and infinite scroll
  • Offer detail screen with multi-step missions and platform tags
  • WebView-based offer redemption flow
  • Postback/conversion tracking with polling and listener callbacks
  • token authentication and GAID/IDFA
  • standard device id, and adv id for user fraud control
  • Full theming support (light, dark, custom)
  • Auto token refresh and 401 retry
  • hasOffers() pre-check for conditional UI display
  • Server-side rate limiting per device and per IP

Installation

Add to your pubspec.yaml:

dependencies:
  notik_offerwall: ^1.1.0

Then run:

flutter pub get

Android

Minimum SDK 21. Add internet permission (usually already present):

<uses-permission android:name="android.permission.INTERNET"/>

iOS

Minimum iOS 13.0. Add to your Info.plist for ad tracking (IDFA):

<key>NSUserTrackingUsageDescription</key>
<string>This identifier will be used to show you relevant offers.</string>

Quick Start

import 'package:notik_offerwall/notik_offerwall.dart';

// Initialize and show on button tap (lazy init)
onTap: () async {
  if (!NotikOfferwall.isInitialized) {
    try {
      await NotikOfferwall.init(NotikConfig(
        apiKey: 'your_api_key',
        pubId: 'your_pub_id',
        appId: 'your_app_id',
        userId: 'user_123',
        baseUrl: 'https://notik.me',
      ));
    } on NotikInitException catch (e) {
      print('Init failed: ${e.message}');
      return;
    }
  }
  NotikOfferwall.show(context);
}

How It Works

Init Flow (4 steps, happens once)

NotikOfferwall.init(config)
    |
    1. Collect device info (Flutter plugins + native hardware)
    |   - 40+ fields: for fraud control
    |   - Generates SHA-256 device fingerprint from stable hardware properties
    |
    2. POST /api/sdk/verify
    |   - Sends: api_key, pub_id, app_id, device_fingerprint
    |   - Backend validates publisher + app credentials
    |   - Returns: token (30 min)
    |
    3. POST /api/sdk/device
    |   - Sends: unique device info
    |   - Backend stores device record for future offer requests
    |
    4. SDK ready

Offer Fetch Flow (lightweight, every request)

GET /api/sdk/offers?sort=star&category=cpe
    Headers:
      Authorization: Bearer <token>
      X-Device-Fingerprint: <sha256>
      X-Device-Ad-Id: <gaid or idfa>

    Backend:
      1. Validates token + fingerprint + IP + ad ID
      2. Resolves device/publisher from stored device record
      3. Returns offers (same logic as web offerwall)

Security (every request validated by backend)

Check What
Bearer token token, not expired
Fingerprint Header matches token's stored fingerprint
IP binding Request IP matches IP when token was issued
Ad ID GAID/IDFA matches registered device
Rate limit
Auto-kill

Theming

NotikOfferwall.init(NotikConfig(
  // ...credentials...
  theme: NotikTheme(
    primaryColor: Colors.deepPurple,
    backgroundColor: Colors.white,
    onSurfaceColor: Colors.black87,
    buttonTextColor: Colors.white,
    appBarTitle: 'Earn Rewards',
    useDarkTheme: false,
  ),
));

Or use presets:

theme: NotikTheme.dark(),
theme: NotikTheme.light(),

Full API

Method Description
NotikOfferwall.init(config) Initialize SDK, verify credentials, register device, get auth token
NotikOfferwall.show(context) Open offerwall full-screen
NotikOfferwall.showAsBottomSheet(context) Open offerwall as bottom sheet
NotikOfferwall.showRewardHistory(context) Open reward history screen
NotikOfferwall.hasOffers() Check if offers exist for this user
NotikOfferwall.onPostback(callback) Register postback listener
NotikOfferwall.startPostbackPolling() Start auto-polling for conversions
NotikOfferwall.stopPostbackPolling() Stop polling
NotikOfferwall.checkPostbacks() Manual postback check
NotikOfferwall.isInitialized Whether SDK is ready
NotikOfferwall.dispose() Clean up resources

Backend Endpoints Required

Endpoint Method Auth Purpose
/api/sdk/verify POST None Validate credentials, issue token
/api/sdk/device POST Bearer + fingerprint Register device hardware
/api/sdk/offers GET Bearer + fingerprint + ad ID Fetch offers

Requirements

  • Flutter >= 3.16.0
  • Dart >= 3.2.0
  • Android minSdk 21+
  • iOS 13.0+
  • A Notik publisher account (notik.me)

License

MIT

Libraries

notik_offerwall