الإصدار 1 · REST + Webhooks

توثيق المطوّرين

ابنِ تطبيقات العملاء والسائقين والتجّار على واجهة API واحدة. اقرأ واكتب المطاعم والقوائم والطلبات والسائقين؛ واستقبل الأحداث الفورية عبر webhooks موقّعة. كل شيء مقيّد بنطاق مالك الرمز.

🛍️ تطبيق العميل 🛵 تطبيق السائق 🧑‍🍳 تطبيق التاجر

تبني للسوق؟ توثيق مطوّري التطبيقات →  ·  توثيق مطوّري القوالب →

جديد خادمنا خادم Dev MCP يحوّل أي أداة ذكاء اصطناعي داعمة لـ MCP إلى خبير في المنصّة. learn_platform يهيّئه، get_liquid_reference يمنحه القائمة البيضاء المعتمدة، و validate_theme يشغّل فحوص السوق نفسها على مُخرجاته — دورة التعلّم → البناء → التحقّق الكاملة دون مغادرة محرّرك. اتّصل بأمر واحد →

البدء

أنشئ رمز API من لوحة التحكم ضمن رموز API و Webhooks. اختر read و/أو write الصلاحيات وانسخ الرمز — يُعرض مرّة واحدة فقط.

الرابط الأساسي: https://www.menubarcode.com/api/v1

فحص سريع للتأكّد من عمل رمزك:

curl https://www.menubarcode.com/api/v1/restaurants \
  -H "Authorization: Bearer YOUR_TOKEN"
الجذر GET https://www.menubarcode.com/api/v1 يُعيد فهرسًا قابلًا للقراءة آليًا بنقاط النهاية المتاحة (دون الحاجة إلى مصادقة). قابل للقراءة آليًا مواصفات OpenAPI 3.1 (JSON) — مُولَّدة من الموجّه الحيّ، لذا تتطابق دائمًا مع واجهة API المنشورة.

المصادقة

أرسل رمزك كترويسة Bearer مع كل طلب:

Authorization: Bearer YOUR_TOKEN

للاختبارات السريعة يمكنك بدلًا من ذلك تمرير ?api_token=YOUR_TOKEN كمعامل استعلام، لكن يُفضّل بشدّة استخدام الترويسة كي لا تتسرّب الرموز إلى السجلّات.

الصلاحيةيمنح
readالكل GET نقاط النهاية (كل مورد).
writeجميع نقاط النهاية المعدِّلة (وبما أنها مجموعة شاملة، فكل عمليات القراءة أيضًا).

الرموز المحدّدة النطاق

إلى جانب صلاحيتي read/write, يمكن قصر الرمز على موارد محدّدة باستخدام resource:action الصلاحيات. الموارد: restaurants, menu, orders, customers, analytics, drivers, webhooks; الإجراءات read, write. اخترها عند إنشاء الرمز في لوحة التحكم.

مثال على الرمزما يمكنه فعله
["orders:write"]قراءة وكتابة الطلبات فقط (تكامل نقطة بيع).
["menu:read"]قراءة القائمة؛ لا شيء غير ذلك.
["orders:read","analytics:read"]لوحة تقارير.

قواعد التغطية: * يمنح كل شيء؛ :write كما يمنح نطاق :read; صلاحيتا read/write تتصرّفان مثل *:read / *:write. الطلب الذي يفتقر إلى النطاق المطلوب يُعيد 403. الرموز القديمة read/write غير متأثّرة.

تُخزَّن الرموز مُجزّأة أثناء السكون (SHA-256) وقد تحمل تاريخ انتهاء اختياريًا. ألغِ أي رمز فورًا من لوحة التحكم.

حدود المعدل

تسمح واجهة API بـ 120 طلبًا في الدقيقة لكل رمز. تجاوزه يُعيد 429 Too Many Requests مع Retry-After الترويسة. تُضمَّن ترويسات حدود المعدّل القياسية في كل استجابة:

X-RateLimit-Limit: 120
X-RateLimit-Remaining: 118

الأخطاء

كل خطأ على مسار /api/v1 يُعيد رموز حالة HTTP التقليدية وغلافًا واحدًا من JSON — رسالة بشرية message, ، ورمزًا آليًا ثابتًا code, ، و(عند التحقّق) لكل حقل errors الخريطة

{ "message": "Invalid or expired token.", "code": "unauthenticated" }

{ "message": "The given data was invalid.",
  "code": "validation_failed",
  "errors": { "title": ["The title field is required."] } }
الحالةcodeالمعنى
401unauthenticatedرمز مفقود أو غير صالح أو منتهي الصلاحية.
403forbiddenالرمز يفتقر إلى الصلاحية/النطاق المطلوب.
404not_foundالمورد غير موجود أو غير مملوك للرمز.
422validation_failedفشل التحقّق (انظر errors).
429rate_limitedتم تجاوز حدّ المعدّل.
حلّل الرمز الآلي code, وليس الرسالة البشرية message — قد تُعاد صياغة الرسائل أو تُترجم؛ أمّا الرموز فثابتة.
طلب مورد لا تملكه يُعيد 404, وليس 403 — فواجهة API لا تؤكّد أبدًا وجود بيانات مالك آخر.

