التوثيق التقني
ادمج خدمات EnvoiSMS.ma في أقل من 15 دقيقة باستخدام مكتباتنا للغات PHP و Node.js و Python. مصمم للمطورين المحترفين.
Start here
كل ما تحتاجه للبدء قبل طلبك الأول.
EnvoiSMS.ma هي بنية تحتية للرسائل المبرمجة للمغرب. تضمن مساراتنا المباشرة مع شركات الاتصالات IAM و Inwi و Orange زمن وصول فوري.
قم بتوليد مفتاح واجهة برمجة التطبيقات "smr_..." من لوحة التحكم الخاصة بك.
استخدم مصادقة Bearer في ترويسات HTTP الخاصة بك لكل طلب.
اختبر الربط عبر بيئة الاختبار Sandbox لتجنب استهلاك أي رصيد حقيقي.
ادمج واجهة واتساب للأعمال لتقليل تكلفة رسائل التحقق (OTP) بمقدار 10 مرات.
قم بتهيئة ويب هوك (Webhook) موقع لاستلام تقارير التسليم في الوقت الفعلي.
تابع استهلاكك وفواتيرك بالدرهم المغربي مباشرة من لوحة التحكم.
// config/services.php
'envoisms' => [
'key' => env('ENVOISMS_API_KEY'),
],
// Usage
Http::withToken(config('services.envoisms.key'))
->post('https://api.envoisms.ma/v1/messages', [
'to' => '+212612345678',
'message' => 'Votre commande est en cours de livraison 🚚',
'from' => 'MaBoutique'
]); OpenAPI Spec المصادقة
مفاتيح Bearer والرؤوس والقيود الأمنية.
يتطلب كل مسار /v1 مفتاح واجهة برمجة تطبيقات صالحًا يتم تمريره في ترويسة Authorization كرمز Bearer. يمكن توليد أو إلغاء مفاتيح الاختبار والإنتاج من وحدة التحكم الخاصة بك.
Authorization: Bearer smr_xxx
يتم إرجاع X-RateLimit-Limit و X-RateLimit-Remaining مع كل طلب.
الطلبات الواردة من عناوين IP غير المهيأة ترجع حالة 401.
يتم دعم JSON و Authorization و X-EnvoiSMS.ma-Signature و X-EnvoiSMS.ma-Version.
POST /v1/messages HTTP/1.1
Host: api.envoisms.ma
Authorization: Bearer smr_xxxxxxxx
Content-Type: application/json
Accept: application/jsonOpen Source
حزم SDK الرسمية والمكتبات البرمجية
قم بربط واجهة برمجة EnvoiSMS في تطبيقك بسهولة باستخدام مكتباتنا البرمجية المفتوحة المصدر.
npm install envoismscomposer require envoisms/envoisms-phppip install envoismscomposer require envoisms/laravel-otp/v1/messagesإرسال رسالة
يرسل رسالة معاملاتية أو تسويقية عبر الرسائل القصيرة أو واجهة واتساب للأعمال.
- Vous envoyez des codes OTP ? Deux approches. /v1/verify/send gère tout le cycle (génération, livraison, validation, expiration) et reste la voie recommandée. Si vous générez vos propres codes et les envoyez ici, ajoutez metadata: {"purpose": "otp"} : en cas d'échec de livraison confirmé par le réseau sur un numéro marocain alors que le code est encore frais (moins de 10 minutes), la plateforme le renvoie automatiquement une fois par une route SMS alternative — même identifiant de message, aucun coût supplémentaire. Sans ce tag, le message est traité comme un SMS ordinaire.
- Les sauts de ligne (\n) sont pleinement pris en charge sur tous les canaux et s'affichent correctement chez le destinataire.
- Le formatage de texte enrichi (gras, italique, etc.) n'est pas supporté par le canal SMS (texte brut uniquement).
- Le canal WhatsApp prend en charge le formatage de texte avec la syntaxe standard (*gras*, _italique_, ~barré~).
curl -X POST "https://api.envoisms.ma/v1/messages" \
-H "Authorization: Bearer smr_xxx" \
-H "Content-Type: application/json" \
-d '{
"to": "+212612345678",
"message": "Votre code de validation est 849204",
"from": "MaBoutique",
"channel": "whatsapp"
}'{
"id": "msg_8f2d...",
"to": "+212612345678",
"channel": "whatsapp",
"cascade": false,
"status": "queued",
"cost": {
"eur": 0.0118,
"mad": 0.13
},
"segments": 1,
"created_at": "2026-05-15T10:30:00Z"
}/v1/messages/bulkEnvoi groupé (Bulk)
Envoie jusqu'à 10 000 messages en un seul appel API avec des destinataires ou des contenus uniques.
- Les sauts de ligne (\n) sont pleinement pris en charge dans les corps des messages groupés.
- Le formatage de texte enrichi (gras, italique, etc.) n'est pas supporté par le canal SMS (texte brut uniquement).
- Le canal WhatsApp prend en charge le formatage de texte avec la syntaxe standard (*gras*, _italique_, ~barré~).
curl -X POST "https://api.envoisms.ma/v1/messages/bulk" \
-H "Authorization: Bearer smr_xxx" \
-H "Content-Type: application/json" \
-d '{
"messages": [
{
"to": "+212611111111",
"message": "Hello Client 1"
},
{
"to": "+212622222222",
"message": "Hello Client 2"
}
],
"from": "ENVOISMS",
"channel": "sms"
}'{
"batch_id": "batch_9a3c...",
"total": 2,
"channel": "sms",
"estimated_cost": {
"eur": 0.056,
"mad": 0.62
},
"messages": [
{
"id": "msg_1a2b...",
"to": "+212611111111",
"status": "queued"
},
{
"id": "msg_3c4d...",
"to": "+212622222222",
"status": "queued"
}
]
}/v1/messagesإرسال رسالة
يرسل رسالة معاملاتية أو تسويقية عبر الرسائل القصيرة أو واجهة واتساب للأعمال.
curl -X GET "https://api.envoisms.ma/v1/messages?limit=50&offset=0" \
-H "Authorization: Bearer smr_xxx"{
"data": [
{
"id": "msg_8f2d...",
"to": "+212612345678",
"channel": "whatsapp",
"body": "Votre code de validation est 849204",
"sender_id": "MaBanque",
"status": "delivered",
"cost_mad": 0.13,
"created_at": "2026-05-15T10:30:00Z"
}
],
"limit": 50,
"offset": 0,
"total": 1
}/v1/messages/:idالحصول على حالة الرسالة
يسترجع الحالة الحالية وسجلات التسليم لرسالة معينة.
- Statuts possibles : queued, sent, delivered, failed, undeliverable, unconfirmed. "unconfirmed" signifie que l'opérateur n'a jamais confirmé ni infirmé la livraison — un accusé arrivant plus tard peut encore le remplacer.
- Le champ metadata fourni à l'envoi n'est pas renvoyé ici ; il est transmis dans les webhooks.
curl -X GET "https://api.envoisms.ma/v1/messages/:id" \
-H "Authorization: Bearer smr_xxx"{
"id": "msg_8f2d...",
"campaign_id": null,
"to": "+212612345678",
"channel": "sms",
"body": "Votre code de validation est 849204",
"sender_id": "MaBanque",
"unicode": 0,
"segments": 1,
"status": "delivered",
"error_code": null,
"error_message": null,
"cost_eur": 0.0118,
"cost_mad": 0.13,
"scheduled_at": null,
"sent_at": "2026-05-15T10:30:02Z",
"delivered_at": "2026-05-15T10:30:05Z",
"failed_at": null,
"operator": "Maroc Telecom",
"sandbox": 0,
"created_at": "2026-05-15T10:30:00Z"
}/v1/templatesLister les templates
Récupère tous les templates WhatsApp et SMS approuvés de votre compte.
curl -X GET "https://api.envoisms.ma/v1/templates" \
-H "Authorization: Bearer smr_xxx"{
"data": [
{
"id": "tpl_1234...",
"name": "otp_verification",
"channel": "whatsapp",
"body": "Votre code de validation est {{1}}",
"status": "approved",
"category": "otp",
"created_at": "2026-05-15T10:30:00Z"
}
],
"total": 1
}/v1/templatesCréer un template
Soumet un nouveau template pour approbation par les opérateurs ou WhatsApp.
curl -X POST "https://api.envoisms.ma/v1/templates" \
-H "Authorization: Bearer smr_xxx" \
-H "Content-Type: application/json" \
-d '{}'{
"id": "tpl_1234...",
"name": "otp_verification",
"status": "pending"
}/v1/sender-idsLister les Sender IDs
Récupère la liste de vos Sender IDs avec leur statut d'approbation.
curl -X GET "https://api.envoisms.ma/v1/sender-ids" \
-H "Authorization: Bearer smr_xxx"{
"data": [
{
"id": "sid_9a8b...",
"sender_id": "MABANQUE",
"status": "approved",
"requested_at": "2026-05-10T09:00:00Z"
}
]
}/v1/sender-idsDemander un Sender ID
Soumet un nouveau Sender ID pour approbation (requis pour le Maroc).
curl -X POST "https://api.envoisms.ma/v1/sender-ids" \
-H "Authorization: Bearer smr_xxx" \
-H "Content-Type: application/json" \
-d '{}'{
"id": "sid_9a8b...",
"sender_id": "MABANQUE",
"status": "pending"
}/v1/verify/sendإرسال رمز OTP
يرسل رمز تحقق لمرة واحدة. وضعان حسب اختيارك: "whatsapp" — تحقق مُدار، الأبسط والأوفر (تنشئ EnvoiSMS الرمز وتسلّمه عبر واتساب من مرسل موثّق ثم تتحول تلقائياً إلى الرسائل القصيرة إذا لم يتم التأكيد خلال 60 ثانية؛ لا شيء تخزنه من جانبك — يتم تجاهل code_length وexpiry وtemplate في هذا الوضع: الرمز دائماً 6 أرقام وصالح لمدة 5 دقائق) — أو "sms" — تحتفظ بالتحكم الكامل في الرمز والقالب والمرسل. يتم التحقق في الوضعين بنفس استدعاء /v1/verify/check. هل تريد علامتك التجارية الخاصة على الرسالة الاحتياطية للتحقق المُدار؟ متاح عند الطلب: [email protected].
curl -X POST "https://api.envoisms.ma/v1/verify/send" \
-H "Authorization: Bearer smr_xxx" \
-H "Content-Type: application/json" \
-d '{
"to": "+212612345678",
"brand": "MonApp",
"channel": "whatsapp",
"code_length": 6,
"expiry": 600
}'{
"session_id": "vrf_7e2a...",
"to": "+212612345678",
"channel": "whatsapp",
"expires_at": "2026-05-15T10:35:00Z",
"status": "sent",
"cost": { "eur": 0.025, "mad": 0.33 }
}/v1/verify/checkالتحقق من رمز OTP
يتحقق من صحة الرمز الذي أدخله المستخدم لجلسة تحقق معينة.
curl -X POST "https://api.envoisms.ma/v1/verify/check" \
-H "Authorization: Bearer smr_xxx" \
-H "Content-Type: application/json" \
-d '{
"session_id": "vrf_7e2a...",
"code": "849204"
}'{
"session_id": "vrf_7e2a...",
"verified": true,
"verified_at": "2026-05-15T10:35:12Z"
}/v1/verify/:idحالة جلسة OTP
يسترجع حالة (تم التحقق منها أو منتهية الصلاحية) لجلسة تحقق معينة.
curl -X GET "https://api.envoisms.ma/v1/verify/:id" \
-H "Authorization: Bearer smr_xxx"{
"id": "vrf_7e2a...",
"to": "+212612345678",
"channel": "whatsapp",
"expires_at": "2026-05-15T10:40:00Z",
"verified_at": "2026-05-15T10:35:12Z",
"created_at": "2026-05-15T10:30:00Z"
}/v1/verify/lookupالتحقق من الرقم
يتحقق من صحة التنسيق، وشبكة الاتصالات، ونوع الخط، والموقع الجغرافي لرقم الهاتف.
curl -X POST "https://api.envoisms.ma/v1/verify/lookup" \
-H "Authorization: Bearer smr_xxx" \
-H "Content-Type: application/json" \
-d '{
"number": "+212612345678",
"country_code": "MA"
}'{
"valid": true,
"number": "212612345678",
"local_format": "0612345678",
"international_format": "+212612345678",
"country_prefix": "212",
"country_code": "MA",
"country_name": "Morocco",
"location": "Casablanca",
"carrier": "Maroc Telecom (IAM)",
"line_type": "mobile"
}/v1/contactsقائمة جهات الاتصال
يسترجع جهات الاتصال مع إمكانية البحث بكلمة مفتاحية أو التصفية حسب قائمة جهات الاتصال.
curl -X GET "https://api.envoisms.ma/v1/contacts?limit=50&offset=0" \
-H "Authorization: Bearer smr_xxx"{
"data": [
{
"id": "ctc_a2b3...",
"phone": "+212612345678",
"name": "Karim Bennani",
"email": "[email protected]",
"custom1": "VIP",
"custom2": null,
"custom3": null,
"created_at": "2026-05-10T14:20:00Z"
}
],
"limit": 100,
"offset": 0,
"total": 1
}/v1/contactsقائمة جهات الاتصال
يسترجع جهات الاتصال مع إمكانية البحث بكلمة مفتاحية أو التصفية حسب قائمة جهات الاتصال.
curl -X POST "https://api.envoisms.ma/v1/contacts" \
-H "Authorization: Bearer smr_xxx" \
-H "Content-Type: application/json" \
-d '{
"phone": "+212612345678",
"name": "Karim Bennani",
"email": "[email protected]",
"list_id": "lst_f84b..."
}'{
"id": "ctc_a2b3...",
"phone": "+212612345678",
"name": "Karim Bennani",
"email": "[email protected]",
"custom1": "VIP",
"custom2": null,
"custom3": null,
"created_at": "2026-05-10T14:20:00Z"
}/v1/contacts/importImporter des contacts
Importe massivement jusqu'à 5 000 contacts en un seul appel.
curl -X POST "https://api.envoisms.ma/v1/contacts/import" \
-H "Authorization: Bearer smr_xxx" \
-H "Content-Type: application/json" \
-d '{
"contacts": [
{
"phone": "+212611111111",
"name": "Karim"
},
{
"phone": "+212622222222",
"name": "Youssef"
}
],
"list_id": "lst_f84b..."
}'{
"imported": 150,
"skipped": 3
}/v1/contacts/:idSupprimer un contact
Supprime définitivement un contact à partir de son identifiant unique.
curl -X DELETE "https://api.envoisms.ma/v1/contacts/:id" \
-H "Authorization: Bearer smr_xxx"{
"deleted": true,
"id": "ctc_a2b3..."
}/v1/contacts/listsLister les listes
Récupère toutes les listes de contacts créées pour les campagnes de diffusion.
curl -X GET "https://api.envoisms.ma/v1/contacts/lists" \
-H "Authorization: Bearer smr_xxx"{
"data": [
{
"id": "lst_f84b...",
"name": "Newsletter Clients",
"description": "Clients inscrits à notre lettre d'information",
"count": 1420,
"created_at": "2026-04-15T09:00:00Z"
}
]
}/v1/contacts/listsCréer une liste
Crée un nouveau groupe (liste de contacts) vide destiné aux campagnes.
curl -X POST "https://api.envoisms.ma/v1/contacts/lists" \
-H "Authorization: Bearer smr_xxx" \
-H "Content-Type: application/json" \
-d '{
"name": "Newsletter Clients",
"description": "Clients inscrits"
}'{
"id": "lst_f84b...",
"name": "Newsletter Clients",
"description": "Clients inscrits",
"count": 0
}/v1/optoutsLister les désinscriptions
Récupère la liste des numéros qui se sont désinscrits (STOP) de vos communications.
curl -X GET "https://api.envoisms.ma/v1/optouts" \
-H "Authorization: Bearer smr_xxx"{
"data": [
{
"phone": "+212611111111",
"opted_out_at": "2026-06-01T12:00:00Z"
}
],
"total": 1
}/v1/optoutsAjouter une désinscription
Ajoute manuellement un numéro à votre liste de désinscription (blacklist globale).
curl -X POST "https://api.envoisms.ma/v1/optouts" \
-H "Authorization: Bearer smr_xxx" \
-H "Content-Type: application/json" \
-d '{}'{
"success": true,
"phone": "+212611111111",
"opted_out_at": "2026-06-01T12:00:00Z"
}/v1/optouts/:phoneRetirer une désinscription
Retire un numéro de la liste de désinscription.
curl -X DELETE "https://api.envoisms.ma/v1/optouts/:phone" \
-H "Authorization: Bearer smr_xxx"{
"deleted": true,
"phone": "+212611111111"
}/v1/campaignsLister les campagnes
Récupère toutes vos campagnes d'envoi programmé ou de diffusion en cours.
curl -X GET "https://api.envoisms.ma/v1/campaigns" \
-H "Authorization: Bearer smr_xxx"{
"data": [
{
"id": "cmp_8d2a...",
"name": "Soldes d'été 2026",
"channel": "sms",
"list_id": "lst_f84b...",
"template_id": null,
"body": "Bonjour {{name}}, profitez de -50% sur toute la collection avec le code ETE50 !",
"sender_id": "SOLDES",
"status": "draft",
"scheduled_at": null,
"created_at": "2026-06-01T12:00:00Z"
}
]
}/v1/campaignsCréer une campagne
Enregistre une nouvelle campagne en tant que brouillon ou la planifie à une date précise.
curl -X POST "https://api.envoisms.ma/v1/campaigns" \
-H "Authorization: Bearer smr_xxx" \
-H "Content-Type: application/json" \
-d '{
"name": "Soldes d'été 2026",
"body": "Bonjour {{name}}, profitez de -50% avec le code ETE50 !",
"channel": "sms",
"list_id": "lst_f84b...",
"sender_id": "SOLDES"
}'{
"id": "cmp_8d2a...",
"status": "draft"
}/v1/campaigns/:idDétails d'une campagne
Récupère les détails, la planification et le statut d'exécution d'une campagne.
curl -X GET "https://api.envoisms.ma/v1/campaigns/:id" \
-H "Authorization: Bearer smr_xxx"{
"id": "cmp_8d2a...",
"name": "Soldes d'été 2026",
"channel": "sms",
"list_id": "lst_f84b...",
"body": "Bonjour {{name}}, profitez de -50%...",
"sender_id": "SOLDES",
"status": "running",
"total_count": 1420,
"sent_count": 840,
"started_at": "2026-06-15T10:00:00Z",
"created_at": "2026-06-01T12:00:00Z"
}/v1/campaigns/:id/sendLancer une campagne
Démarre immédiatement la diffusion d'une campagne de type brouillon vers tous les contacts associés.
curl -X POST "https://api.envoisms.ma/v1/campaigns/:id/send" \
-H "Authorization: Bearer smr_xxx" \
-H "Content-Type: application/json" \
-d '{}'{
"id": "cmp_8d2a...",
"queued": 1420,
"total": 1420
}/v1/webhooksLister les webhooks
Récupère la liste de tous vos endpoints de webhooks enregistrés.
curl -X GET "https://api.envoisms.ma/v1/webhooks" \
-H "Authorization: Bearer smr_xxx"{
"data": [
{
"id": "whk_5f2b...",
"url": "https://mon-serveur.ma/api/envoisms-receiver",
"events": [
"message.delivered",
"message.failed"
],
"active": true,
"last_triggered_at": "2026-06-15T09:30:15Z",
"last_status": 200,
"created_at": "2026-05-01T10:00:00Z"
}
]
}/v1/webhooksCréer un Webhook
Enregistre une URL HTTPS de callback pour recevoir les notifications d'événements.
curl -X POST "https://api.envoisms.ma/v1/webhooks" \
-H "Authorization: Bearer smr_xxx" \
-H "Content-Type: application/json" \
-d '{
"url": "https://mon-serveur.ma/api/envoisms-receiver",
"events": [
"message.delivered",
"message.failed"
]
}'{
"id": "whk_5f2b...",
"url": "https://mon-serveur.ma/api/envoisms-receiver",
"events": [
"message.delivered",
"message.failed"
],
"secret": "whsec_2f8a9e7d...",
"active": true
}/v1/webhooks/:idModifier un Webhook
Met à jour la configuration d'un webhook (URL, événements surveillés ou état actif).
curl -X PATCH "https://api.envoisms.ma/v1/webhooks/:id" \
-H "Authorization: Bearer smr_xxx" \
-H "Content-Type: application/json" \
-d '{
"url": "https://mon-serveur.ma/api/envoisms-receiver-updated",
"active": false
}'{
"updated": true,
"id": "whk_5f2b..."
}/v1/webhooks/:idSupprimer un Webhook
Désactive et supprime logiquement un endpoint de webhook.
curl -X DELETE "https://api.envoisms.ma/v1/webhooks/:id" \
-H "Authorization: Bearer smr_xxx"{
"deleted": true,
"id": "whk_5f2b..."
}/v1/webhooks/:id/testTester un Webhook
Déclenche un événement de test ("message.test") vers l'URL configurée du webhook.
curl -X POST "https://api.envoisms.ma/v1/webhooks/:id/test" \
-H "Authorization: Bearer smr_xxx" \
-H "Content-Type: application/json" \
-d '{}'{
"queued": true,
"id": "whk_5f2b..."
}/v1/api-keysLister les clés API
Récupère la liste de toutes vos clés d'API actives ou révoquées.
curl -X GET "https://api.envoisms.ma/v1/api-keys" \
-H "Authorization: Bearer smr_xxx"{
"data": [
{
"id": "key_e84c...",
"name": "Production Server",
"key_prefix": "smr_a8f7d6c5",
"sandbox": false,
"ip_whitelist": [
"196.200.1.4"
],
"rate_limit": 100,
"permissions": [
"send",
"verify",
"status"
],
"active": true,
"last_used_at": "2026-06-15T10:30:00Z",
"created_at": "2026-05-01T08:00:00Z"
}
]
}/v1/api-keysCréer une clé API
Génère un nouveau jeton d'API sécurisé avec des permissions et restrictions spécifiques.
curl -X POST "https://api.envoisms.ma/v1/api-keys" \
-H "Authorization: Bearer smr_xxx" \
-H "Content-Type: application/json" \
-d '{
"name": "Production Server",
"permissions": [
"send",
"verify",
"status"
],
"ip_whitelist": [
"196.200.1.4"
],
"rate_limit": 100
}'{
"id": "key_e84c...",
"name": "Production Server",
"key_prefix": "smr_a8f7d6c5",
"api_key": "smr_a8f7d6c5b4a3...",
"sandbox": false,
"permissions": [
"send",
"verify",
"status"
],
"rate_limit": 100,
"warning": "The full API key is shown once. Store it securely."
}/v1/api-keys/:idModifier une clé API
Met à jour les permissions, restrictions IP ou l'état d'activation d'une clé API.
curl -X PATCH "https://api.envoisms.ma/v1/api-keys/:id" \
-H "Authorization: Bearer smr_xxx" \
-H "Content-Type: application/json" \
-d '{
"name": "Backup Server",
"active": true
}'{
"updated": true,
"id": "key_e84c..."
}/v1/api-keys/:idRévoquer une clé API
Révoque définitivement une clé API pour l'empêcher d'authentifier les requêtes.
curl -X DELETE "https://api.envoisms.ma/v1/api-keys/:id" \
-H "Authorization: Bearer smr_xxx"{
"revoked": true,
"id": "key_e84c..."
}/v1/billing/balanceConsulter le solde
Consulte le solde disponible en Dirhams Marocains (MAD) ainsi que la devise et le forfait actif.
curl -X GET "https://api.envoisms.ma/v1/billing/balance" \
-H "Authorization: Bearer smr_xxx"{
"balance_mad": 1492.5,
"currency": "MAD",
"plan": "croissance"
}/v1/analyticsStatistiques d'usage
Récupère des métriques clés sur vos envois (volumes totaux, taux de délivrabilité, et coûts facturés).
curl -X GET "https://api.envoisms.ma/v1/analytics" \
-H "Authorization: Bearer smr_xxx"{
"summary": {
"total": 12840,
"delivered": 12570,
"delivery_rate": 97.9,
"cost_mad": 2663.1
}
}دليل ويب هوكس
تأكيدات تسليم موقعة وآمنة.
يقوم EnvoiSMS.ma بإرسال أحداث JSON إلى عنوان HTTPS الخاص بخادمك مع ترويسة X-EnvoiSMS.ma-Signature للتحقق من المرسل.
message.sentيتم تشغيله عندما يتم قبول الرسالة من بوابتنا وجدولتها للتسليم.
message.deliveredيتم تشغيله عندما يؤكد مشغل الشبكة تسليم الرسالة بنجاح إلى جهاز المستلم.
message.failedيتم تشغيله عند فشل التسليم (رقم غير صالح، منتهي الصلاحية، مرفوض من الشبكة).
message.undeliverableيتم تشغيله عندما تؤكد الشبكة تعذر تسليم الرسالة (رقم غير موجود أو انتهت صلاحيتها في قائمة انتظار المشغل).
message.inboundيتم تشغيله عندما يرسل المستلم رسالة نصية للرد عليك (SMS واردة).
contact.optoutيتم تشغيله عندما يلغي المستلم اشتراكه باستخدام كلمة مرور STOP أو ما يماثلها.
import crypto from 'node:crypto';
// La signature arrive dans le header X-EnvoiSMS-Signature
// (format "sha256=<hex>"), l'événement dans X-EnvoiSMS-Event.
// Corps livré : { "event": "...", "data": { ... }, "timestamp": "..." }
export function verifySignature(body: string, sig: string, secret: string) {
const hmac = crypto.createHmac('sha256', secret)
.update(body)
.digest('hex');
return crypto.timingSafeEqual(Buffer.from(sig), Buffer.from('sha256=' + hmac));
} OpenAPI Spec الأخطاء
هيكل استجابات أخطاء واجهة البرمجة (API).
ترجع جميع أخطاء واجهة برمجة التطبيقات رمز استجابة HTTP مناسبًا (4xx أو 5xx) بالإضافة إلى ترويسة JSON متوقعة تحتوي على رمز الخطأ ووصفه.
{
"error": {
"code": "INVALID_PHONE",
"message": "to must be E.164 format, for example +212612345678",
"docs": "https://envoisms.ma/docs#errors"
}
}UNAUTHORIZEDمفتاح واجهة البرمجة مفقود أو غير صالح. تحقق من رمز Bearer في الترويسات.
INSUFFICIENT_BALANCEرصيد حسابك منخفض جداً لإتمام عملية الإرسال هذه.
INVALID_PHONEتنسيق رقم المستلم غير صالح. استخدم صيغة E.164 القياسية.
RATE_LIMITEDLimite de requêtes par minute dépassée.
CHANNEL_NOT_ALLOWEDLe canal demandé (ex: WhatsApp) n'est pas activé sur votre compte.
SENDER_ID_TOO_LONGLe Sender ID dépasse la limite de 11 caractères.
SENDER_ID_INVALIDLe Sender ID contient des caractères non autorisés.
SENDER_ID_NOT_APPROVEDLe Sender ID n'a pas encore été approuvé par les opérateurs.
SENDER_ID_PENDINGLe Sender ID est en cours d'approbation.
SENDER_ID_REJECTEDLe Sender ID a été rejeté par les opérateurs.
MISSING_FIELDUn champ obligatoire est manquant dans la requête.
CASCADE_TIMEOUTLe premier canal a expiré, basculement vers le canal secondaire (cascade).
UPSTREAM_ERRORErreur de livraison au niveau de l'opérateur ou de la passerelle.
OPTED_OUTLe numéro a refusé vos communications (STOP). Envoi interdit.
SPAM_OR_PHISHING_DETECTEDتحتوي الرسالة على رابط مصنّف كتصيّد احتيالي أو رسالة مزعجة. تم رفض الإرسال.
CONTENT_BLOCKEDتم حظر محتوى الرسالة بواسطة نظام مكافحة إساءة الاستخدام وتم تعليق الحساب في انتظار المراجعة. يرجى التواصل مع الدعم.
INVALID_CODEرمز التحقق المُدخل غير صحيح. تشير رسالة الخطأ إلى عدد المحاولات المتبقية.
EXPIRED_CODEانتهت صلاحية رمز التحقق. اطلب رمزاً جديداً عبر /v1/verify/send.
MAX_ATTEMPTSتم تجاوز الحد الأقصى لمحاولات التحقق. أُغلقت الجلسة.
الحدود والقيود
الحدود والكوتا في بيئة الإنتاج.
100 طلب / دقيقة (قابل للتوسيع عند الطلب).
1600 حرف كحد أقصى لكل رسالة.
حتى 10,000 رسالة لكل طلب واجهة برمجة.
90 يوماً للتقارير المفصلة.