Business SMS platform

Your messages on your customers' phones, in seconds

Sparrow SMS sends your campaigns, one-time passcodes and notifications to every operator: sender under your own name, direct routing, real-time delivery receipts, and an interface that works by hand or through the API.

Delivered in seconds Branded sender Direct operator routing
SPARROW
Registered sender
Today
Your verification code is 385 214. It expires in 5 minutes.10:02
Your order #4521 is ready for collection at the Casablanca Anfa branch, until 18/08.10:11
Reminder: your appointment is tomorrow at 2:30 pm. Reply STOP to stop receiving reminders.10:20
Sale: -20% across the department until Sunday. See: sprw.ma/x7Qa10:24
48 300sent
98,6 %delivered
4 saverage delay
12,4 %clicks
What you can send

One channel, five ways to reach your contacts

Click a use case to see in detail how Sparrow SMS sets it up for your business.

Campaigns read within the minute

SMS is almost always opened, and almost immediately: it is the channel for short, time-bound messages — a promotion ending on Sunday, a store opening, a balance reminder. You write the text, choose the segment, and schedule the send time.

  • Sender under your trading name, up to 11 characters
  • Segmentation by city, operator, history or list
  • Personalisation by name, amount or reference
  • Trackable short link, to count the clicks you actually get
  • Scheduling for the date and time you choose
  • STOP notice added automatically to marketing sends
Scheduled campaign
Segment: customers active in the last 90 days
Sale: -20% across the department until Sunday. See: sprw.ma/x7Qa. STOP to 3600009:00
12 480recipients
98,9 %delivered
11,4 %clicks

The code that arrives before the customer loses patience

Verifying a number, approving a payment, confirming an order: these messages must go out within the second. They use a queue separate from campaigns and are never delayed by a bulk send in progress.

  • Priority queue, independent of marketing campaigns
  • Sending via REST API from your application
  • Templates with variables: code, amount, reference, date
  • Delivery receipt returned to your system by webhook
  • Searchable log, number by number
  • No STOP notice on service messages
Transactional SMS
Delivered in 3 seconds
Your verification code is 385 214. It expires in 5 minutes.14:22
Payment of MAD 1,250.00 confirmed. Reference CMD-4521.14:26
1recipient
3 sdelay
Deliveredstatus

Reaching people without depending on an app

SMS assumes no installed app, no data connection and no account: it reaches a basic handset as readily as a smartphone. That is what makes it the channel for appointment reminders, delivery notices and official summonses.

  • Appointment reminder, with date, time and place
  • Delivery, collection and availability notices
  • Summonses, results and administrative information
  • Security alerts and service interruptions
  • Scheduled the day before or a few hours ahead
  • Works without internet, on any mobile phone
Scheduled reminder
Sent the day before at 6 pm
Reminder: your appointment is tomorrow at 2:30 pm, Casablanca Anfa branch.18:00
Your parcel #4521 is available for collection until 18/08.18:00
3 200recipients
98,4 %delivered
0complaint

Your applications send on their own

One HTTP request is enough to send an SMS: your website, ERP or business software calls the API and the message goes out. Authentication uses a token, and each application can carry its own so that statistics stay separate.

  • Documented REST API, JSON responses
  • Single or bulk sending in one request
  • One token per application, statistics kept apart
  • Webhooks on delivery, rejection and inbound reply
  • Examples provided in PHP, Python, Node.js, .NET and Java
  • Sandbox to test without using credits
API call
POST /api/v1/sms/send/one
{ "phone": "+15551234567", "text": "Your code: 385 214" }
{ "code": "OK", "result": { "message_id": "8f21c4" } }
120 msresponse
OKcode
1SMS

Knowing what arrived, and what did not

SMS returns an operator receipt: delivered, undelivered, and the reason for rejection. You know exactly which numbers received the message, which are invalid and which are out of service — enough to clean your database as you go.

  • Status per number: delivered, pending, rejected
  • Rejection reason: invalid number, out of service, refused
  • Click counting on short links
  • Inbound replies attached to the campaign
  • CSV export and webhook delivery
  • History kept and searchable at any time
Campaign report
Finished 12 minutes ago
48,300 sent · 47,624 delivered · 676 rejected
Reasons: 512 invalid numbers, 164 out of service
98,6 %delivered
12,4 %clicks
676rejections
Message types

The different uses of business SMS

One channel, messages that follow different rules: promotional messages are scheduled and carry a STOP notice, transactional ones go out within the second and carry none.

Promotional SMS

Offers, sales, openings and time-limited campaigns, sent to a chosen segment.

STOP notice required

Transactional SMS