ترقيم الصفحات

تُعيد نقاط نهاية القوائم أغلفة مرقّمة بأسلوب Laravel. استخدم ?page= معامل الاستعلام للتنقّل بين الصفحات.

{
  "data": [ ... ],
  "current_page": 1,
  "last_page": 3,
  "per_page": 20,
  "total": 47
}

قراءة المطاعم والقائمة

GET /restaurants

اسرد المطاعم المملوكة للرمز، مع ترقيم الصفحات (20 لكل صفحة).

{
  "data": [
    { "id": 12, "title": "Nova Bistro", "slug": "nova-bistro",
      "url": "https://.../nova-bistro", "template": "linen",
      "created_at": "2026-06-01T10:22:00+00:00" }
  ],
  "current_page": 1, "last_page": 1, "total": 1
}
GET /restaurants/{id}

مطعم واحد مع فئات قائمته وعدد عناصره.

GET /restaurants/{id}/menu

القائمة النشطة الكاملة مجمّعة حسب الفئة.

[
  { "id": 3, "name": "Starters",
    "items": [
      { "id": 88, "name": "Bruschetta", "price": 6.50,
        "is_sold_out": false, "is_popular": true, "is_vegan": true,
        "is_halal": true, "calories": 210 }
    ]
  }
]

الطلبات

GET /restaurants/{id}/orders

الطلبات من الأحدث أولًا، مع الترقيم (30/صفحة). صفِّ باستخدام ?status=.

GET /restaurants/{id}/orders/{orderId}

تفاصيل الطلب الكاملة مع بنود الطلب والإضافات والسائق والجدول الزمني للتوصيل.

POST /restaurants/{id}/orders اكتب

أنشئ طلبًا — هكذا يقوم تطبيق العميل بإرسال سلّة (الواجهة الخلفية للتاجر تحتفظ بالرمز). يُتحقَّق من كل عنصر مقابل قائمة المطعم الحيّة؛ العناصر المنتهية أو الغريبة ترفض الطلب بأكمله (422). يُطلق order.created ويُعيد الطلب الكامل بما في ذلك track_token.

curl -X POST https://www.menubarcode.com/api/v1/restaurants/12/orders \
  -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "delivery",
    "customer_name": "A. Idriss",
    "phone": "+15551234567",
    "address": "9 Cedar Road",
    "tip_amount": 3.00,
    "note": "Ring the bell",
    "source": "customer_app",
    "items": [
      { "item_id": 88, "quantity": 2, "variation": 5, "extras": [12], "note": "no onion" },
      { "item_id": 91, "quantity": 1 }
    ]
  }'

الطلب type هو أحد من on-table, takeaway, delivery. لـ on-table مرّر table_number; لـ delivery مرّر address.

الحياد التكراري (Idempotency). أرسل Idempotency-Key ترويسة (أو في الجسم client_uuid) في أي استدعاء لإنشاء طلب. إعادة المحاولة بالمفتاح نفسه تُعيد الطلب الأصلي ولا تنشئ نسخة مكرّرة أبدًا — آمن للاستجابات المفقودة وإعادة التشغيل دون اتصال. المفاتيح مقيّدة لكل مطعم.

PUT /restaurants/{id}/orders/{orderId}/status اكتب

حدّث حالة المطبخ (new|preparing|ready|delivered|completed|cancelled). يُطلق order.status_changed.

واجهة API للمتجر (رمز لكل مطعم)

واجهة API منفصلة وعامة تُصادَق عبر رمز متجر لكل مطعم يُرسَل كـ X-Storefront-Token (وليس رمز Bearer الخاص بالمالك). أصدرها من لوحة التحكم؛ كل رمز يمكنه الوصول إلى مطعمه فقط. نطاق القراءة هو menu:read; وإرسال الطلبات يتطلّب order:write النطاق

GET /storefront/menu

القائمة الكاملة لمطعم الرمز (المتغيّرات، الإضافات، المجموعات، المعرض).

GET /storefront/restaurant

معلومات أساسية عن مطعم الرمز.

POST /storefront/orders order:write

أرسل سلّة نيابةً عن أحد الزبائن. مُسعّرة من الخادم و غير مدفوع (يدفع الزبون عند الوصول)؛ takeaway أو on-table فقط. يُتحقَّق من كل عنصر مقابل القائمة الحيّة — العناصر المنتهية أو الغريبة ترفض الطلب بأكمله (422). الحدود: 40 عنصرًا/طلب، 30 كمية/بند. اختياري coupon_code يطبّق خصم المالك من جهة الخادم. يُطلق order.created ويُعيد track_token + continue_url.

