mon_sms_pro 0.2.1 copy "mon_sms_pro: ^0.2.1" to clipboard
mon_sms_pro: ^0.2.1 copied to clipboard

Send SMS using the monsms.pro API

Mon SMS PRO - Flutter/Dart SDK #

A comprehensive Flutter/Dart SDK for integrating with the Mon SMS PRO platform. Send bulk SMS, manage campaigns, contacts, and leverage gamification features.

Table of Contents #

Installation #

Add to your pubspec.yaml:

dependencies:
  mon_sms_pro: ^0.2.1

Then run:

flutter pub get

Quick Start #

import 'package:mon_sms_pro/mon_sms_pro.dart';

// Initialize the SDK with your API key
final monSmsPro = MonSMSPRO(apiKey: 'YOUR_API_KEY');

// Initialize Hive adapters (required for local storage)
await initHiveAdapters();

// Send an OTP
final otpResponse = await monSmsPro.otp.get(
  phoneNumber: '+2250700000000',
  length: 6,
  mode: 'NUMERIC',
);

// Get user details
final userResponse = await monSmsPro.user.details();

// Create a campaign
final campaignResponse = await monSmsPro.campaign.create(
  text: 'Hello from Mon SMS PRO!',
  senderId: 'your-sender-id',
  contacts: [ContactModel(phone: '+2250700000000')],
);

API Reference #

OTP API #

Authentication via One-Time Password.

final otpApi = monSmsPro.otp;

get() - Request OTP

Sends an OTP to a phone number.

final response = await otpApi.get(
  phoneNumber: '+2250700000000',  // Required
  senderId: 'MySender',           // Optional: Custom sender ID
  length: 6,                      // Optional: OTP length (default: 4)
  mode: 'NUMERIC',                // Optional: NUMERIC, ALPHABET, ALPHA_NUMERIC
  appName: 'MyApp',               // Optional: App name for SMS template
);

// Response
OTPModel(
  id: '...',
  token: 'verification-token',
  phoneNumber: '+2250700000000',
  status: OTPStatus.pending,
  mode: OTPMode.numeric,
)

verify() - Verify OTP

Verifies an OTP code.

final response = await otpApi.verify(
  token: 'verification-token',    // Required: Token from get()
  otp: '123456',                  // Required: OTP code entered by user
  phoneNumber: '+2250700000000',  // Optional
);

// Response
OTPModel(
  status: OTPStatus.verified,  // PENDING, VERIFIED, DEMO
)

User API #

User registration and management.

final userApi = monSmsPro.user;

create() - Register New User

final response = await userApi.create(
  emailAddress: 'user@example.com',   // Required
  phoneNumber: '+2250700000000',      // Required
  fullName: 'John Doe',               // Required
  otpToken: 'verification-token',     // Required: From OTP verification
  verificationId: 'verify-id',        // Required
  codePromo: 'PROMO2024',             // Optional: Promo code
);

// Response: UserModel

details() - Get Current User

final response = await userApi.details();

// Response
UserModel(
  id: '...',
  fullName: 'John Doe',
  emailAddress: 'user@example.com',
  phoneNumber: '+2250700000000',
  apiKey: '...',
  availableCredit: 100,
  isVerified: true,
  // ...
)

credit() - Get Available Credit

final response = await userApi.credit();

// Response: int (available SMS credits)

get() - Get User by Phone

final response = await userApi.get(
  phoneNumber: '+2250700000000',
  otpToken: 'verification-token',
);

updateLogo() - Update Profile Picture

final response = await userApi.updateLogo(
  logo: 'base64-encoded-image-or-url',
);

Campaign API #

SMS campaign management.

final campaignApi = monSmsPro.campaign;

list() - List Campaigns

final response = await campaignApi.list(
  senderId: 'sender-id',  // Required
);

// Response: List<CampaignModel>

get() - Get Campaign Details

final response = await campaignApi.get(
  id: 'campaign-id',
);

// Response: CampaignDetailsModel with contacts, groups, sender

create() - Create Campaign

final response = await campaignApi.create(
  text: 'Your SMS message here',           // Required
  senderId: 'sender-id',                   // Required
  name: 'Campaign Name',                   // Optional
  contacts: [                              // Optional
    ContactModel(phone: '+2250700000000'),
    ContactModel(phone: '+2250700000001'),
  ],
  groupsIds: ['group-id-1', 'group-id-2'], // Optional
  type: SMSType.sms,                       // Optional: SMS, FLASH, SCHEDULED, RECURRING
  scheduledDate: DateTime.now().add(Duration(hours: 1)),  // Optional
  recurring: CampaignRecurringDayModel(    // Optional: For recurring campaigns
    enabled: true,
    monday: DateTime.parse('2024-01-01 09:00:00'),
    // ...
  ),
);

update() - Update Campaign