Order confirmation, payment notice, status change: triggered by your application.

Priority queue

OTP SMS and two-factor authentication

A one-time passcode to approve a login, a payment or a change of details.

Delivered in seconds

Notification SMS

Delivery, incident, service outage, urgent information to be broadcast widely.

No app required

Reminder SMS

Appointment, payment due date, document expiry: sent the day before or a few hours ahead.

Scheduled send

Bulk SMS

The same message sent to a whole list, in one request or from the web interface.

Up to several hundred thousand

Automated SMS

Welcome, birthday, follow-up on day 3: a sequence is triggered by an event and runs on its own.

Event-triggered

International SMS

Recipients outside Morocco, reached through the same operator links and the same interface.

Price by destination

Two-way SMS

Your recipients reply, and their replies come back into the original campaign or via webhook.

Replies attached to the campaign
Features

Everything you need to send, and to be read

The platform, operator routing and the API in one subscription, with no extra tool to plug in.

Sender under your name

Your messages appear under your trading name rather than an anonymous number. We handle registration with the operators, market by market.

Direct operator routing

Direct links, with no chain of resellers: that is what keeps delivery within seconds and the rejection rate low.

Contact management

Import your lists from a file or your CRM, deduplicate, segment, and let the platform discard invalid numbers and opt-outs.

Scheduled sends

Choose the date and time, or let an event trigger the send: a reminder the day before, a follow-up on day 3, a birthday message.

Delivery receipts

Every number carries its status — delivered, pending, rejected — and the reason. CSV export, webhooks, and inbound replies attached to the campaign.

Documented REST API

One HTTP request and the message goes out. One token per application, single or bulk sending, examples provided in the main languages.

Integration

One HTTP request, and the SMS goes out

No proprietary library to install. The REST API is called from any language, and the web interface stays available for manual sends.

Authentication — a call to POST /api/v1/login with your credentials returns a token (api_token) that you then place in the Authorization: Bearer {api_token} header of every request. One account can hold several applications, each with its own token: statistics stay separate, application by application.
OperationMethodURL
Get a tokenPOSThttps://app.sparrowmessage.com/api/v1/login
Send an SMSPOSThttps://app.sparrowmessage.com/api/v1/sms/send/one
Send in bulkPOSThttps://app.sparrowmessage.com/api/v1/sms/send/bulk
SMS statusPOSThttps://app.sparrowmessage.com/api/v1/sms/status
Status of a listPOSThttps://app.sparrowmessage.com/api/v1/sms/status/bulk
PHP Python Node.js .NET Java Ruby WordPress Odoo Salesforce HubSpot Shopify PrestaShop WooCommerce Zapier SEMS SEMS Amplitude HR Amplitude HR

1 — Get the token, then send an SMS.

<?php
$base = 'https://app.sparrowmessage.com/api/v1';

// — Authentication: keep the token, don't request a new one for every send
$ch = curl_init("$base/login");
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Accept: application/json', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS     => json_encode([
        'email'    => 'you@company.com',
        'password' => 'your-password',
    ]),
]);
$token = json_decode(curl_exec($ch), true)['api_token'];
curl_close($ch);

// — Send an SMS
$ch = curl_init("$base/sms/send/one");
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => [
        'Accept: application/json',
        'Content-Type: application/json',
        "Authorization: Bearer $token",
    ],
    CURLOPT_POSTFIELDS     => json_encode([
        'phone'     => '+2126XXXXXXXX',
        'text'      => 'Your verification code is 385 214.',
        // Optional: Sparrow will post status changes here
        'notifyurl' => 'https://your-site.com/sparrow/status',
    ]),
]);
$reponse = json_decode(curl_exec($ch), true);
curl_close($ch);

// Every response carries a code field: OK or KO
echo $reponse['code'] === 'OK' ? "SMS envoyé\n" : "Échec : {$reponse['error']}\n";

Single send, then bulk send.

import requests

base = 'https://app.sparrowmessage.com/api/v1'

# — Authentication
token = requests.post(f'{base}/login', json={
    'email': 'you@company.com',
    'password': 'your-password',
}).json()['api_token']

headers = {'Authorization': f'Bearer {token}', 'Accept': 'application/json'}

# — Send an SMS
r = requests.post(f'{base}/sms/send/one', headers=headers, json={
    'phone':     '+2126XXXXXXXX',
    'text':      'Your verification code is 385 214.',
    'notifyurl': 'https://your-site.com/sparrow/status',
}).json()

print('SMS envoyé' if r['code'] == 'OK' else f"Échec : {r['error']}")