curl -X POST https://www.menubarcode.com/api/v1/storefront/orders \
  -H "X-Storefront-Token: YOUR_STOREFRONT_TOKEN" -H "Content-Type: application/json" \
  -d '{
    "type": "takeaway",
    "customer_name": "A. Idriss",
    "phone": "+15551234567",
    "coupon_code": "WELCOME10",
    "items": [
      { "item_id": 88, "quantity": 2, "variation": 5, "extras": [12] },
      { "item_id": 91, "quantity": 1 }
    ]
  }'

التحليلات والعملاء

GET /restaurants/{id}/analytics

ملخّص المبيعات خلال نطاق زمني (?from=YYYY-MM-DD&to=YYYY-MM-DD, افتراضيًا آخر 30 يومًا): أعداد الطلبات حسب الحالة/النوع، والإيرادات الإجمالية والمدفوعة، ومتوسّط قيمة الطلب، وأبرز العناصر.

{
  "range": { "from": "2026-06-02", "to": "2026-07-02" },
  "orders": { "total": 214, "paid": 198, "by_status": {...}, "by_type": {...} },
  "revenue": { "gross": 8420.50, "paid": 7990.00, "avg_order_value": 39.35 },
  "top_items": [ { "item_id": 88, "name": "Margherita", "quantity": 143 } ]
}
GET /restaurants/{id}/customers

قائمة عملاء المطعم (CRM)، مرقّمة الصفحات. صفِّ باستخدام ?search=.

إدارة السائقين اكتب

السائقون تابعون لك و(اختياريًا) لمطعم واحد. إنشاء سائق أو تدوير رمزه يُعيد رمز سائق خامًا مرّة واحدة تمامًا — سلّمه لتطبيق السائق؛ يُصادِق به (انظر أدناه).

GET /drivers
POST /drivers
curl -X POST https://www.menubarcode.com/api/v1/drivers \
  -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"name":"Alex","phone":"+15550001111","restaurant_id":12}'

# → { "id": 7, "name": "Alex", ..., "token": "RAW_DRIVER_TOKEN_SHOWN_ONCE" }
PUT /drivers/{id}
DELETE /drivers/{id}
POST /drivers/{id}/rotate-token

يُبطل الرمز القديم ويُعيد رمزًا جديدًا.

إسناد وتتبّع عملية توصيل

GET /restaurants/{id}/deliveries

طلبات التوصيل، قابلة للتصفية حسب ?delivery_status= و ?driver_id=.

POST /restaurants/{id}/orders/{orderId}/assign اكتب

إسناد سائق {"driver_id": 7}. يضبط delivery_status=assigned ويُطلق order.driver_assigned.

PUT /restaurants/{id}/orders/{orderId}/delivery-status اكتب

تجاوز مرحلة التوصيل: pending | assigned | picked_up | out_for_delivery | delivered | failed.

واجهة API لتطبيق السائق

يُصادِق تطبيق السائق باستخدام رمز السائق (وليس رمز مالك) الصادر أعلاه. المسار الأساسي https://www.menubarcode.com/api/v1/driver. كل استجابة مقيّدة بذلك السائق وحده.

Authorization: Bearer RAW_DRIVER_TOKEN
GET /driver/me

الملف الشخصي للسائق المُصادَق.

GET /driver/deliveries

الطلبات المُسندة إلى هذا السائق. أضف ?active=1 لإخفاء المُسلَّمة/الفاشلة.

PUT /driver/deliveries/{orderId}/status

تقدّم بالتوصيل: {"delivery_status":"out_for_delivery"} ثم "delivered" أو "picked_up" / "failed", اختياري note). يُطلق نفس الـ webhooks التي تُطلقها نقطة نهاية المالك.

PUT /driver/location

ادفع الموقع الحيّ: {"lat":25.2048,"lng":55.2708}. يظهر في شاشة تتبّع العميل أثناء الخروج للتوصيل.

حسابات العملاء

هناك تطبيق عملاء مستقلّ يُصادِق مستخدميه الخاصّين برمز لكل عميل (بأسلوب Sanctum: أجهزة متعدّدة، قابلة للإلغاء فرديًا). لا يتدخّل أي رمز مالك. العملاء مقيّدون لكل مطعم، لذا تكون المصادقة تحت /restaurants/{id}/customer/…. تصفّح القائمة أولًا عبر نقطة النهاية العامة:

GET /menu/{restaurantId} عام

القائمة النشطة مجمّعة حسب الفئة (تُحذف العناصر المنتهية). دون مصادقة.

التسجيل / تسجيل الدخول

POST /restaurants/{id}/customer/register
POST /restaurants/{id}/customer/login
curl -X POST https://www.menubarcode.com/api/v1/restaurants/12/customer/login \
  -H "Content-Type: application/json" \
  -d '{"email":"sam@example.com","password":"secret123","device":"iPhone 15"}'

