تخطَّ إلى المحتوى
MessageHub

للمطورين

توثيق API

كل ما تحتاجه لربط نظامك بـMessageHub: المصادقة، رموز OTP، رسائل القوالب، الرصيد، والإشعارات.

العنوان الأساسي

كل الطلبات بصيغة JSON عبر HTTPS إلى العنوان التالي:

https://api.message-hub.cloud/api/v1

المصادقة

كل طلب يحمل مفتاحك في الترويسة Authorization. تجد المفتاح في لوحة التحكم، ويظهر مرة واحدة فقط عند إنشائه، فاحفظه في مكان آمن ولا تضعه في كود يصل إلى المتصفح أو التطبيق.

Authorization: Bearer mh_live_xxxxxxxxxxxxxxxxxxxxxxxx

أرقام الهواتف تُقبل بالصيغة المحلية (07701234567) أو الدولية (9647701234567).

المسارات

الطريقةالمسارالوصف
POST/otp/sendإرسال رمز OTP إلى رقم واتساب
POST/otp/verifyالتحقق من رمز أدخله المستخدم
GET/otp/{id}حالة رمز OTP
POST/messagesإرسال رسالة قالب أو نص
GET/messagesقائمة رسائلك (status، to، per_page)
GET/messages/{id}حالة رسالة واحدة
GET/accountالرصيد والأسعار ورقم الإرسال

إرسال رمز OTP

نولّد الرمز ونرسله بقالب التحقق المعتمد. احتفظ بid لاستخدامه في التحقق.

الحقلالوصف
phoneإلزاميرقم الزبون.
lengthاختياريطول الرمز من 4 إلى 10 (الافتراضي 6).
expires_inاختياريمدة الصلاحية بالدقائق من 1 إلى 60 (الافتراضي 5).
codeاختياريرمزك الخاص (4–10 أرقام) إن أردت توليده بنفسك.
referenceاختياريمعرّفك للطلب (حتى 100 حرف) — يجعل إعادة المحاولة آمنة.
الطلب
curl -X POST https://api.message-hub.cloud/api/v1/otp/send \
  -H "Authorization: Bearer $MESSAGEHUB_KEY" \
  -H "Content-Type: application/json" \
  -d '{"phone": "07701234567", "length": 6, "expires_in": 5, "reference": "login-123"}'
الاستجابة
201 Created
{
  "data": {
    "id": "9d3c8f2e-…",
    "phone": "9647701234567",
    "status": "pending",
    "expires_at": "2026-11-05T21:35:00+03:00",
    "message": { "id": "…", "status": "sent", "cost": …, "currency": "IQD" }
  },
  "balance": …
}

التحقق من الرمز

أرسل id (أو الرقم) مع الرمز الذي أدخله المستخدم. الرد 200 عند الصحة و422 مع السبب عند الخطأ.

الطلب
curl -X POST https://api.message-hub.cloud/api/v1/otp/verify \
  -H "Authorization: Bearer $MESSAGEHUB_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id": "9d3c8f2e-…", "code": "482913"}'
الاستجابة
200 OK
{ "data": { "valid": true, "reason": null, "otp": { … } } }

422 Unprocessable Entity
{ "data": { "valid": false, "reason": "invalid_code", "otp": { … } } }

أسباب الرفض: invalid_code (رمز خاطئ)، expired (انتهت صلاحيته)، too_many_attempts (محاولات كثيرة)، already_verified (تم التحقق منه سابقاً).

GET /otp/{id}
curl https://api.message-hub.cloud/api/v1/otp/9d3c8f2e-… \
  -H "Authorization: Bearer $MESSAGEHUB_KEY"

رسائل القوالب

أرسل إشعاراً بقالب واتساب معتمد مع متغيراته. الفئة utility للإشعارات وmarketing للتسويق.

الطلب
curl -X POST https://api.message-hub.cloud/api/v1/messages \
  -H "Authorization: Bearer $MESSAGEHUB_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "07701234567",
    "template": "order_update",
    "language": "ar",
    "variables": ["1045", "غداً"],
    "category": "utility",
    "reference": "order-1045-shipped"
  }'
curl https://api.message-hub.cloud/api/v1/messages/{id} -H "Authorization: Bearer $MESSAGEHUB_KEY"
curl "https://api.message-hub.cloud/api/v1/messages?status=delivered&per_page=50" -H "Authorization: Bearer $MESSAGEHUB_KEY"

حالات الرسالة: queued (بالانتظار)، sent (أُرسلت)، delivered (وصلت)، read (قُرئت)، failed (فشلت).

الرصيد والأسعار

يعيد اسم حسابك ورصيدك بالدينار وأسعار كل فئة ورقم الإرسال.

curl https://api.message-hub.cloud/api/v1/account -H "Authorization: Bearer $MESSAGEHUB_KEY"

{
  "data": {
    "name": "…",
    "balance": …,
    "currency": "IQD",
    "prices": { … },
    "sender": { "phone_number": "…", "display_name": "…", "shared": true }
  }
}

إعادة المحاولة الآمنة (reference)

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

الرصيد والاسترداد

  • رصيد غير كافٍ ← 402 insufficient_balance ولا يُرسل شيء.
  • رفضت Meta الرسالة ← 502 send_failed ويعود المبلغ إلى رصيدك فوراً. وإن أبلغت Meta بفشلها لاحقاً يعود المبلغ أيضاً.
402 Payment Required
{ "message": "Insufficient balance.", "code": "insufficient_balance" }

إشعارات الحالة (Webhook)

عند تغيّر حالة رسالة نرسل طلب POST إلى رابط Webhook الذي تضبطه في لوحة التحكم.

POST https://your-app.example/webhooks/messagehub
Content-Type: application/json
X-MessageHub-Signature: sha256=<hex hmac_sha256(raw_body, webhook_secret)>

{
  "event": "message.status",
  "data": {
    "id": "…",
    "reference": "login-123",
    "to": "9647701234567",
    "status": "delivered",
    "category": "authentication",
    "cost": …,
    "refunded": false,
    "error": null,
    "updated_at": "2026-11-05T21:31:04+03:00"
  }
}

كل طلب يحمل الترويسة X-MessageHub-Signature وقيمتها sha256= متبوعة بـHMAC-SHA256 للجسم الخام بسرّ Webhook الخاص بك. احسب التوقيع وقارنه بمقارنة ثابتة الزمن قبل الوثوق بالطلب.

التحقق من التوقيع
import { createHmac, timingSafeEqual } from 'node:crypto'

function isValid(rawBody, header, secret) {
  const expected = 'sha256=' + createHmac('sha256', secret).update(rawBody).digest('hex')
  const a = Buffer.from(expected)
  const b = Buffer.from(header ?? '')
  return a.length === b.length && timingSafeEqual(a, b)
}

رموز الأخطاء

كل خطأ يعود بـJSON يحتوي message و code.

401invalid_api_keyالمفتاح مفقود أو غير صحيح.
403account_suspendedالحساب موقوف.
403ability_missingالمفتاح لا يملك صلاحية هذا المسار (otp أو messages).
403ip_not_allowedعنوان IP غير مسموح لهذا المفتاح.
402insufficient_balanceالرصيد لا يكفي؛ لم يُرسل شيء.
422validationبيانات الطلب غير صحيحة.
429rate_limitedطلبات كثيرة؛ أعد المحاولة بعد قليل.
502send_failedرفضت Meta الرسالة والمبلغ عاد إلى رصيدك.
503no_sender · no_otp_templateلا يوجد رقم إرسال أو قالب OTP مفعّل بعد.