# — Bulk send: one request, several recipients
requests.post(f'{base}/sms/send/bulk', headers=headers, json={
    'phones': ['+2126XXXXXXXX', '+2126YYYYYYYY'],
    'text':   'Soldes : -20 % jusqu\'à dimanche. STOP au 36000',
})

# — Delivery status, from the identifier returned
status = requests.post(f'{base}/sms/status', headers=headers, json={
    'message_id': '8f21c4',
}).json()
print(status['result'])

Node 18 or later: fetch is built in.

const base = 'https://app.sparrowmessage.com/api/v1';

// — Authentication
const { api_token } = await fetch(`${base}/login`, {
  method:  'POST',
  headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
  body:    JSON.stringify({
    email:    'you@company.com',
    password: 'your-password',
  }),
}).then(r => r.json());

const headers = {
  'Content-Type': 'application/json',
  Accept:         'application/json',
  Authorization: `Bearer ${api_token}`,
};

// — Send an SMS
const reponse = await fetch(`${base}/sms/send/one`, {
  method:  'POST',
  headers: headers,
  body: JSON.stringify({
    phone:     '+2126XXXXXXXX',
    text:      'Your verification code is 385 214.',
    notifyurl: 'https://your-site.com/sparrow/status',
  }),
}).then(r => r.json());

console.log(reponse.code === 'OK' ? 'SMS envoyé' : `Échec : ${reponse.error}`);

// — Bulk send
await fetch(`${base}/sms/send/bulk`, {
  method:  'POST',
  headers: headers,
  body: JSON.stringify({
    phones: ['+2126XXXXXXXX', '+2126YYYYYYYY'],
    text:   'Soldes : -20 % jusqu\'à dimanche. STOP au 36000',
  }),
});

.NET 6 or later.

using System.Net.Http.Json;

var http = new HttpClient { BaseAddress = new Uri("https://app.sparrowmessage.com/api/v1/") };

// — Authentication
var auth = await http.PostAsJsonAsync("login", new {
    email    = "you@company.com",
    password = "your-password",
});
var token = (await auth.Content.ReadFromJsonAsync<Dictionary<string, string>>())["api_token"];
http.DefaultRequestHeaders.Authorization = new("Bearer", token);

// — Send an SMS
var msg = await http.PostAsJsonAsync("sms/send/one", new {
    phone     = "+2126XXXXXXXX",
    text      = "Your verification code is 385 214.",
    notifyurl = "https://your-site.com/sparrow/status",
});

var result = await msg.Content.ReadFromJsonAsync<Dictionary<string, object>>();
Console.WriteLine(result["code"].ToString() == "OK" ? "SMS envoyé" : $"Échec : {result["error"]}");

// — Bulk send
await http.PostAsJsonAsync("sms/send/bulk", new {
    phones = new[] { "+2126XXXXXXXX", "+2126YYYYYYYY" },
    text   = "Soldes : -20 % jusqu'à dimanche. STOP au 36000",
});

Java 11 or later, native HTTP client.

import java.net.URI;
import java.net.http.*;

var client = HttpClient.newHttpClient();
var base   = "https://app.sparrowmessage.com/api/v1";

// — Authentication
var auth = HttpRequest.newBuilder(URI.create(base + "/login"))
    .header("Content-Type", "application/json")
    .header("Accept", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString("""
        {"email":"you@company.com","password":"your-password"}"""))
    .build();

var token = extract(client.send(auth, HttpResponse.BodyHandlers.ofString()).body(), "api_token");

// — Send an SMS
var msg = HttpRequest.newBuilder(URI.create(base + "/sms/send/one"))
    .header("Content-Type", "application/json")
    .header("Accept", "application/json")
    .header("Authorization", "Bearer " + token)
    .POST(HttpRequest.BodyPublishers.ofString("""
        {"phone":"+2126XXXXXXXX",
         "text":"Your verification code is 385 214.",
         "notifyurl":"https://your-site.com/sparrow/status"}"""))
    .build();

System.out.println(client.send(msg, HttpResponse.BodyHandlers.ofString()).body());

Copy and paste into a terminal.

# — 1. Get the token
curl -X POST https://app.sparrowmessage.com/api/v1/login \
     -H "Accept: application/json" \
     -H "Content-Type: application/json" \
     -d '{"email":"you@company.com","password":"your-password"}'

# Response: {"code":"OK","api_token":"eyJ0eXAiOiJKV1Qi..."}

# — 2. Send an SMS
curl -X POST https://app.sparrowmessage.com/api/v1/sms/send/one \
     -H "Accept: application/json" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer $TOKEN" \
     -d '{"phone":"+2126XXXXXXXX",
          "text":"Your verification code is 385 214.",
          "notifyurl":"https://your-site.com/sparrow/status"}'

