Kimisms SMS Documentation
Complete guide to sending SMS via the portal and API, managing contacts, billing, and tracking delivery.
Overview
Kimisms is a corporate bulk SMS platform that enables businesses to send promotional and transactional SMS messages across Kenyan mobile networks — Safaricom, Airtel, and Telkom.
There are three ways to send SMS through Kimisms:
Quick Send
Send a single SMS to one phone number directly from the portal.
Bulk Campaign
Send messages to entire contact groups at once via the portal.
REST API
Integrate SMS into your applications with our developer API.
Message flow
SMS unit calculation
Messages are charged in units based on character length:
| Characters | SMS Units | Example |
|---|---|---|
| 1 – 160 | 1 unit | Short alert or OTP |
| 161 – 320 | 2 units | Marketing promo |
| 321 – 480 | 3 units | Detailed notification |
| 481 – 640 | 4 units | Long-form update |
| 641 – 800 | 5 units | Multi-part message |
| 801 – 960 | 6 units | Extended content |
Account Setup
Before you can send SMS, you need to create an account and get set up on the platform.
1 Register your account
Visit the registration page and sign up with your business email address.
2 Verify your email
Check your inbox for an activation email and click the verification link. You cannot log in until your email is verified.
3 Apply for a Sender ID
Navigate to Sender ID → Applications in the portal. Submit an application with your business name and the required KYC documents.
4 Top up your balance
Go to Billing → Topups to add SMS credit. Choose a package and pay via M-Pesa or request an offline top-up.
5 Start sending
Once your Sender ID is approved and you have balance, you're ready to send SMS via Quick Send, Bulk Campaign, or the API.
Sender IDs
A Sender ID is the name or short code that appears as the sender when a recipient receives your SMS. Each Sender ID is tied to a specific network provider.
Types
| Type | Description | Example |
|---|---|---|
Sender ID | Alphanumeric name (up to 12 characters) | KIMISMS, MYBRAND |
Short Code | Numeric short code for two-way messaging | 20880, 40100 |
Campaign types
| Type | Use Case |
|---|---|
PROMOTIONAL | Marketing campaigns, offers, product launches |
TRANSACTIONAL | OTPs, payment confirmations, alerts, notifications |
Application process
- Go to Sender ID → Applications and click Add Application
- Fill in: organization name, provider (Safaricom/Airtel/Telkom), proposed sender name, campaign type, and purpose
- Upload required KYC documents (business registration, letter of authorization)
- Your application goes through review: PENDING → PROVIDER → APPROVED
- Once approved, the Sender ID is created and linked to your account
Quick Send
Quick Send lets you send a single SMS to one phone number directly from the portal. Ideal for testing, one-off alerts, or individual notifications.
How to send
1 Navigate to Sending → Quick Send
Open the Quick Send page from the sidebar.
2 Select a Sender ID
Choose the Sender ID to send from. The dropdown shows each sender's name, provider, and available float balance.
3 Enter the recipient number
Type the phone number in international format. The number must match the provider of your selected Sender ID.
4 Compose your message
Type your message (maximum 960 characters). The character count and SMS unit cost are displayed in real time.
5 Send
Click Send Message. The system deducts the SMS units from your float balance and queues the message for delivery.
Required fields
| Field | Description | Validation |
|---|---|---|
sender_id | The approved Sender ID to send from | Must have sufficient float balance |
number | Recipient phone number | 9-13 digits, must match sender provider |
message | SMS body text | Max 960 characters |
Bulk Campaign
Bulk campaigns let you send the same message to hundreds or thousands of contacts at once. Messages are processed asynchronously in the background.
How to send a bulk campaign
1 Prepare your contacts
Create a contact group and upload your recipient list (or add contacts manually).
2 Navigate to Sending → Bulk Blast
Open the Bulk Send page from the sidebar.
3 Select Sender IDs
Select one or more Sender IDs. The system automatically matches each contact to the right Sender ID based on their network provider.
4 Select contact groups
Choose one or more contact groups to send to. You can optionally check Remove Duplicates to avoid sending to the same number twice.
5 Compose or select a template
You have two options:
- Compose Message — Type your message directly (max 960 characters)
- Use Template — Select a pre-built message template with dynamic field replacement
6 Send campaign
Click Send. The campaign is created as a Blast record and messages are processed asynchronously. Each contact's SMS units are deducted from the matching Sender ID's float balance.
How provider matching works
When you send a bulk campaign, each contact is automatically routed to the correct provider:
- The system reads the contact's phone number prefix
- It looks up the provider (Safaricom, Airtel, or Telkom) from the prefix table
- It finds a matching Sender ID from your selected list for that provider
- If no matching Sender ID is found, that contact is skipped with a FAILED status
Template Messages
Templates let you send personalized messages to each contact by inserting dynamic fields from your contact data.
How it works
When you upload contacts via CSV, additional columns beyond "number" are mapped to field1 through field6. You can reference these fields in your message template.
Example
If your CSV has columns: number, name, amount
number→ contact phone numbername→ mapped tofield1amount→ mapped tofield2
Your template message:
Each contact will receive a personalized message with their actual name and amount values inserted.
Creating templates
- Go to Contacts → Templates
- Click Add Template and select the contact group
- Compose your message using
{field_name}placeholders - Save the template — it's now available when sending bulk campaigns
Contact Groups
Contact groups organize your recipients into segmented lists for targeted messaging.
Creating a group
- Go to Contacts → Contact Groups
- Click Upload Group
- Enter a group name and description
- Upload a CSV file with your contacts
- The system processes the file in the background and assigns providers automatically based on phone number prefixes
Adding individual contacts
Within a group, click Add Contact to add a single contact manually. Enter the phone number and any custom field values.
CSV Upload Format
Upload contacts in bulk using a CSV file. The system supports up to 7 columns.
CSV requirements
| Column | Mapping | Required |
|---|---|---|
number | Phone number (first column, must be named "number") | Yes |
| Column 2 | Mapped to field1 | No |
| Column 3 | Mapped to field2 | No |
| Column 4 | Mapped to field3 | No |
| Column 5 | Mapped to field4 | No |
| Column 6 | Mapped to field5 | No |
| Column 7 | Mapped to field6 | No |
Example CSV
254XXXXXXXXX (12 digits), 0XXXXXXXXX (10 digits), or 7XXXXXXXX (9 digits). The system will detect the provider automatically from the prefix.
Duplicate handling
During upload, you can check Remove Duplicates to automatically remove contacts with duplicate phone numbers. During bulk send, you can also enable deduplication to avoid sending multiple messages to the same number across groups.
Message Templates
Templates are reusable message blueprints tied to specific contact groups. They use field placeholders to personalize messages for each recipient.
Placeholder syntax
Use curly braces with the CSV column header name:
The column names from your CSV become the placeholder keys. The system maps them to field1–field6 internally, but you reference them by their original CSV header name.
Top-up Balance
To send SMS, you need sufficient float balance on your Sender IDs. Top up by purchasing SMS packages.
Top-up process
1 Go to Billing → Topups
Click Add Topup to start.
2 Select Sender ID
Choose which Sender ID you want to add balance to. Available packages will load based on the provider.
3 Choose a package
Select an SMS package. Each package has a rate (price per SMS unit) and you specify how many units to purchase.
4 Choose payment method
Select M-Pesa for instant mobile payment, or Offline for manual bank transfer (admin approval required).
5 Complete payment
For M-Pesa, enter your phone number and confirm the STK push on your phone. Balance is credited instantly once payment is confirmed.
M-Pesa Payment
Kimisms integrates with Safaricom's M-Pesa Lipa Na M-Pesa (STK Push) for instant balance top-ups.
How it works
- Select M-Pesa as your payment method during top-up
- Enter your M-Pesa phone number in format
254XXXXXXXXX - The system sends an STK push to your phone
- Enter your M-Pesa PIN to confirm payment
- On successful payment, your float balance is automatically updated
Transaction statuses
Float & Balance
Float is your SMS credit balance. Each Sender ID maintains its own float balance. When you send a message, the required SMS units are deducted from the relevant Sender ID's float.
Viewing your balance
- Navbar — The balance dropdown in the top bar shows your total balance and breakdown by provider (Admin+ roles)
- Billing → Float — View detailed float balances per Sender ID
- Quick Send form — The Sender ID dropdown shows available balance alongside each option
Balance deduction
Balance is deducted at the time of sending, before the message reaches the network provider. The system uses atomic database operations to prevent race conditions on concurrent sends.
API Authentication
The Kimisms API uses OAuth 2.0 client credentials flow. You exchange your Client ID and Client Secret for a Bearer token.
Step 1: Generate credentials
- Go to Developer → Credentials in the portal
- Click Generate Credentials
- Copy your
Client IDandClient Secret— store them securely
Step 2: Get access token
Response
Use the token in subsequent API requests in the Authorization header:
Send SMS via API
Send a single SMS message programmatically using a POST request.
Endpoint
Request body
| Field | Type | Required | Description |
|---|---|---|---|
sender_name | string | Yes | Your approved Sender ID name |
contact | string | Yes | Recipient phone number (9-13 digits) |
message | string | Yes | SMS body text (max 10,000 chars) |
callback_url | string | No | URL to receive delivery status updates |
Send SMS — code example
Success response
Idempotency
To prevent duplicate sends, include an Idempotency-Key header with a unique value. Requests with the same key within 24 hours return the cached response instead of sending again.
Delivery Callbacks
If you provide a callback_url when sending via API, Kimisms will send a POST request to your URL when the delivery status changes.
Callback payload
Status values
| Status | Description |
|---|---|
| INITIATED | Message created and queued for processing |
| SENT | Message dispatched to the network provider |
| DELIVERED | Message confirmed delivered to the recipient's handset |
| FAILED | Message failed to deliver (insufficient balance, invalid number, provider error) |
Status progression
A message can transition to FAILED from any prior status.
Error Handling
The API returns standard HTTP status codes with JSON error bodies.
| Status Code | Meaning | Common Cause |
|---|---|---|
400 | Bad Request | Missing or invalid fields in the request body |
401 | Unauthorized | Invalid or expired access token |
403 | Forbidden | Invalid credentials or insufficient permissions |
429 | Too Many Requests | Rate limit exceeded — wait and retry |
500 | Server Error | Internal error — contact support |
Error response format
Delivery Reports
Track the performance of your SMS campaigns with detailed delivery reports.
Accessing reports
- Reports → Blasts — View all campaigns (Quick, Bulk, API sends) with total SMS counts
- Reports → SMS Logs — Drill into individual message statuses with filters
Report metrics
| Metric | Description |
|---|---|
| Total Messages | Total number of SMS logs in the campaign |
| Delivered | Messages confirmed delivered to recipient handsets |
| Sent | Messages dispatched to the provider but not yet confirmed |
| Initiated | Messages queued but not yet dispatched |
| Failed | Messages that failed at any stage |
| Success Rate | Percentage of delivered messages vs total: (delivered / total) × 100 |
| Telco Breakdown | Message count per provider (Safaricom, Airtel, Telkom) |
SMS Logs
SMS logs provide a detailed record of every message sent through the platform.
Log fields
| Field | Description |
|---|---|
| Number | Recipient phone number |
| Sender ID | The Sender ID used to send the message |
| Message | SMS content |
| Status | Current delivery status (INITIATED, SENT, DELIVERED, FAILED) |
| Units | Number of SMS units consumed |
| Ref | Provider message ID for tracking |
| Created At | Timestamp when the message was created |
Filtering logs
Use the search and filter options to narrow down logs by status, provider, date range, or phone number.
Status Tracking
Each SMS has a complete status history. Click on any SMS log entry to view the full timeline of status changes.
Status log timeline
Each status change is recorded with:
- Status — The new status value
- Description — Details about the change (provider response, error message)
- Timestamp — When the status change occurred
Common failure reasons
| Reason | Description | Resolution |
|---|---|---|
| Insufficient balance | Not enough float on the Sender ID | Top up your balance |
| No matching sender | No Sender ID for the recipient's provider | Apply for a Sender ID on that network |
| Invalid number | Phone number format is incorrect | Check the number format (9-13 digits) |
| Provider error | The telco rejected the message | Check message content and sender status |