Sparrow SMS envoie vos campagnes, vos codes à usage unique et vos notifications vers tous les opérateurs : expéditeur à votre nom, routage direct, accusés de réception en temps réel et interface aussi bien manuelle qu'automatisée par API.
Cliquez sur un cas d'usage pour découvrir en détail comment Sparrow SMS l'active pour votre entreprise.
Le SMS s'ouvre presque toujours, et presque tout de suite : c'est le canal du message court et daté — une promotion qui se termine dimanche, une ouverture de magasin, un rappel de solde. Vous composez le texte, choisissez le segment, et programmez l'heure d'envoi.
Vérification d'un numéro, validation d'un paiement, confirmation d'une commande : ces messages doivent partir à la seconde. Ils empruntent une file séparée des campagnes et ne sont jamais retardés par un envoi en masse en cours.
Le SMS ne suppose ni application installée, ni connexion de données, ni compte ouvert : il atteint un téléphone de base comme un smartphone. C'est ce qui en fait le canal des rappels de rendez-vous, des avis de livraison et des convocations.
Une requête HTTP suffit à envoyer un SMS : votre site, votre ERP ou votre logiciel métier appelle l'API et le message part. L'authentification se fait par jeton, et chaque application peut porter le sien pour que les statistiques restent séparées.
Le SMS renvoie un accusé de l'opérateur : remis, non remis, et le motif du rejet. Vous savez donc précisément quels numéros ont reçu le message, lesquels sont invalides et lesquels sont hors service — de quoi nettoyer votre base au fil des envois.
Un même canal, des messages qui n'obéissent pas aux mêmes règles : le promotionnel se planifie et porte une mention STOP, le transactionnel part à la seconde et n'en porte pas.
Offres, soldes, ouvertures et opérations à durée limitée, adressées à un segment choisi.
Mention STOP obligatoireConfirmation de commande, avis de paiement, changement de statut : déclenché par votre application.
File prioritaireCode à usage unique pour valider une connexion, un paiement ou un changement de coordonnées.
Remise en quelques secondesLivraison, incident, interruption de service, information urgente à diffuser largement.
Sans application requiseRendez-vous, échéance de paiement, expiration d'un document : envoyé la veille ou quelques heures avant.
Envoi programméUn même message adressé à une liste entière, en une seule requête ou depuis l'interface web.
Jusqu'à plusieurs centaines de milliersBienvenue, anniversaire, relance à J+3 : une séquence se déclenche sur un événement et se déroule seule.
Déclenché par événementVos destinataires hors du Maroc, joints par les mêmes liens opérateurs et la même interface.
Tarif par destinationVos destinataires répondent, et leurs réponses reviennent dans la campagne d'origine ou par webhook.
Réponses rattachées à la campagneLa plateforme, le routage opérateur et l'API dans un même abonnement, sans outil supplémentaire à brancher.
Vos messages s'affichent sous votre nom commercial plutôt qu'un numéro anonyme. Nous nous chargeons de l'enregistrement auprès des opérateurs, marché par marché.
Des liens directs, sans revente en cascade : c'est ce qui tient le délai de remise à quelques secondes et le taux de rejet au plus bas.
Importez vos listes depuis un fichier ou votre CRM, dédoublonnez, segmentez, et laissez la plateforme écarter les numéros invalides et les désinscrits.
Choisissez la date et l'heure, ou laissez un événement déclencher l'envoi : rappel la veille, relance à J+3, message d'anniversaire.
Chaque numéro porte son statut — remis, en attente, rejeté — et son motif. Export CSV, webhooks, et réponses entrantes rattachées à la campagne.
Une requête HTTP et le message part. Jeton par application, envoi unitaire ou en masse, exemples fournis dans les principaux langages.
Aucune bibliothèque propriétaire à installer. L'API REST s'appelle depuis n'importe quel langage, et l'interface web reste disponible pour les envois manuels.
POST /api/v1/login avec vos identifiants renvoie un jeton
(api_token) que vous placez ensuite dans l'en-tête
Authorization: Bearer {api_token} de chaque envoi.
Un compte peut porter plusieurs applications, chacune avec son jeton :
les statistiques restent séparées, application par application.
| Opération | Méthode | URL |
|---|---|---|
| Obtenir un jeton | POST | https://app.sparrowmessage.com/api/v1/login |
| Envoyer un SMS | POST | https://app.sparrowmessage.com/api/v1/sms/send/one |
| Envoyer en masse | POST | https://app.sparrowmessage.com/api/v1/sms/send/bulk |
| Statut d'un SMS | POST | https://app.sparrowmessage.com/api/v1/sms/status |
| Statut d'une liste | POST | https://app.sparrowmessage.com/api/v1/sms/status/bulk |
SEMS
Amplitude RH
1 — Obtenir le jeton, puis envoyer un SMS.
<?php
$base = 'https://app.sparrowmessage.com/api/v1';
// — Authentification : le jeton est à conserver, pas à redemander à chaque envoi
$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' => '[email protected]',
'password' => 'votre-mot-de-passe',
]),
]);
$jeton = json_decode(curl_exec($ch), true)['api_token'];
curl_close($ch);
// — Envoi d'un 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 $jeton",
],
CURLOPT_POSTFIELDS => json_encode([
'phone' => '+2126XXXXXXXX',
'text' => 'Votre code de vérification est 385 214.',
// Facultatif : Sparrow y postera les changements de statut
'notifyurl' => 'https://votre-site.ma/sparrow/statut',
]),
]);
$reponse = json_decode(curl_exec($ch), true);
curl_close($ch);
// Toute réponse porte un champ code : OK ou KO
echo $reponse['code'] === 'OK' ? "SMS envoyé\n" : "Échec : {$reponse['error']}\n";
Envoi unitaire, puis envoi en masse.
import requests
base = 'https://app.sparrowmessage.com/api/v1'
# — Authentification
jeton = requests.post(f'{base}/login', json={
'email': '[email protected]',
'password': 'votre-mot-de-passe',
}).json()['api_token']
entetes = {'Authorization': f'Bearer {jeton}', 'Accept': 'application/json'}
# — Envoi d'un SMS
r = requests.post(f'{base}/sms/send/one', headers=entetes, json={
'phone': '+2126XXXXXXXX',
'text': 'Votre code de vérification est 385 214.',
'notifyurl': 'https://votre-site.ma/sparrow/statut',
}).json()
print('SMS envoyé' if r['code'] == 'OK' else f"Échec : {r['error']}")
# — Envoi en masse : une seule requête, plusieurs destinataires
requests.post(f'{base}/sms/send/bulk', headers=entetes, json={
'phones': ['+2126XXXXXXXX', '+2126YYYYYYYY'],
'text': 'Soldes : -20 % jusqu\'à dimanche. STOP au 36000',
})
# — Statut d'un envoi, à partir de l'identifiant renvoyé
statut = requests.post(f'{base}/sms/status', headers=entetes, json={
'message_id': '8f21c4',
}).json()
print(statut['result'])
Node 18 ou plus récent : fetch est natif.
const base = 'https://app.sparrowmessage.com/api/v1';
// — Authentification
const { api_token } = await fetch(`${base}/login`, {
method: 'POST',
headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
body: JSON.stringify({
email: '[email protected]',
password: 'votre-mot-de-passe',
}),
}).then(r => r.json());
const entetes = {
'Content-Type': 'application/json',
Accept: 'application/json',
Authorization: `Bearer ${api_token}`,
};
// — Envoi d'un SMS
const reponse = await fetch(`${base}/sms/send/one`, {
method: 'POST',
headers: entetes,
body: JSON.stringify({
phone: '+2126XXXXXXXX',
text: 'Votre code de vérification est 385 214.',
notifyurl: 'https://votre-site.ma/sparrow/statut',
}),
}).then(r => r.json());
console.log(reponse.code === 'OK' ? 'SMS envoyé' : `Échec : ${reponse.error}`);
// — Envoi en masse
await fetch(`${base}/sms/send/bulk`, {
method: 'POST',
headers: entetes,
body: JSON.stringify({
phones: ['+2126XXXXXXXX', '+2126YYYYYYYY'],
text: 'Soldes : -20 % jusqu\'à dimanche. STOP au 36000',
}),
});
.NET 6 ou plus récent.
using System.Net.Http.Json;
var http = new HttpClient { BaseAddress = new Uri("https://app.sparrowmessage.com/api/v1/") };
// — Authentification
var auth = await http.PostAsJsonAsync("login", new {
email = "[email protected]",
password = "votre-mot-de-passe",
});
var jeton = (await auth.Content.ReadFromJsonAsync<Dictionary<string, string>>())["api_token"];
http.DefaultRequestHeaders.Authorization = new("Bearer", jeton);
// — Envoi d'un SMS
var envoi = await http.PostAsJsonAsync("sms/send/one", new {
phone = "+2126XXXXXXXX",
text = "Votre code de vérification est 385 214.",
notifyurl = "https://votre-site.ma/sparrow/statut",
});
var resultat = await envoi.Content.ReadFromJsonAsync<Dictionary<string, object>>();
Console.WriteLine(resultat["code"].ToString() == "OK" ? "SMS envoyé" : $"Échec : {resultat["error"]}");
// — Envoi en masse
await http.PostAsJsonAsync("sms/send/bulk", new {
phones = new[] { "+2126XXXXXXXX", "+2126YYYYYYYY" },
text = "Soldes : -20 % jusqu'à dimanche. STOP au 36000",
});
Java 11 ou plus récent, client HTTP natif.
import java.net.URI;
import java.net.http.*;
var client = HttpClient.newHttpClient();
var base = "https://app.sparrowmessage.com/api/v1";
// — Authentification
var auth = HttpRequest.newBuilder(URI.create(base + "/login"))
.header("Content-Type", "application/json")
.header("Accept", "application/json")
.POST(HttpRequest.BodyPublishers.ofString("""
{"email":"[email protected]","password":"votre-mot-de-passe"}"""))
.build();
var jeton = extraire(client.send(auth, HttpResponse.BodyHandlers.ofString()).body(), "api_token");
// — Envoi d'un SMS
var envoi = HttpRequest.newBuilder(URI.create(base + "/sms/send/one"))
.header("Content-Type", "application/json")
.header("Accept", "application/json")
.header("Authorization", "Bearer " + jeton)
.POST(HttpRequest.BodyPublishers.ofString("""
{"phone":"+2126XXXXXXXX",
"text":"Votre code de vérification est 385 214.",
"notifyurl":"https://votre-site.ma/sparrow/statut"}"""))
.build();
System.out.println(client.send(envoi, HttpResponse.BodyHandlers.ofString()).body());
À copier tel quel dans un terminal.
# — 1. Obtenir le jeton
curl -X POST https://app.sparrowmessage.com/api/v1/login \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]","password":"votre-mot-de-passe"}'
# Réponse : {"code":"OK","api_token":"eyJ0eXAiOiJKV1Qi..."}
# — 2. Envoyer un 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 $JETON" \
-d '{"phone":"+2126XXXXXXXX",
"text":"Votre code de vérification est 385 214.",
"notifyurl":"https://votre-site.ma/sparrow/statut"}'
# — 3. Envoyer en masse
curl -X POST https://app.sparrowmessage.com/api/v1/sms/send/bulk \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $JETON" \
-d '{"phones":["+2126XXXXXXXX","+2126YYYYYYYY"],
"text":"Rappel : votre rendez-vous est demain a 14h30."}'
# — 4. Statut d'un envoi
curl -X POST https://app.sparrowmessage.com/api/v1/sms/status \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $JETON" \
-d '{"message_id":"8f21c4"}'
# — 5. Statut d'une liste
curl -X POST https://app.sparrowmessage.com/api/v1/sms/status/bulk \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $JETON" \
-d '{"messages_id":["8f21c4","8f21c5"]}'
Toutes les réponses portent un champ code valant OK ou
KO. En cas d'OK, result — ou results
pour les appels en masse — porte le détail ; en cas de KO,
error en donne la raison.
Documentation complète et bac à sable fournis à l'ouverture du compte.
Des organisations qui joignent chaque mois leurs clients, leurs fournisseurs, leurs collaborateurs et leurs adhérents.

