انتقل إلى المحتوى

واجهة API لبوابة المراسلة

واجهة API واحدة لكل قنوات المراسلة

أرسل رسائل WhatsApp Business و SMS و Telegram و Messenger و Instagram و TikTok عبر نقطة REST واحدة. دفع مسبق، وفوترة لكل رسالة صادرة، مع إشعارات Webhook بحالة التسليم ووضع للاختبار.

يبدأ من
⁦$0.0003⁩
لكل رسالة صادرة
عند التسجيل
100
رسالة مجانية
الالتزام
لا يوجد
دفع مسبق، بلا عقد
curl https://api.omnimessage.co/v1/messages \
  -H "Authorization: Bearer om_live_..." \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: order-1042-shipped" \
  -d '{
    "channel": "ch_7Hq2mN5vB8cX1zL0pK3j",
    "to": "+971501234567",
    "type": "text",
    "text": { "body": "Your order #1042 has shipped." },
    "reference": "order-1042"
  }'
202 Accepted
{
  "id": "msg_2b1Xw9aQ3rT8yU0pL4kZ",
  "object": "message",
  "mode": "live",
  "channel_id": "ch_7Hq2mN5vB8cX1zL0pK3j",
  "channel_type": "whatsapp",
  "direction": "outbound",
  "to": "+971501234567",
  "from": "+971800123456",
  "type": "text",
  "content": {
    "text": { "body": "Your order #1042 has shipped." }
  },
  "status": "queued",
  "error": null,
  "reference": "order-1042",
  "metadata": {},
  "billing": {
    "source": "wallet",
    "amount_micros": 1000,
    "package_grant_id": null,
    "refunded": false
  },
  "created_at": "2026-10-05T09:30:00.000Z",
  "sent_at": null,
  "delivered_at": null,
  "read_at": null,
  "failed_at": null
}
  • أنواع القنوات7 خلف نقطة نهاية واحدة
  • أنواع الرسائل9، من النص إلى القوائم التفاعلية
  • السعر يبدأ من⁦$0.0003⁩ لكل رسالة صادرة
  • حد المعدّل100 طلب في الثانية لكل مفتاح
  • حجم الدفعةحتى 100 رسالة في الطلب الواحد
  • إعادة محاولات Webhook8 محاولات، بفواصل متزايدة من 30 ثانية إلى 24 ساعة
  • نافذة منع التكرار24 ساعة
  • وضع الاختبارمجاني، ولا يتطلب قناة
  • الرسائل الفاشلةتُستردّ قيمتها تلقائيًا
  • الرسائل الواردةمجانية

القنوات

سبعة أنواع من القنوات بصيغة طلب واحدة

اربط جهات الإرسال التي تملكها أصلًا. تصبح كل واحدة منها معرّف قناة تمرّره إلى نقطة النهاية نفسها، وتعيد إليك الحالات نفسها.

كيف يعمل

من التسجيل إلى رسالة مُسلَّمة في أربع خطوات

لا مكالمات مبيعات ولا حد أدنى للالتزام. يمكنك تنفيذ أول استدعاء للـ API في وضع الاختبار بعد دقيقة من إنشاء الحساب.

  1. الخطوة 01

    أنشئ حسابًا

    سجّل، وأكّد بريدك الإلكتروني، وأنشئ مفتاح API من لوحة التحكم. مفاتيح الاختبار تعمل فورًا، قبل ربط أي قناة.

  2. الخطوة 02

    اربط قناة

    سجّل الدخول عبر Facebook أو TikTok من لوحة التحكم لربط رقم WhatsApp أو صفحة أو حساب أعمال. وأضف روبوت Telegram أو رقم Twilio ببيانات اعتماده، من لوحة التحكم أو عبر POST /v1/channels.

  3. الخطوة 03

    أرسل عبر نقطة نهاية واحدة

    يستقبل POST /v1/messages معرّف القناة والمستلم وكائن محتوى بحسب النوع. صيغة الطلب واحدة في كل القنوات.

  4. الخطوة 04

    تتبّع كل عملية تسليم

    تُبلغك إشعارات Webhook الموقّعة بحالات الإرسال والتسليم والقراءة والفشل. والسجل نفسه متاح في لوحة التحكم وعبر GET /v1/messages.

أنواع الرسائل

ما ترسله هو ما يراه المستلم

لكل رسالة نوع وكائن محتوى تحت مفتاح يحمل اسم ذلك النوع. اختر نوعًا لترى نص الطلب بجانب الرسالة التي ينتجها.

POST /v1/messages
{
  "channel": "ch_7Hq2mN5vB8cX1zL0pK3j",
  "to": "+971501234567",
  "type": "text",
  "text": {
    "body": "تم شحن طلبك رقم #1042. تتبّعه عبر https://example.com/t/1042",
    "preview_url": true
  },
  "reference": "order-1042"
}

نص عادي تقبله كل أنواع القنوات. فعّل preview_url لتعرض القناة معاينة للرابط.

القنواتWhatsApp Business وSMS وSMS OTP وTelegram وMessenger وInstagram وTikTok

لوحة التحكم