# — 3. Bulk send
curl -X POST https://app.sparrowmessage.com/api/v1/sms/send/bulk \
     -H "Accept: application/json" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer $TOKEN" \
     -d '{"phones":["+2126XXXXXXXX","+2126YYYYYYYY"],
          "text":"Reminder: your appointment is tomorrow at 2:30 pm."}'

# — 4. Delivery status
curl -X POST https://app.sparrowmessage.com/api/v1/sms/status \
     -H "Accept: application/json" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer $TOKEN" \
     -d '{"message_id":"8f21c4"}'

# — 5. Status of a batch
curl -X POST https://app.sparrowmessage.com/api/v1/sms/status/bulk \
     -H "Accept: application/json" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer $TOKEN" \
     -d '{"messages_id":["8f21c4","8f21c5"]}'

Every response carries a code field set to OK ou KO. On anOK, result — or results for bulk calls — carries the detail; on a KO, error gives the reason. Full documentation and a sandbox are provided when your account opens.

Customers

Trusted by

Enterprises, institutions and public bodies, in Morocco and abroad. The same organisations, whatever the channel.

Employee, supplier and customer communication

Customer and employee communication

Customer and employee communication

Supplier communication

Customer and employee communication

Candidate and employer communication

Member and partner communication

Member communication

Partner and donor communication

Customer communication

Customer notifications from the CRM

Customer communication

Candidate and employer communication

Member communication

Customer and partner communication

Supplier communication

Student and partner communication

Tourism industry communication

Customer communication

Member communication

Customer and user communication

Student and administration communication

Student and administration communication

Customer and store communication

Employee communication

Customer and prospect communication

Customer and prospect communication

Customer communication

Customer communication

Customer communication

Customer notifications and relations

Customer and supplier notifications

Customer notifications and campaigns

Industries

A channel built for every industry

Retail and distribution

Time-limited promotions, order confirmation, in-store collection notices.

Banking and insurance

Transaction approval codes, payment due notices, security alerts.

Education

Exam summonses, results available, immediate information for parents.

Real estate

Viewing confirmation, appointment reminder, prospect follow-up.

Transport and logistics

Shipping notice, delivery slot, parcel collection code.

Associations and federations

Meeting summonses, membership fee reminders, urgent information.

Industry

Instructions to field teams, on-call duty, production alerts.

Healthcare

Appointment reminders, results available, prevention campaigns.

Getting started

Your SMS platform up and running in 4 phases

From signature to first send, a mapped-out path and a single point of contact.

1Scoping and account opening
Volume chosen according to your monthly sends
Payment and account creation
User access and roles created
2Sender registration
Sender name filed with the operators
Company documents and statement of use
API and web interface access opened
3Contacts, templates and integration
Import and cleaning of your number lists
Message templates with your variables
Connection to your website, CRM or ERP
4First sends and support
Test send and checks across several operators
Gradual ramp-up of volumes
Training your teams and tracking results

Typical timeline: account opened within 24 hours, first send as soon as the operators approve your sender name.

Pricing

A price per SMS, decreasing with volume

No subscription: you buy a volume of SMS with no expiry date. The unit price falls tier by tier, and the minimum order is 1,000 SMS.

Small volumes

To get started, test a channel or cover occasional sends.

  • From 1,000 to 10,000 SMS
  • Shared sender or your own name
  • Web interface and REST API
  • Credits with no expiry date
  • No log retention
  • Basic support package included
Estimate my budget

Large volumes

Beyond 50,000 SMS per send or per month.

  • From 50,001 SMS
  • Everything in the previous tier
  • Logs kept for 7 days
  • Webhooks included
  • Higher sending throughput
  • Integration with your information system
  • Service and availability commitment
  • Dedicated commercial and technical contact
Estimate my budget

Payment in dirhams MAD

Bank transfer to E-solution, Casablanca. Moroccan invoice with tax ID, VAT applicable.

Bank transfer Cheque Cash

Payment in US dollars USD

Invoiced by E-SOLUTION TECHNOLOGIES LLC, New York — EIN 32-0781906. Useful if your accounting works in dollars, wherever you are.

Card payment (Stripe) PayPal Wire transfer / SWIFT

Bank details and the secure payment link are sent with the invoice, never published on this page.

Prices excluding tax, for Morocco. One SMS holds 160 characters; beyond that the message is split and each part is counted. Longer log retention is available on request. The tiers above apply to sends within Morocco; internationally the price depends on the destination country — the calculator applies it automatically.

Calculator

Estimate your SMS budget

Enter your volume: the unit price adjusts to the tier you reach. The quote reflects exactly what you select here.