# → { "token": "RAW_CUSTOMER_TOKEN", "customer": { "id": 42, "name": "Sam", ... } }

دون كلمة مرور (رمز OTP عبر SMS)

POST /restaurants/{id}/customer/otp/request
POST /restaurants/{id}/customer/otp/verify

اطلب رمزًا لرقم هاتف، ثم تحقّق منه. التحقّق يجد العميل أو ينشئه ويُعيد رمزًا. نقاط نهاية المصادقة محدودة المعدّل (تسجيل الدخول/التسجيل 10/دقيقة، طلب OTP 6/دقيقة).

واجهة API لتطبيق العميل

صادِق باستخدام رمز العميل. المسار الأساسي https://www.menubarcode.com/api/v1/customer. كل شيء مقيّد بالعميل المُصادَق — لا يمكن لجسم الطلب أبدًا انتحال معرّف عميل آخر.

Authorization: Bearer RAW_CUSTOMER_TOKEN
GET /customer/me
PUT /customer/me

قراءة/تحديث الملف الشخصي (الاسم، البريد الإلكتروني، الهاتف، تاريخ الميلاد، الموافقات).

POST /customer/orders

قدّم طلبًا بصفة هذا العميل (نفس بنية العنصر في نقطة نهاية الإنشاء لدى التاجر؛ تُؤخذ الهوية من الرمز). يُعيد الطلب مع track_token.

GET /customer/orders

سجلّ طلبات العميل الخاصّ به، مرقّم الصفحات.

GET /customer/addresses
POST /customer/addresses
DELETE /customer/addresses/{id}

عناوين التوصيل المحفوظة (يصبح الأول افتراضيًا؛ يدعم lat/lng).

POST /customer/logout

يُلغي الرمز المستخدَم للطلب (ذلك الجهاز فقط).

تتبّع الطلب عام

دون مصادقة — الوصول محكوم برمز الطلب غير القابل للتخمين track_token (يُعاد عند إنشاء الطلب). يشغّل هذا تطبيق العميل شاشة تتبّع حيّ.

GET /track/{token}
{
  "id": 5501, "status": "preparing", "delivery_status": "out_for_delivery",
  "is_paid": true, "total": 42.00,
  "timeline": { "preparing_at": "...", "out_for_delivery_at": "..." },
  "items": [ { "name": "Margherita", "quantity": 2 } ],
  "driver": { "name": "Alex", "lat": 25.2, "lng": 55.27, "location_updated_at": "..." }
}

لا تظهر كتلة السائق (مع الإحداثيات الحيّة) إلا بعد استلام الطلب / خروجه للتوصيل.

تسجيل دخول الموظفين

هناك تطبيق الموظفين (نقطة بيع / KDS / نادل) يُصادِق كل موظف برمز لكل موظف. مساران يماثلان لوحة التحكم: البريد الإلكتروني + كلمة المرور، أو رقم رمز PIN سريع لأجهزة المطبخ اللوحية المشتركة. الموظفون مقيّدون لكل مطعم.

POST /restaurants/{id}/staff/login
POST /restaurants/{id}/staff/pin
curl -X POST https://www.menubarcode.com/api/v1/restaurants/12/staff/pin \
  -H "Content-Type: application/json" -d '{"pin":"4321","device":"Kitchen iPad"}'

# → { "token": "RAW_STAFF_TOKEN",
#     "staff": { "id": 3, "role": "kitchen", "permissions": ["kds"] } }

تسرد الاستجابة صلاحيات الموظف الفعّالة الصلاحيات — وهي مجموعة فرعية من orders, menu_edit, coupons, analytics, kds, customers مشتقّة من دوره (مدير / أمين صندوق / مطبخ / نادل) بالإضافة إلى أي تجاوزات لكل موظف. نقاط النهاية محكومة بالأذونات (403 خلاف ذلك).

واجهة API لتطبيق الموظفين

صادِق باستخدام رمز الموظف. المسار الأساسي https://www.menubarcode.com/api/v1/staff. جميع الإجراءات مقيّدة بمطعم الموظف.

Authorization: Bearer RAW_STAFF_TOKEN
GET /staff/me

الملف الشخصي مع الدور وقائمة الأذونات.

GET /staff/orders orders
PUT /staff/orders/{orderId}/status orders

اسرد الطلبات وحدّث حالة المطبخ. يتطلّب orders الإذن.

GET /staff/kds kds

تذاكر المطبخ الحيّة مجمّعة حسب الطلب، مُصفّاة إلى محطّة الموظف (أو ?station_id=). تعرض فقط العناصر التي لا تزال queued|preparing|ready.

PUT /staff/kds/items/{itemId}/bump kds
PUT /staff/kds/items/{itemId}/recall kds

تقدّم (queued → preparing → ready → served) أو ارجع خطوة واحدة في حالة KDS. تتزامن حالة الطلب الأصل تلقائيًا.