لوحة تحكم لكل ما لا يُكتب بالكود

أنشئ المفاتيح، واربط القنوات، وابحث في سجل الرسائل، وأعد إرسال إشعارات Webhook، وأدِر الفوترة. كل ما تعرضه لوحة التحكم متاح أيضًا عبر الـ API.

نظرة عامة. رصيد المحفظة، وأرصدة الباقات المتبقية، وحجم الرسائل الصادرة خلال آخر 30 يومًا، لكل حساب ولكل وضع. الإطارات في هذه الصفحة مرسومة ببيانات نموذجية.
سجل الرسائل. صفِّ النتائج حسب القناة أو الحالة أو المستلم أو مرجعك الخاص، وافتح أي رسالة لترى سجل حالاتها وما خُصم مقابلها.
الفوترة. اشحن المحفظة، واشترِ الباقات، واضبط الشحن التلقائي، ونزّل الإيصالات. تُظهر أرصدة الباقات المتبقي منها وموعد انتهائها.

الأسعار

ادفع بالرسالة، أو اشترِ الرسائل بالجملة

اشحن محفظة مسبقة الدفع بمبلغ يبدأ من ⁦$10⁩ وادفع سعر الرسالة في كل قناة، أو اشترِ باقة من أرصدة الرسائل للأحجام الكبيرة على قنواتك الأعلى سعرًا.

10 ألف رسالة

⁦$8⁩

⁦$0.0008⁩ للرسالة

  • 10,000 رسالة صادرة
  • صالحة لمدة 3 أشهر من تاريخ الشراء
  • صالحة لكل أنواع القنوات
ابدأ بباقة 10 ألف

100 ألف رسالة

مميّزة

⁦$60⁩

⁦$0.0006⁩ للرسالة

  • 100,000 رسالة صادرة
  • صالحة لمدة 6 أشهر من تاريخ الشراء
  • صالحة لكل أنواع القنوات
ابدأ بباقة 100 ألف

1 مليون رسالة

⁦$400⁩

⁦$0.0004⁩ للرسالة

  • 1,000,000 رسالة صادرة
  • صالحة لمدة 12 شهرًا من تاريخ الشراء
  • صالحة لكل أنواع القنوات
ابدأ بباقة 1 مليون

الدفع حسب الاستخدام

سعر الدفع حسب الاستخدام لكل رسالة صادرة حسب نوع القناة، بالدولار الأمريكي
القناةللرسالة
WhatsApp Business⁦$0.001⁩
Telegram⁦$0.0003⁩
SMS⁦$0.0005⁩
SMS OTP⁦$0.0005⁩
Messenger⁦$0.0005⁩
Instagram⁦$0.0005⁩
TikTok⁦$0.0005⁩

ما الذي يغطيه السعر

  • يُحتسبالرسائل الصادرة التي يقبلها الـ API، لحظة قبولها.
  • مجانيالرسائل الواردة، ورسائل وضع الاختبار، وإشعارات Webhook، ولوحة التحكم.
  • يُستردّأي رسالة تنتهي بالفشل، إلى الباقة أو المحفظة التي خُصمت منها.
  • منفصلالرسوم التي تفرضها Meta أو شركات الاتصالات أو المزوّدون الآخرون على القناة نفسها.

تجربة المطوّر

صُمّم ليُدمج مرة واحدة ثم يعمل دون متابعة

إشعارات Webhook موقّعة، وإعادة محاولة آمنة، وبيئة اختبار تتصرف كبيئة الإنتاج، وأخطاء يمكنك بناء منطقك عليها.

إشعارات Webhook يمكنك التحقق منها

كل إشعار موقّع بخوارزمية HMAC-SHA256 على الطابع الزمني ونص الطلب الخام، في الترويسة OmniMessage-Signature. أجب بأي رمز 2xx خلال 10 ثوانٍ. تُعاد محاولة الإشعارات الفاشلة ثماني مرات بفواصل متزايدة، من 30 ثانية حتى 24 ساعة.

verify-signature.js
import { createHmac, timingSafeEqual } from 'node:crypto';

// header is "t=<unix seconds>,v1=<hex hmac-sha256>"
export function verifySignature(rawBody, header, secret) {
  const parts = header.split(',').map((part) => part.split('='));
  const { t, v1 = '' } = Object.fromEntries(parts);

  const expected = createHmac('sha256', secret)
    .update(`${t}.${rawBody}`)
    .digest('hex');

  const fresh = Math.abs(Date.now() / 1000 - Number(t)) < 300;
  const matches =
    v1.length === expected.length &&
    timingSafeEqual(Buffer.from(v1), Buffer.from(expected));

  return fresh && matches;
}
حدث message.delivered
{
  "id": "evt_8Kd2pQ7wN4xB1zR6mT3c",
  "object": "event",
  "type": "message.delivered",
  "mode": "live",
  "created_at": "2026-10-05T09:30:02.900Z",
  "data": {
    "object": {
      "id": "msg_2b1Xw9aQ3rT8yU0pL4kZ",
      "object": "message",
      "status": "delivered",
      "reference": "order-1042",
      "delivered_at": "2026-10-05T09:30:02.871Z"
    }
  }
}