final response = await campaignApi.update(
  id: 'campaign-id',
  scheduledDate: DateTime.now().add(Duration(days: 1)),
  recurring: CampaignRecurringDayModel(...),
);

toggleEnable() - Enable/Disable Campaign

final response = await campaignApi.toggleEnable(
  id: 'campaign-id',
);

Contact API #

Contact management.

final contactApi = monSmsPro.contact;

list() - List Contacts

final response = await contactApi.list(
  count: 20,          // Optional: Items per page
  page: 1,            // Optional: Page number
  sort: SortList.desc, // Optional: asc or desc
  orderBy: 'createdAt', // Optional
);

// Response: List<ContactModel>

create() - Create Contacts

final response = await contactApi.create(
  contacts: [
    ContactModel(
      phone: '+2250700000000',
      name: 'John Doe',
      firstName: 'John',
      lastName: 'Doe',
      sex: SexType.m,
    ),
    ContactModel(phone: '+2250700000001', name: 'Jane Doe'),
  ],
);

get() - Get Contact

final response = await contactApi.get(id: 'contact-id');

update() - Update Contact

final response = await contactApi.update(
  id: 'contact-id',
  phone: '+2250700000000',
  name: 'Updated Name',
  firstName: 'John',
  lastName: 'Doe',
  sex: SexType.m,
);

delete() - Delete Contacts

final response = await contactApi.delete(
  contactIds: ['contact-id-1', 'contact-id-2'],
);

Group API #

Contact group management.

final groupApi = monSmsPro.group;

list() - List Groups

final response = await groupApi.list(
  count: 20,
  page: 1,
  sort: SortList.desc,
  orderBy: 'createdAt',
);

// Response: List<GroupModel>

create() - Create Group

final response = await groupApi.create(
  name: 'VIP Customers',
  contacts: [
    ContactModel(phone: '+2250700000000', name: 'John'),
    ContactModel(phone: '+2250700000001', name: 'Jane'),
  ],
);

get() - Get Group

final response = await groupApi.get(id: 'group-id');

update() - Update Group

final response = await groupApi.update(
  id: 'group-id',
  name: 'Updated Group Name',
  contacts: [...],
);

delete() - Delete Group

final response = await groupApi.delete(id: 'group-id');

Sender API #

Sender ID management.

final senderApi = monSmsPro.sender;

list() - List Senders

final response = await senderApi.list(
  count: 20,
  page: 1,
);

// Response: List<SenderModel>

create() - Create Sender

final response = await senderApi.create(
  name: 'MySender',           // Required: Max 11 characters
  description: 'My business', // Required
);

// Note: Sender requires approval before use
// Status: PENDING -> SUBMITED -> ACCEPTED/REFUSED

get() - Get Sender

final response = await senderApi.get(id: 'sender-id');

update() - Archive/Restore Sender

final response = await senderApi.update(
  id: 'sender-id',
  archived: true,  // Archive the sender
);

Transaction API #

Payment and transaction management.

final transactionApi = monSmsPro.transaction;

list() - List Transactions

final response = await transactionApi.list(
  count: 20,
  page: 1,
  companyId: 'company-id',  // Optional
);

// Response: List<TransactionModel>

create() - Create Transaction

final response = await transactionApi.create(
  offerId: 'offer-id',
  paymentMethod: PaymentMethod.omCi,  // OM_CI, MTN_CI, MOOV_CI, WAVE_CI, etc.
  companyId: 'company-id',            // Optional
);

check() - Check Transaction Status

final response = await transactionApi.check(id: 'transaction-id');

// Response
TransactionModel(
  status: TransactionStatus.charged,  // PENDING, FAILED, CHARGED
  credit: 100,
  price: 5000,
)

update() - Update Transaction

final response = await transactionApi.update(
  id: 'transaction-id',
  status: TransactionStatus.charged,
);

Offer API #

Credit offers/packages.

final offerApi = monSmsPro.offer;

list() - List Offers

final response = await offerApi.list();

// Response: List<OfferModel>
// Offers: STARTER, BRONZE, FER, OR, DIAMANT, VIP

get() - Get Offer

final response = await offerApi.get(id: 'offer-id');

// Response
OfferModel(
  id: '...',
  name: OfferName.bronze,
  price: 5000,    // Price in XOF
  credit: 100,    // SMS credits
)

Device API #

Device registration and management.

final deviceApi = monSmsPro.device;

get() - Get Device

final response = await deviceApi.get(
  deviceId: 'unique-device-id',
);

register() - Register Device

final response = await deviceApi.register(
  deviceId: 'unique-device-id',
  type: DeviceType.android,           // ANDROID, IOS, WEB
  notificationToken: 'fcm-token',     // Optional: For push notifications
  companyId: 'company-id',            // Optional
);