POST /staff/menu/items menu_edit
PUT /staff/menu/items/{itemId} menu_edit
DELETE /staff/menu/items/{itemId} menu_edit
PATCH /staff/menu/items/{itemId}/sold-out menu_edit
POST /staff/menu/categories menu_edit

حرّر القائمة من الصالة (المديرون). نفس حمولات نقاط نهاية قائمة التاجر، مقيّدة بمطعم الموظف.

GET /staff/analytics analytics

ملخّص المبيعات لمطعم الموظف (نفس بنية نقطة نهاية تحليلات التاجر؛ ?from=&to=).

POST /staff/logout

يُلغي رمز هذا الجهاز.

Webhooks — الإعداد

سجّل نقاط النهاية من لوحة التحكم ضمن رموز API و Webhooks. اختر الأحداث التي تستقبلها كل نقطة نهاية. عند الحفظ تحصل على سر التوقيع; استخدم زر اختبار لإرسال ping. أوقف نقطة نهاية مؤقتًا لإيقاف التسليم دون فقدان سرّها.

يجب أن تستجيب نقطة نهايتك بحالة 2xx بسرعة (خلال 10 ثوانٍ). أي حالة أخرى — أو انتهاء المهلة — تُعامَل كفشل ويُعاد المحاولة.

يمكن أيضًا إدارة نقاط النهاية برمجيًا (لـ REST-Hooks في Zapier/Make) باستخدام webhooks:write رمز:

GET    /api/v1/webhook-endpoints            # list your endpoints
POST   /api/v1/webhook-endpoints            # {"url":"https://…","events":["order.created"]} → 201 {id, secret, …}
DELETE /api/v1/webhook-endpoints/{id}       # unsubscribe → 204

الـ secret يُعاد فقط عند الإنشاء — خزّنه للتحقّق من التوقيع. url يجب أن يكون نقطة نهاية HTTPS عامة (محميّة ضد SSRF)؛ events يجب أن تكون من القائمة أدناه (أو *).

أحداث Webhook

الحدثيُطلَق عند
order.createdيُقدَّم طلب جديد (لوحة التحكم أو API).
order.status_changedتتغيّر حالة مطبخ الطلب (لوحة التحكم أو نقطة البيع أو API).
order.paidيُوسَم الطلب كمدفوع بالكامل (بوابة دفع أو تقسيم فاتورة).
order.driver_assignedيُسنَد سائق إلى عملية توصيل.
order.out_for_deliveryالسائق في طريقه إلى العميل.
order.deliveredاكتملت عملية التوصيل.
order.delivery_failedتعذّر إكمال عملية التوصيل.
refund.completedتم إتمام استرداد مبلغ لطلب.
reservation.createdتم إنشاء حجز طاولة.
reservation.cancelledتم إلغاء حجز طاولة.
customer.createdتم إنشاء سجل عميل جديد.
shift.openedتم فتح وردية درج النقد / نقطة البيع.
shift.closedتم إغلاق وردية درج النقد / نقطة البيع.
menu.updatedيُنشَأ عنصر أو فئة في القائمة أو يُحدَّث أو يُحذَف (من أي واجهة). الحمولة: {restaurant_id, change, entity, id}.
entitlement.changedتُمنَح ميزة أو تُلغى لمساحة العمل (تغيير خطة، إضافة، تثبيت/إزالة تطبيق، تجاوز المشرف). الحمولة: {action, feature_key, source_type, source_id, user_id, occurred_at} حيث action هو granted أو revoked.
subscription.*دورة حياة الاشتراك: subscription.paused, .resumed, .renewed, .expired, .plan_changed, .past_due, .expiring, .trial_ending.
app.uninstalledتُزال أحد تطبيقات السوق (يُسلَّم إلى نقطة نهاية التطبيق).
*اشترك في كل حدث أعلاه.
pingيُرسَل بواسطة زر اختبار للتحقّق من التوصيل.

فشل تسليم أثناء تعطّل نقطة نهايتك؟ استخدم إعادة التسليم على أي صفّ في سجلّ التسليمات الأخيرة بلوحة التحكم لإعادة إدراجه في الطابور بـ webhook-id.

حمولة Webhook

كل تسليم هو طلب POST بغلاف JSON هذا وهذه الترويسات:

POST /your-endpoint HTTP/1.1
Content-Type: application/json
webhook-id: msg_a1b2c3d4e5f6g7h8i9j0k1l2
webhook-timestamp: 1751472240
webhook-signature: v1,K5f...base64...==
X-Webhook-Event: order.created          (legacy)
X-Webhook-Signature: 9a3f...hex...      (legacy, HMAC of body only)

{
  "id": "msg_a1b2c3d4e5f6g7h8i9j0k1l2",
  "event": "order.created",
  "created_at": "2026-07-02T18:04:00+00:00",
  "data": { "order_id": 5501, "total": "42.00" }
}