وضع اختبار لا يكلّف شيئًا

تستخدم مفاتيح الاختبار قنوات تجريبية جاهزة، فلا حاجة لربط أي شيء. تحدد الأرقام الأخيرة من رقم المستلم النتيجة المُحاكاة، وتُطلق إشعارات Webhook كما في بيئة الإنتاج.

طلب تجريبي ينتهي بحالة «مقروءة»
curl https://api.omnimessage.co/v1/messages \
  -H "Authorization: Bearer om_test_..." \
  -H "Content-Type: application/json" \
  -d '{
    "channel": "ch_test_whatsapp",
    "to": "+971501230002",
    "type": "text",
    "text": { "body": "Hello from the sandbox" }
  }'

أخطاء لها نوع ورمز

لكل استجابة غير 2xx البنية نفسها: type لفئة الخطأ، وcode ثابت تبني عليه منطقك، وparam للمعامل المسبّب إن وُجد، وrequest_id لفريق الدعم.

402 Payment Required
{
  "error": {
    "type": "billing_error",
    "code": "insufficient_balance",
    "message": "Not enough wallet balance or package credits.",
    "request_id": "req_5Vn1cH8jL3qW6yD9sF2k",
    "doc_url": "https://omnimessage.co/docs/errors#insufficient_balance"
  }
}
  • طلبات POST آمنة التكرار

    أرسل الترويسة Idempotency-Key، وأي إعادة محاولة خلال 24 ساعة تعيد الاستجابة المحفوظة مع Idempotent-Replayed: true، دون إرسال أو خصم مرتين.

  • حدود يمكن توقّعها

    100 طلب في الثانية لكل مفتاح على POST /v1/messages، و20 على ما سواه. تحمل كل استجابة RateLimit-Remaining، وتحمل الاستجابة 429 الترويسة Retry-After.

  • الإرسال على دفعات

    يقبل POST /v1/messages/batch حتى 100 رسالة. كل عنصر يُقبل أو يُرفض ويُحتسب مستقلًا، وتُبلغك الاستجابة 207 بالنتائج حسب الترتيب.

  • مفاتيح محدّدة النطاق

    امنح كل مفتاح النطاقات التي يحتاجها فقط، مثل messages:write أو billing:read، واحصره في قائمة عناوين IP مسموح بها.

أسئلة

قبل أن تبدأ الدمج

الإجابات المختصرة هنا. والمفصّلة في المستندات.

هل أحتاج إلى رقم WhatsApp أو روبوت أو رقم SMS خاص بي؟

نعم. OmniMessage بوابة تعمل بقنواتك أنت: تربط رقمك على WhatsApp Cloud API أو روبوت Telegram أو رقم Twilio أو حسابك على منصات التواصل، وتحتفظ بملكيته. تعرض صفحة القنوات متطلبات كل نوع.

على ماذا أُحاسَب تحديدًا؟

خصم واحد لكل رسالة صادرة يقبلها الـ API: رصيد من الباقة إن كانت لديك باقة، وإلا فسعر الرسالة لنوع القناة من محفظتك. الرسائل الواردة ورسائل وضع الاختبار مجانية، والرسالة التي تنتهي بالفشل تُستردّ قيمتها تلقائيًا.

هل تشمل الأسعار رسوم Meta أو شركات الاتصالات أو المزوّدين؟

لا. رسوم البوابة تغطي الـ API وتتبّع التسليم وإشعارات Webhook ولوحة التحكم. أما الرسوم التي تفرضها Meta أو Twilio أو أي مزوّد آخر على القناة نفسها فتبقى بينك وبين ذلك المزوّد.

كيف أختبر دون إرسال رسائل حقيقية؟

استخدم مفتاحًا يبدأ بـ om_test_. لكل حساب قناة تجريبية لكل نوع، مثل ch_test_whatsapp. لا يُسلَّم شيء ولا يُحتسب شيء، والحالات مُحاكاة: المستلم الذي ينتهي رقمه بـ 0000 تفشل رسالته، و0001 تبقى في حالة «أُرسلت»، و0002 تُقرأ أيضًا، وما عدا ذلك يُسلَّم خلال ثانيتين تقريبًا.

ماذا يحدث عند نفاد رصيدي؟

يجيب الـ API بـ 402 insufficient_balance ولا يُدرج شيء في قائمة الانتظار، فلا تترتب عليك مبالغ لاحقًا. يمكنك الاشتراك في الحدث balance.low أو تفعيل الشحن التلقائي لشحن المحفظة عند نزولها عن حد تختاره.

هل أحتاج إلى SDK؟

لا. الـ API يعتمد JSON عبر HTTPS مع مصادقة Bearer، فأي عميل HTTP يفي بالغرض. تتضمن المستندات أمثلة بـ cURL و Node و Python و PHP.

أرسل رسالتك الأولى في وضع الاختبار اليوم

أنشئ حسابًا، وانسخ مفتاح اختبار، واستدعِ الـ API قبل أن تربط أي قناة. يبدأ كل حساب جديد بـ100 رسالة مجانية.