Your volume
Destination country
Number of SMS MAD 0.40 / SMS
Message length 10,000 SMS counted
Frequency

Minimum order: 1,000 SMS. Credits do not expire.

Options
Sender name
Metrics and analytics export
Webhooks (remise, rejet, réponse)
Team training
Integration with your information system 3 000 DH / J-H

The shared sender is included. Each branded sender name is registered with the operators and billed once: MAD 500 per name, the first being included from 10,001 SMS upwards.

Support package with SLA
Support levelBest effort, business hours, knowledge base and email — 0.5 person-day max/month

The support pack is billed annually.

SMS creditstop-up
One-time feesat go-live
Subscriptionsover 12 months
Estimated cost
4 000 DH
10,000 SMS at MAD 0.40

Indicative estimate excluding tax, based on our published rates.

Need a tailored price list?

Beyond the published tiers, we build a price list with you that matches your volumes, your destinations and your seasonality. Let's talk — we reply within one business day.

Frequently asked questions

Everything about business SMS

160 characters for a message in the standard Latin alphabet. Beyond that the message is split and each part is counted: 306 characters make two SMS, 459 make three. Accented characters are fine, but a single emoji or Arabic character switches the message to Unicode encoding, where the limit drops to 70 characters. The platform shows the count as you type.

Yes. The sender name can be up to eleven characters and replaces the sending number. It must be registered with the operators, with proof that the company exists; we handle that. Allow a few business days. Note that an alphanumeric sender is not a number, so it cannot receive replies; in that case sending is done from a numeric sender.

A transactional SMS answers something the recipient did — a verification code, an order confirmation, a delivery notice. It goes out within the second, through a priority queue, and carries no opt-out notice. A marketing SMS offers something that was not asked for: it requires prior consent, the STOP notice, and respect for permitted sending hours.

Promotional sends belong in business hours and should avoid nights, early mornings, Sundays and public holidays. The rule is as much commercial common sense as regulation: a message received at 11 pm mostly produces opt-outs. Service messages are not affected.

Every marketing campaign carries an opt-out notice. A recipient who replies STOP is removed from your lists automatically, and the platform excludes them from all later promotional sends without any action on your side. They still receive your service messages, which do not fall under commercial consent.

The operator returns a negative receipt with the reason: number does not exist, handset switched off for too long, subscriber out of service. The message is not counted twice, and the number is flagged in the campaign report. Your successive sends clean your database as they go.

Yes, on campaigns sent from a numeric sender. Replies come back into the interface, attached to the original campaign, and can be forwarded to your system by webhook. That is what makes appointment confirmations by reply, polls and SMS games possible.

No. Purchased credits stay available with no time limit. The unit price is the one for the tier reached at the time of the order: buying in one go rather than in several small batches therefore costs less.

Yes, coverage is international. The price then depends on the destination, and some countries impose their own rules on sender names or prior campaign registration. Tell us your destinations and we will provide a matching price list.

In Morocco, personal data processing falls under Law 09-08 and the CNDP: your number file must be declared, and any promotional send requires the recipient's prior consent. The STOP notice appears on every marketing campaign and is applied immediately; consents, collection dates and deletion requests are kept and exportable as evidence. We are not lawyers: have your setup and your CNDP declaration reviewed by your counsel.

The GDPR requires freely given, specific and informed consent before any promotional send, along with a simple way to withdraw it. The STOP notice appears on every marketing campaign and is applied immediately; consents, collection dates and deletion requests are kept and exportable, ready to feed your record of processing activities. We are not lawyers: for your privacy notices and the legal basis of your sends, have your setup reviewed by your counsel.

In the United States, commercial SMS falls under the Telephone Consumer Protection Act, enforced by the FCC, while the CAN-SPAM Act governs email. The TCPA requires explicit written consent before any promotional message, an opt-out method restated in the messages, and respect for the recipient's local time. Operator rules apply on top, making the use of a number conditional on registering the campaign. STOP replies are processed automatically and retained. We are not lawyers: since the TCPA creates a private right of action, have your setup reviewed by your counsel before any campaign.

The account is opened within 24 hours and the first test sends can go out immediately using a shared sender. The real timeline depends on registering your sender name with the operators, which takes a few business days.

Contact

Let's talk about your SMS project

Morocco

CAF OFFICE, 1er étage, N° 2
Casablanca 20000, Maroc

+212 662-583818

United States

224 W 35th St Ste 500 N 1018
New York, NY 10001, United States

+1 (347) 789-2280

Generate your quote

Enter the customer's details. The quote will automatically include the plan and options selected in the calculator.

All fields are required.