الـ id فريد لكل تسليم. ولأن إعادة المحاولات تعيد استخدام نفس id, استخدمه لجعل معالجك محايدًا تكراريًا.

التحقّق من التوقيع

الـ webhook-signature الترويسة عبارة عن HMAC-SHA256 مُرمّزة بـ base64، محسوبة على {id}.{timestamp}.{body} باستخدام سرّ توقيع نقطة نهايتك. ربط المعرّف والطابع الزمني بالتوقيع هو ما يجعل الطلب الملتقَط آمنًا ضدّ إعادة التشغيل. ارفض أي طلب يكون webhook-timestamp أقدم من ~5 دقائق.

PHP

$secret  = 'whsec_from_dashboard';
$id      = $_SERVER['HTTP_WEBHOOK_ID'];
$ts      = $_SERVER['HTTP_WEBHOOK_TIMESTAMP'];
$body    = file_get_contents('php://input');
$sent    = explode(',', $_SERVER['HTTP_WEBHOOK_SIGNATURE'])[1] ?? '';

if (abs(time() - (int) $ts) > 300) { http_response_code(400); exit; }

$expected = base64_encode(hash_hmac('sha256', "$id.$ts.$body", $secret, true));
if (!hash_equals($expected, $sent)) { http_response_code(401); exit; }

// verified — process $body
http_response_code(200);

Node.js

const crypto = require('crypto');

function verify(req, secret) {
  const id  = req.headers['webhook-id'];
  const ts  = req.headers['webhook-timestamp'];
  const sig = (req.headers['webhook-signature'] || '').split(',')[1];
  if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false;

  const expected = crypto
    .createHmac('sha256', secret)
    .update(`${id}.${ts}.${req.rawBody}`)
    .digest('base64');

  return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(sig || ''));
}
الرمز القديم X-Webhook-Signature (HMAC-SHA256 عادي للجسم، بصيغة hex) تُرسَل أيضًا للتوافق مع الإصدارات السابقة. ينبغي للتكاملات الجديدة استخدام webhook-signature.

إعادة المحاولات وسجلّ التسليم

التسليم غير متزامن ويُعاد عند الفشل بتراجع أسّي مع تشويش زمني: تقريبًا 1m → 5m → 15m → 1h (حتى 5 محاولات إجمالًا). تُسجَّل كل محاولة — نجاحًا أو فشلًا — في سجلّ التسليم بلوحة التحكم مع حالة HTTP ورقم المحاولة ومقتطف الاستجابة.

التسليم مرّة واحدة على الأقل. أزل التكرار بالاعتماد على webhook-id للتعامل مع التكرارات العرضية.

خوادم MCP

جديد يوجد دليل إعداد من صفحة واحدة بالنسخ واللصق لكل عميل على /mcp — أوامر تثبيت لكل عميل، وروابط عميقة بنقرة واحدة، وكتالوج الأدوات ونماذج المطالبات. تبقى هذه الصفحة المرجع المعمّق.

خمسة خوادم Model Context Protocol تربط وكلاء الذكاء الاصطناعي (ChatGPT وClaude وCursor) بالمنصّة — اختر ما يناسب جمهورك. جميعها تتحدّث JSON-RPC 2.0 عبر HTTP وتتفاوض على إصدارات البروتوكول 2024-11-05 / 2025-03-26 / 2025-06-18.

الخادمنقطة النهايةالجمهورالمصادقةأدوات
Adminhttps://www.menubarcode.com/mcpأصحاب المتاجر — إدارة المتجررمز API (Bearer)23
Storefronthttps://www.menubarcode.com/mcp/storefrontوكيل الزبون — التسوّق والطلب من متجر واحدرمز المتجر (نطاق الوكيل)12
Customerhttps://www.menubarcode.com/mcp/customerزبون مُسجَّل الدخول — طلباته الخاصّةرمز الزبون (تسجيل الدخول برمز OTP)5
Cataloghttps://www.menubarcode.com/mcp/catalogأي شخص — اكتشاف المتاجر عبر المنصّةعام3
Devhttps://www.menubarcode.com/mcp/devأدوات البرمجة بالذكاء الاصطناعي — بناء القوالب/التكاملاتعام7

بداية سريعة: انتقل إلى Admin, Catalog, Customer, أو Dev. يشارك خادم Storefront نمط اتصال Admin نفسه مع ترويسة X-Storefront-Token بدلًا من رمز Bearer.

خادم MCP (Admin)

يمكن لعميل ذكاء اصطناعي متوافق مع MCP (Claude وChatGPT وCursor) تشغيل مطعمك باللغة الطبيعية باستخدام نفس رموز API. وجّهه إلى:

POST https://www.menubarcode.com/mcp JSON-RPC 2.0

صادِق باستخدام Authorization: Bearer YOUR_TOKEN. تعلن كل أداة عن الصلاحية الدقيقة التي تحتاجها (resource:action); الرمز القديم read يغطّي كل :read أداة، و write يغطّي كل شيء. جميع الاستدعاءات مقيّدة بمطاعمك ومحدودة المعدّل. تُخفى الأدوات التي تفتقر إلى صلاحيتها من tools/list.