Envoi SMS collaborateurs, fournisseurs et clients

Envoi SMS clients et collaborateurs

Envoi SMS fournisseurs

Envoi SMS clients

Envoi SMS clients

Envoi SMS adhérents

Envoi SMS adhérents

Envoi SMS clients et collaborateurs

Envoi SMS membres et partenaires

Envoi SMS candidats et entreprises

Envoi SMS clients et partenaires

Envoi SMS partenaires et donateurs

Envoi SMS candidats et entreprises

Envoi SMS clients et collaborateurs

Envoi SMS étudiants et partenaires

Envoi SMS clients

Envoi SMS professionnels du tourisme

Envoi SMS fournisseurs
Promotions à durée limitée, confirmation de commande, avis de retrait en magasin.
Codes de validation d'opération, avis d'échéance, alertes de sécurité.
Convocations aux examens, résultats disponibles, information immédiate aux parents.
Confirmation de visite, rappel de rendez-vous, relance des prospects.
Avis d'expédition, créneau de livraison, code de retrait du colis.
Convocations aux assemblées, rappels de cotisation, informations urgentes.
Consignes aux équipes de terrain, astreintes, alertes de production.
Rappels de rendez-vous, résultats disponibles, campagnes de prévention.
Pas d'abonnement : vous achetez un volume de SMS, valable sans date d'expiration. Le prix unitaire baisse par palier, et la commande minimale est de 1 000 SMS.
Pour démarrer, tester un canal ou couvrir des envois ponctuels.
Pour des campagnes régulières et des notifications quotidiennes.
Au-delà de 50 000 SMS par envoi ou par mois.
Prix hors taxes, pour le Maroc. Un SMS compte 160 caractères ; au-delà, le message est découpé et chaque partie est décomptée. Une conservation des journaux plus longue est possible sur demande. Les paliers ci-dessus valent pour les envois vers le Maroc ; à l'international, le prix dépend du pays d'arrivée — le simulateur l'applique automatiquement.
Indiquez votre volume : le prix unitaire s'ajuste au palier atteint. Le devis reprend exactement ce que vous sélectionnez ici.
Commande minimale : 1 000 SMS. Les crédits n'expirent pas.
L'expéditeur partagé est inclus. Chaque nom d'expéditeur à votre marque fait l'objet d'un dépôt auprès des opérateurs, facturé une seule fois : 500 DH par nom, le premier étant compris dans l'offre à partir de 10 001 SMS.
La facturation du pack de support est annuelle.
Estimation indicative hors taxes, établie sur la base de nos tarifs publics.
Au-delà des paliers publics, nous construisons avec vous une grille adaptée à vos volumes, à vos destinations et à votre saisonnalité. Parlons-en : nous vous répondons sous 24 heures ouvrées.
160 caractères pour un message en alphabet latin standard. Au-delà, le message est découpé et chaque partie est décomptée : 306 caractères font deux SMS, 459 en font trois. Les caractères accentués passent, mais un emoji ou un caractère arabe fait basculer le message en encodage Unicode, où la limite tombe à 70 caractères. La plateforme vous affiche le décompte pendant la saisie.
Oui. Le nom d'expéditeur peut porter jusqu'à onze caractères et remplace le numéro d'émission. Il doit être déposé auprès des opérateurs, avec un justificatif d'existence de l'entreprise ; nous nous en chargeons. Comptez quelques jours ouvrés. À noter : un expéditeur alphanumérique n'est pas un numéro, il ne permet donc pas de recevoir de réponse ; l'envoi se fait alors depuis un numéro d'émission.
Le SMS transactionnel répond à une action du destinataire — un code de vérification, une confirmation de commande, un avis de livraison. Il part à la seconde, par une file prioritaire, et ne porte pas de mention de désinscription. Le SMS marketing propose quelque chose qui n'a pas été demandé : il exige le consentement préalable, la mention STOP, et le respect des horaires autorisés.
Les envois publicitaires sont à réserver aux horaires ouvrables et à éviter la nuit, tôt le matin, les dimanches et les jours fériés. Cette règle relève autant du bon sens commercial que de la réglementation : un message reçu à 23 h produit surtout des désinscriptions. Les messages de service, eux, ne sont pas concernés.
Chaque campagne marketing porte une mention de désinscription. Le destinataire qui répond STOP est retiré automatiquement de vos listes, et la plateforme l'écarte de tous vos envois publicitaires ultérieurs, sans intervention de votre part. Il continue en revanche de recevoir vos messages de service, qui ne relèvent pas du consentement commercial.
L'opérateur renvoie un accusé négatif avec son motif : numéro inexistant, téléphone éteint depuis trop longtemps, abonné hors service. Le message n'est pas décompté deux fois, et le numéro est signalé dans le rapport de campagne. Vos envois successifs nettoient ainsi votre base au fil de l'eau.
Oui, sur les campagnes envoyées depuis un numéro d'émission. Les réponses reviennent dans l'interface, rattachées à la campagne d'origine, et peuvent être renvoyées à votre système par webhook. C'est ce qui permet les confirmations de rendez-vous par réponse, les sondages et les jeux par SMS.
Non. Les crédits achetés restent disponibles sans date limite. Le prix unitaire est celui du palier atteint au moment de la commande : commander en une fois plutôt qu'en plusieurs petites tranches revient donc moins cher.
Oui, la couverture est internationale. Le tarif dépend alors de la destination, et certains pays imposent leurs propres règles sur le nom d'expéditeur ou l'enregistrement préalable des campagnes. Indiquez-nous vos destinations et nous vous remettons une grille correspondante.
Le compte est ouvert sous 24 heures et les premiers envois de test peuvent partir immédiatement avec un expéditeur partagé. Le délai réel dépend du dépôt de votre nom d'expéditeur auprès des opérateurs, qui prend quelques jours ouvrés.
Votre plateforme SMS opérationnelle en 4 phases
De la signature au premier envoi, un parcours balisé et un interlocuteur unique.
Délai courant : compte ouvert sous 24 h, premier envoi dès la validation du nom d'expéditeur par les opérateurs.