updateToken() - Update Notification Token

final response = await deviceApi.updateToken(
  deviceId: 'unique-device-id',
  notificationToken: 'new-fcm-token',
);

delete() - Delete Device

final response = await deviceApi.delete(id: 'device-id');

Company API #

Company/business management.

final companyApi = monSmsPro.company;

list() - List User's Companies

final response = await companyApi.list();

// Response: List<CompanyModel>

listTypes() - List Company Types

final response = await companyApi.listTypes();

// Response: List<CompanyTypeModel>

get() - Get Company

final response = await companyApi.get(id: 'company-id');

// Response
CompanyModel(
  id: '...',
  name: 'My Business',
  verificationStatus: CompanyVerificationStatus.approved,
)

create() - Create Company

final response = await companyApi.create(
  name: 'My Business',
  companyTypeId: 'type-id',
  description: 'Business description',  // Optional
  logo: 'base64-or-url',                // Optional
  address: '123 Main St',               // Optional
  city: 'Abidjan',                      // Optional
);

update() - Update Company

final response = await companyApi.update(
  id: 'company-id',
  name: 'Updated Name',
  description: 'New description',
);

AI API #

AI-powered message optimization and URL shortening.

final aiApi = monSmsPro.ai;

shortenUrl() - Shorten URLs in Message

final response = await aiApi.shortenUrl(
  message: 'Check out https://example.com/very/long/url',
);

// Response
AIUrlResponse(
  original: 'Check out https://example.com/very/long/url',
  processed: 'Check out https://short.url/abc',
)

optimizeMessage() - AI Message Optimization

Uses AI to optimize SMS messages for length and clarity.

final response = await aiApi.optimizeMessage(
  message: 'Your long message here...',
  language: 'fr',           // Target language
  abbreviation: true,       // Optional: Use abbreviations
  latinize: true,           // Optional: Remove accents
);

// Response: String (optimized message)

processMessage() - Process Message (Legacy)

final response = await aiApi.processMessage(
  message: 'Message with URLs',
);

Challenges API #

Gamification challenges system.

final challengesApi = monSmsPro.challenges;

list() - List Challenges

final response = await challengesApi.list(
  companyId: 'company-id',
  type: ChallengeType.weekly,     // Optional: WEEKLY, MONTHLY, SPECIAL
  status: ChallengeStatus.active, // Optional: UPCOMING, ACTIVE, ENDED
);

// Response: List<ChallengeModel>

get() - Get Challenge Details

final response = await challengesApi.get(
  id: 'challenge-id',
  companyId: 'company-id',
);

// Response
ChallengeModel(
  id: '...',
  name: 'Weekly Challenge',
  type: ChallengeType.weekly,
  status: ChallengeStatus.active,
  startDate: DateTime(...),
  endDate: DateTime(...),
  tasks: [...],
  communityRewards: [...],
  isJoined: true,
  userXp: 500,
  userRank: 3,
)

join() - Join Challenge

final response = await challengesApi.join(
  id: 'challenge-id',
  companyId: 'company-id',
);

leave() - Leave Challenge

final response = await challengesApi.leave(
  id: 'challenge-id',
  companyId: 'company-id',
);

leaderboard() - Get Leaderboard

final response = await challengesApi.leaderboard(
  id: 'challenge-id',
  companyId: 'company-id',
);

// Response: List<ChallengeLeaderboardEntryModel>

claimTask() - Claim Task Reward

final response = await challengesApi.claimTask(
  id: 'challenge-id',
  taskKey: 'send_100_sms',
  companyId: 'company-id',
);

claimReward() - Claim Community Reward

final response = await challengesApi.claimReward(
  id: 'challenge-id',
  rewardIndex: 0,
  companyId: 'company-id',
);

Daily Tasks API #

Daily gamification tasks.

final dailyTasksApi = monSmsPro.dailyTasks;

list() - List Today's Tasks

final response = await dailyTasksApi.list(
  companyId: 'company-id',
);

// Response: List<DailyTaskModel>
// Task types: SMS_SENT, SMS_DELIVERED, CONTACTS_ADDED, etc.

claim() - Claim Task Reward

final response = await dailyTasksApi.claim(
  taskKey: 'send_10_sms',
  companyId: 'company-id',
);

// Response: int (XP claimed)

getProfile() - Get Game Profile

final response = await dailyTasksApi.getProfile(
  companyId: 'company-id',
);

// Response
GameProfileModel(
  totalXp: 1500,
  level: 5,
  currentLevelXp: 300,
  xpToNextLevel: 500,
  streak: 7,
)

claimBonus() - Claim All-Tasks Bonus

final response = await dailyTasksApi.claimBonus(
  companyId: 'company-id',
);

// Response: int (bonus XP)

Follower API #

Le Rezo subscription/follower management.

final followerApi = monSmsPro.follower;