الاتصال (Claude Code)

claude mcp add --transport http platform-admin https://www.menubarcode.com/mcp \
  --header "Authorization: Bearer YOUR_TOKEN"

سرد الأدوات

curl -X POST https://www.menubarcode.com/mcp \
  -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

استدعاء أداة (مثال: إضافة عنصر للقائمة)

curl -X POST https://www.menubarcode.com/mcp \
  -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call",
       "params":{"name":"add_menu_item",
                 "arguments":{"restaurant_id":12,"name":"Latte","price":4.5}}}'

أدوات

أداةالصلاحيةما تفعله
list_restaurantsreadالمطاعم التي تملكها.
get_menureadفئات مطعم وعناصره.
list_categoriesmenu:readالفئات مع أعداد العناصر.
add_categorymenu:writeإنشاء فئة.
update_categorymenu:writeإعادة تسمية / ترتيب فئة.
delete_categorymenu:writeحذف فئة (يرفض إن كانت تحتوي عناصر).
add_menu_itemwriteإنشاء عنصر قائمة (يُفحَص حدّ الخطة).
update_menu_itemwriteعدّل اسم العنصر أو سعره أو وصفه.
delete_menu_itemmenu:writeاحذف عنصرًا نهائيًا.
set_item_availabilitymenu:writeوسم عنصر كمتوفّر/غير متوفّر (مفتاح 86).
list_ordersorders:readالطلبات من الأحدث أولًا؛ مرشّحات الحالة/التاريخ/البحث.
get_orderorders:readتفاصيل الطلب الكاملة بما فيها بنود الطلب.
update_order_statuswriteتقديم حالة مطبخ الطلب.
list_customerscustomers:read + crm_suiteقائمة CRM؛ البحث بالاسم/الهاتف/البريد. مخفيّة من tools/list دون الاستحقاق.
get_customercustomers:read + crm_suiteالسجلّ الكامل لعميل واحد. مخفيّ من tools/list دون الاستحقاق.
sales_reportanalytics:readالإيرادات + أعداد الطلبات + أبرز العناصر لنطاق زمني.
get_restaurant_settingsrestaurants:readلقطة للملف الشخصي وإعدادات الطلب.
update_business_hoursrestaurants:writeضبط نصّ ساعات العمل.
list_couponsorders:readكوبونات الخصم الخاصة بك.
create_couponorders:writeإنشاء قسيمة نسبة مئوية/ثابتة.
update_couponorders:writeعدّل كوبونًا.
delete_couponorders:writeاحذف كوبونًا.

Catalog MCP (اكتشاف المطاعم)

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

POST https://www.menubarcode.com/mcp/catalog JSON-RPC 2.0 · public

الاتصال (Claude Code)

claude mcp add --transport http platform-catalog https://www.menubarcode.com/mcp/catalog
أداةما تفعله
search_storesالعثور على المطاعم بالكلمة المفتاحية/المدينة (الاسم، العنوان، menu_url، تلميح storefront_mcp).
search_itemsالعثور على الأطباق عبر كل المتاجر (query/dietary/max_price/city)، مجمّعة حسب المتجر.
get_storeالتفاصيل العامة الكاملة لمتجر واحد عبر slug أو المعرّف.
list_starter_menusقوالب قائمة البداية المُضمّنة التي يمكن لمتجر جديد الانطلاق منها (مقهى، بيتزيريا، برجر، مخبز، صالة).

تظهر المتاجر النشطة والمُدرَجة علنًا فقط؛ يمكن للمالكين الانسحاب من إعدادات متجرهم. لا تُعاد أبدًا أي بيانات اتصال بالمالك. لتقديم طلب، استخدم MCP المتجر برمز وكيل لكل متجر.

MCP حساب العميل

يتيح لمساعد الذكاء الاصطناعي الخاص بالزبون قراءة وتتبّع وإعادة طلب طلباته الخاصّة . مُصادَق برمز لكل عميل من تسجيل دخول OTP القائم؛ تأتي هوية العميل من الرمز فقط — لا يُقبل أبدًا رقم هاتف أو معرّف عميل كوسيط.

POST https://www.menubarcode.com/mcp/customer JSON-RPC 2.0 · customer token

احصل على رمز (تدفّق OTP)

# 1) request a one-time code (sent to the customer's phone)
curl -X POST https://www.menubarcode.com/api/v1/restaurants/12/customer/otp/request \
  -H "Content-Type: application/json" -d '{"phone":"+15551234567"}'

# 2) verify the code → returns a customer bearer token
curl -X POST https://www.menubarcode.com/api/v1/restaurants/12/customer/otp/verify \
  -H "Content-Type: application/json" -d '{"phone":"+15551234567","code":"123456"}'

