mon_sms_pro 0.2.1
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.