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.
Click a use case to see in detail how Sparrow SMS sets it up for your business.
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.
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.
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.
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.
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.
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.
Offers, sales, openings and time-limited campaigns, sent to a chosen segment.
STOP notice requiredOrder confirmation, payment notice, status change: triggered by your application.
Priority queueA one-time passcode to approve a login, a payment or a change of details.
Delivered in secondsDelivery, incident, service outage, urgent information to be broadcast widely.
No app requiredAppointment, payment due date, document expiry: sent the day before or a few hours ahead.
Scheduled sendThe same message sent to a whole list, in one request or from the web interface.
Up to several hundred thousandWelcome, birthday, follow-up on day 3: a sequence is triggered by an event and runs on its own.
Event-triggeredRecipients outside Morocco, reached through the same operator links and the same interface.
Price by destinationYour recipients reply, and their replies come back into the original campaign or via webhook.
Replies attached to the campaignThe platform, operator routing and the API in one subscription, with no extra tool to plug in.
Your messages appear under your trading name rather than an anonymous number. We handle registration with the operators, market by market.
Direct links, with no chain of resellers: that is what keeps delivery within seconds and the rejection rate low.
Import your lists from a file or your CRM, deduplicate, segment, and let the platform discard invalid numbers and opt-outs.
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.
Every number carries its status — delivered, pending, rejected — and the reason. CSV export, webhooks, and inbound replies attached to the campaign.
One HTTP request and the message goes out. One token per application, single or bulk sending, examples provided in the main languages.
No proprietary library to install. The REST API is called from any language, and the web interface stays available for manual sends.
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.
| Operation | Method | URL |
|---|---|---|
| Get a token | POST | https://app.sparrowmessage.com/api/v1/login |
| Send an SMS | POST | https://app.sparrowmessage.com/api/v1/sms/send/one |
| Send in bulk | POST | https://app.sparrowmessage.com/api/v1/sms/send/bulk |
| SMS status | POST | https://app.sparrowmessage.com/api/v1/sms/status |
| Status of a list | POST | https://app.sparrowmessage.com/api/v1/sms/status/bulk |
SEMS
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.
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
Time-limited promotions, order confirmation, in-store collection notices.
Transaction approval codes, payment due notices, security alerts.
Exam summonses, results available, immediate information for parents.
Viewing confirmation, appointment reminder, prospect follow-up.
Shipping notice, delivery slot, parcel collection code.
Meeting summonses, membership fee reminders, urgent information.
Instructions to field teams, on-call duty, production alerts.
Appointment reminders, results available, prevention campaigns.
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.
To get started, test a channel or cover occasional sends.
For regular campaigns and daily notifications.
Beyond 50,000 SMS per send or per month.
Bank transfer to E-solution, Casablanca. Moroccan invoice with tax ID, VAT applicable.
Invoiced by E-SOLUTION TECHNOLOGIES LLC, New York — EIN 32-0781906. Useful if your accounting works in dollars, wherever you are.
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.
Enter your volume: the unit price adjusts to the tier you reach. The quote reflects exactly what you select here.
Minimum order: 1,000 SMS. Credits do not expire.
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.
The support pack is billed annually.
Indicative estimate excluding tax, based on our published rates.
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.
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.
Your SMS platform up and running in 4 phases
From signature to first send, a mapped-out path and a single point of contact.
Typical timeline: account opened within 24 hours, first send as soon as the operators approve your sender name.