get() - Get Follower

final response = await followerApi.get(id: 'follower-id');

getByPhone() - Get Follower by Phone

final response = await followerApi.getByPhone(
  phoneNumber: '+2250700000000',
);

update() - Update Follower

final response = await followerApi.update(
  id: 'follower-id',
  name: 'New Name',
);

updateLogo() - Update Follower Photo

final response = await followerApi.updateLogo(
  id: 'follower-id',
  logo: 'base64-or-url',
);

following() - List Followed Companies

final response = await followerApi.following(
  id: 'follower-id',
);

// Response: List<CompanyFollowedModel>

subscribe() - Subscribe to Company

final response = await followerApi.subscribe(
  id: 'follower-id',
  companyId: 'company-id',
);

unsubscribe() - Unsubscribe from Company

final response = await followerApi.unsubscribe(
  id: 'follower-id',
  companyId: 'company-id',
);

getCompanyCampaigns() - Get Company's Campaigns

final response = await followerApi.getCompanyCampaigns(
  id: 'follower-id',
  companyId: 'company-id',
);

Models #

Core Models #

Model Description
UserModel User profile with credits, verification status
OTPModel OTP token with status and mode
OfferModel Credit package with price and credits
VersionModel App version information

Campaign Models #

Model Description
CampaignModel SMS campaign with stats
CampaignDetailsModel Full campaign with contacts, groups, sender
CampaignCountModel Contact and group counts
CampaignRecurringDayModel Recurring schedule configuration

Contact & Group Models #

Model Description
ContactModel Contact with phone, name, sex
GroupModel Contact group with members
GroupCountModel Contact count in group

Company Models #

Model Description
CompanyModel Business/company profile
CompanyTypeModel Company category type
VerifyIdModel KYC verification record

Transaction Models #

Model Description
TransactionModel Payment transaction
SenderModel Sender ID with approval status
DeviceModel Registered device

Gamification Models #

Model Description
ChallengeModel Challenge with tasks and rewards
ChallengeTaskModel Individual challenge task
ChallengeRewardModel Community reward
ChallengeLeaderboardEntryModel Leaderboard entry
DailyTaskModel Daily task with progress
GameProfileModel User XP, level, streak

Le Rezo Models #

Model Description
FollowerModel Subscriber/follower profile
CompanyFollowedModel Company subscription

Enums #

SMS & Campaign Types #

enum SMSType { sms, flash, scheduled, recurring }
enum SmsType { promotional, transactional, otp }  // For sender types

Status Enums #

enum OTPStatus { pending, verified, demo }
enum OTPMode { numeric, alphabet, alphaNumeric }
enum SenderStatus { pending, submited, accepted, refused }
enum TransactionStatus { pending, failed, charged }
enum TransactionType { debited, recharged }
enum VerifyIdStatus { pending, verified, approved, refused }
enum CompanyVerificationStatus { pending, approved, refused }

Gamification Enums #

enum ChallengeType { weekly, monthly, special }
enum ChallengeStatus { upcoming, active, ended }
enum DailyTaskCriteriaType {
  smsSent, smsDelivered, contactsAdded,
  campaignsCreated, groupsCreated, appOpened, creditPurchased
}

Other Enums #

enum PaymentMethod { omCi, mtnCi, moovCi, waveCi, cash, iap, builtIn, otp }
enum DeviceType { android, ios, web }
enum OfferName { starter, bronze, fer, or, diamant, vip }
enum SexType { m, f }
enum Country { ci }
enum TransactionPeriod { year, month, week, day, none }

Hive Database Management #

This SDK uses Hive for local data caching.

Initialize Hive #

import 'package:mon_sms_pro/mon_sms_pro.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await initHiveAdapters();
  runApp(MyApp());
}

Quick Commands #

# Update Hive registrars and build adapters
make hive-full

# Watch for changes
make hive-watch

# Clean build cache
make hive-clean

Regenerate Adapters #

dart run build_runner build --delete-conflicting-outputs

Error Handling #

All API methods return ApiResponseModel<T>:

final response = await monSmsPro.user.details();

if (response.success) {
  final user = response.data;
  print('User: ${user?.fullName}');
} else {
  print('Error: ${response.error}');
}

API Key #

Get your API key from the Mon SMS PRO app in Settings.


Documentation #

Visit docs.monsms.pro for more information.


Support #

For issues and feature requests, visit our GitHub repository.


License #

MIT License - see LICENSE file for details.

1
likes
145
points
158
downloads

Publisher

verified publisherfreddydro.dev

Weekly Downloads

Send SMS using the monsms.pro API

Repository (GitHub)
View/report issues

Documentation

API reference

License

MIT (license)

Dependencies

dio, flutter, hive_ce, hive_ce_flutter

More

Packages that depend on mon_sms_pro