الاتصال (Claude Code)

claude mcp add --transport http my-orders https://www.menubarcode.com/mcp/customer \
  --header "Authorization: Bearer CUSTOMER_TOKEN"
أداةما تفعله
my_ordersطلباتك الأخيرة (الأحدث أولًا).
order_detailالتفاصيل الكاملة + بنود الطلب لأحد طلباتك.
track_orderالحالة الحيّة عبر معرّف الطلب أو رمز التتبّع.
reorderإعادة بناء طلب سابق كمسوّدة سلّة (يتخطّى العناصر المنتهية).
my_profileاسمك وهاتفك وعدد طلباتك.
my_bookingsحجوزات غرف الفندق الخاصة بك في هذا المكان (الرمز، الحالة، التواريخ، نوع الغرفة، الإجمالي).
curl -X POST https://www.menubarcode.com/mcp/customer \
  -H "Authorization: Bearer CUSTOMER_TOKEN" -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
       "params":{"name":"my_orders","arguments":{"limit":5}}}'

اربط محرّر الذكاء الاصطناعي

تبني قالبًا أو تكاملًا باستخدام Claude Code أو Cursor أو VS Code؟ وجّهه إلى الخادم العام خادم Dev MCP — تحصل أداة الذكاء الاصطناعي على توثيق حيّ للمنصّة، والقائمة البيضاء المُولَّدة لـ Liquid، والتحقّق من القوالب من جهة الخادم. لا حاجة إلى رمز.

POST https://www.menubarcode.com/mcp/dev JSON-RPC 2.0 · public

Claude Code

claude mcp add --transport http platform-dev https://www.menubarcode.com/mcp/dev

Cursor.cursor/mcp.json

{ "mcpServers": { "platform-dev": { "url": "https://www.menubarcode.com/mcp/dev" } } }

VS Code.vscode/mcp.json

{ "servers": { "platform-dev": { "type": "http", "url": "https://www.menubarcode.com/mcp/dev" } } }

أدوات learn_platform (ابدأ هنا), search_docs / fetch_full_doc, get_liquid_reference, get_section_schema, validate_theme, list_webhook_events. سير العمل الموصى به للوكيل: التعلّم → البناء → التحقّق → التسليم.

خادم MCP المُصادَق أعلاه (https://www.menubarcode.com/mcp) يشغّل بيانات مطعمك؛ أمّا هذا فيقدّم التوثيق والتحقّق وآمن للمشاركة علنًا.

سجل التغييرات

التاريختغيير
2026-08-20إصدار نظام إدارة الفندق + النمو: refund.completed, reservation.created, reservation.cancelled, customer.created, shift.opened, shift.closed أحداث webhook؛ تسجيل أجهزة الدفع للموظفين + 2fa نقاط النهاية؛ أدوات MCP جديدة hotel_availability, my_bookings, list_starter_menus, list_webhook_events.
2026-07-28فهرس اكتشاف مُولَّد من الموجّه + مواصفات OpenAPI 3.1 (متوافقة دائمًا مع واجهة API المنشورة)؛ Idempotency-Key عند إنشاء الطلب؛ حدود معدّل API لكل رمز؛ subscription.* + app.uninstalled أحداث webhook + التسليم إعادة التسليم.
2026-07-07عام خادم Dev MCP لأدوات البرمجة بالذكاء الاصطناعي: بحث حيّ في التوثيق، ومرجع Liquid مُولَّد، والتحقّق من القوالب من جهة الخادم.
2026-07-02نطاقات رموز دقيقة (resource:action); تحرير قائمة الموظفين + نقاط نهاية التحليلات.
2026-07-02تطبيق الموظفين: مصادقة برمز لكل موظف (كلمة مرور + PIN)، وتحكّم بالأذونات حسب الدور، وحالة الطلب، ودفع/استرجاع KDS.
2026-07-02تطبيق عملاء مستقلّ: مصادقة برمز لكل عميل (تسجيل/دخول/OTP)، وملف شخصي، وتقديم الطلبات + السجلّ، والعناوين المحفوظة، وتصفّح القائمة العامة.
2026-07-02واجهة API إدارية كاملة: عمليات CRUD للقائمة، وإنشاء الطلبات، والسائقون + دورة حياة التوصيل، وواجهة API لرمز تطبيق السائق، وتتبّع الطلبات العام، وتحليلات المبيعات، والعملاء. أحداث webhook جديدة للتوصيل.
2026-07-02تسليم webhook عبر طابور مع إعادة المحاولات؛ توقيع Standard-Webhooks (webhook-id/timestamp/signature); order.paid الحدث؛ توثيق عام.
2026-06-26الإصدار الأول v1 من REST API والرموز ونقاط نهاية webhook.

العودة إلى Menubarcode

Menubarcode API v1 · عنوان URL الأساسي https://www.menubarcode.com/api/v1

اتصل بنا

تابعنا