انتقل إلى المقال
Aniq-UI

Ticketoryمرجع واجهة API

مرجع واجهة API

كل مسار تقدّمه واجهة API، ومن يستطيع استدعاءه، وكيف تعمل مسارات تسجيل الدخول والصلاحيات ومساحات العمل والحجوزات والمدفوعات والأخطاء والقوائم والحدود.

لحزمة الحزمة الكاملة

العنوان الأساسي وصيغة الاستجابة

كل مسار يُقدَّم تحت البادئة /api. محليًا يكون العنوان الأساسي http://localhost:8000/api. وعلى الخادم يكون عنوان واجهة API متبوعًا بـ /api، وهو القيمة نفسها التي يقرؤها التطبيقان الأماميان من NEXT_PUBLIC_API_BASE_URL (متغيرات البيئة). وتُقدَّم الصور خارج البادئة، على /media/….

مسارات الموقع عامة أو تأخذ رمز الحاضر؛ ومسارات اللوحة تحتاج إلى رمز bearer لموظف، ومعظمها إلى صلاحية أيضًا. أجسام الطلبات JSON، عدا رفع الملفات. وكل إجابة تأتي في الغلاف نفسه:

الغلاف
{
  "success": true,
  "data": { },
  "message": ""
}

يحمل data النتيجة. وmessage جملة قصيرة تملؤها بعض عمليات الكتابة، بلغة الطلب، وتكون فارغة في غير ذلك. المال عدد صحيح بأصغر وحدة مع currency الخاصة به (price_minor: 2000 تعني 20.00)، وكل تاريخ نص ISO بتوقيت UTC؛ وتحمل كل فعالية أيضًا time_zone الخاص بها.

فحص السلامة لا يحتاج إلى رمز:

الطرفية
curl http://localhost:8000/api/health
الاستجابة
{"success":true,"data":{"status":"ok","database":"up"},"message":""}

عندما يتعذر قراءة قاعدة البيانات يجيب أيضًا بـ 200، مع "status":"degraded" و"database":"down". يقرأ فحص السلامة في صورة Docker هذا الحقل.

الأخطاء

يحتفظ الفشل بالغلاف، مع success: false وحالة HTTP:

الخطأ
{
  "success": false,
  "data": null,
  "message": "…",
  "errors": { "email": ["…"] },
  "code": "SEAT_UNAVAILABLE",
  "details": { "seats": ["A12"] }
}
  • message جملة بلغة الطلب.
  • يظهر errors عند فشل التحقق، مع المشكلات لكل حقل، مفهرسة بالمسار الذي أرسله العميل (مثل title.en أو attendee.email).
  • الحقل المجهول في الجسم يُرفض بـ 400، ويسمّيه errors. والتسجيل، مثلًا، لا يأخذ إلا الحقول المسرودة أدناه.
  • يظهر code وdetails حيث تتفاعل شاشة مع رفض بعينه: SEAT_UNAVAILABLE مع المقاعد المأخوذة، وHOLD_EXPIRED وSOLD_OUT وALREADY_ADMITTED مع أول إدخال، وVERSION_CONFLICT وNOT_READY مع ما ينقص، وCOOLDOWN مع retry_after بالثواني.
  • المسار المحمي من دون رمز، أو برمز منتهي، يجيب بـ 401؛ والرمز الذي ينقصه الصلاحية يجيب بـ 403.
  • الطلب الذي يتجاوز حدًّا يُجاب بـ 429.

الترويسات

الترويسةتُرسل معما تحمله
Authorization: Bearer …مسارات الموظفين والحضورالرمز من POST /api/auth/login (الموظفون) أو POST /api/customer-auth/login (الحضور). النوعان غير قابلين للتبادل
X-Workspace-Idمسارات الموظفينمساحة العمل التي يخصها الطلب. ما لا ينتمي إليه العضو يُتجاهل وتُستخدم مساحته
X-Hold-Tokenحجز والدفع المبني عليهسر الحجز، يُعاد مرة واحدة عند إنشاء الحجز
X-Order-Tokenمسارات طلب الضيفسر الطلب، يعيده POST /api/checkout مرة واحدة. وطلبات الحاضر المسجَّل دخوله تحتاج إلى رمزه فقط
Idempotency-KeyPOST /api/holds, POST /api/checkout, POST /api/admin/orders/:reference/refundsUUID يُصنع عند فتح النموذج. إعادة المحاولة بالمفتاح والجسم نفسهما تعيد الإجابة الأولى بدلًا من تكرار العمل؛ ومن دونه يُرفض الطلب
Accept-Languageأي مسارar لرسائل بالعربية؛ وأي قيمة أخرى تجيب بالإنجليزية

نصوص الفعاليات والأماكن وأنواع التذاكر تحمل اللغتين بالشكل { "en": "…", "ar": "…" } أيًّا كانت قيمة Accept-Language، ويختار العميل إحداهما، ويرجع إلى الإنجليزية حين تكون العربية فارغة.

القوائم والتقسيم إلى صفحات

قائمة
{ "data": [ ], "page": 1, "limit": 10, "total": 36, "totalPages": 4 }
  • معظم القوائم تُقسَّم إلى صفحات بـ page وlimit، بحد أقصى 100 في الصفحة: 9 فعاليات في الصفحة في الموقع، و10 فعاليات وأماكن وحضور و8 طلبات في اللوحة افتراضيًا. وبعضها يعيد أيضًا counts لكل تبويب أو حالة.
  • قوائم الفريق والأدوار وإعدادات الموقع تُقسَّم بـ page وpage_count، والاستفسارات بـ page وpage_size (10 افتراضيًا، 50 على الأكثر).
  • قوائم اللوحة تأتي الأحدث تحديثًا أولًا، مع المعرّف كفاصل عند التساوي، فيكون التصفح بين الصفحات ثابتًا. وكتالوج الموقع يأتي الأقرب أولًا.
  • فلاتر قائمة الفريق (email وname وphone) تجتمع: يجب أن يطابق الصف كل فلتر معطى. ويطابق name الاسم الأول واسم العائلة واسم المستخدم والاسم الكامل.

تسجيل الدخول

  1. سجّل الدخول كموظف

    الطرفية
    curl -X POST http://localhost:8000/api/auth/login \
      -H "Content-Type: application/json" \
      -d '{"email":"YOUR_EMAIL","password":"YOUR_PASSWORD"}'

    استخدم أحد حسابات اللوحة من التثبيت، أو حسابك. data.access_token هو الرمز، مع token_type بالقيمة Bearer والموظف بأدواره وصلاحياته. يدوم الرمز JWT_EXPIRATION، وهو 7d افتراضيًا، ويعيد expires_in تلك القيمة كما كُتبت. ويعيد GET /api/auth/me الموظف المسجَّل دخوله بأدواره وصلاحياته.

  2. استدعِ مسارًا محميًا

    الطرفية
    curl http://localhost:8000/api/admin/orders \
      -H "Authorization: Bearer YOUR_TOKEN" \
      -H "X-Workspace-Id: 1"
  • البريد غير المعروف وكلمة المرور الخاطئة يجيبان كلاهما بـ 401 مع الرسالة نفسها.
  • عشر محاولات دخول فاشلة من عنوان واحد خلال 15 دقيقة تجيب 429 إلى أن يمضي على أقدم فشل 15 دقيقة (RATE_LIMIT_LOGIN). ولا تُحسب عمليات الدخول الناجحة. ويُحسب دخول الموظفين ودخول الحضور كلٌّ على حدة.
  • حسابات الموظفين تأتي من البيانات التجريبية أو من صفحة الفريق؛ ولا يوجد تسجيل للموظفين. ويسجّل العميل الخروج بنسيان رمزه.
  • يسرد GET /api/admin/workspace/memberships مساحات العمل التي ينتمي إليها العضو، وأولها مساحته. أرسل معرّف المساحة المختارة باسم X-Workspace-Id.
الطريقةالمسارمن يحق له استدعاؤهوظيفته
POST/api/auth/loginأي شخصدخول الموظف: email وpassword
GET/api/auth/meأي موظف مسجَّل الدخولالموظف المسجَّل دخوله، وأدواره وصلاحياته
GET/api/admin/workspace/membershipsأي موظف مسجَّل الدخولمساحات عمل العضو، لمنتقي الشريط العلوي

الصلاحيات

تفحص مسارات الموظفين صلاحية اسمها <area>.<action>. يملك العضو كل صلاحية من كل دور لديه، والدور نفسه في كل مساحة عمل ينتمي إليها. الصلاحيات التسع والعشرون والأدوار الأربعة التجريبية (المالك والمدير والمالية وتسجيل الدخول) مسرودة في الفريق والأدوار ومساحات العمل.

الفعاليات والأماكن والمنظّمون على الموقع

الطريقةالمسارمن يحق له استدعاؤهوظيفته
GET/api/public/eventsأي شخصالفعاليات العامة القادمة، الأقرب أولًا. q (العنوان أو الملخص أو المكان أو المدينة أو المنظّم)، وcategory، وcity، وvenue، وorganiser (معرّفات نصية)، وfrom وto (YYYY-MM-DD)، وpage، وlimit. وتُستبعد المسودات والفعاليات غير المدرجة والفعاليات التي انتهت
GET/api/public/events/citiesأي شخصالمدن التي فيها فعاليات قادمة وعدد فعاليات كل منها، لفلتر المدينة
GET/api/public/events/:slugأي شخصفعالية كاملة: الوصف والبرنامج والمكان بعنوانه وإمكانية الوصول والمواصلات والموقع، ورمز الجلسة، وأنواع التذاكر بسعرها ورسومها والأماكن المتبقية وحد الطلب الواحد. والفعالية الملغاة تجيب بـ status: cancelled
GET/api/public/sessions/:code/availabilityأي شخصالتوفر الحي لخريطة المقاعد: ساعة الخادم، وhold_seconds، وmax_per_order، والرسوم، وأنواع التذاكر، ومخطط المقاعد المنشور (أو null للدخول العام)، وكل مقعد بحالة available أو held أو sold أو unavailable
GET/api/public/categoriesأي شخصفئات الفعاليات
GET/api/public/organisersأي شخصالمنظّمون
GET/api/public/organisers/:slugأي شخصمنظّم واحد مع ما يصل إلى 24 من فعالياته القادمة وإجمالي عددها
GET/api/public/venuesأي شخصالأماكن، مع فعالياتها القادمة ومقاعدها
GET/api/public/venues/:slugأي شخصمكان واحد، مع مخطط مقاعده المنشور
GET/api/public/settingsأي شخصما يحتاجه الموقع لتسعير عملية الشراء وتوقيتها: اسم مساحة العمل، وcurrency، وfee_bps (رسوم الحجز التي يدفعها الحاضر على كل تذكرة، و300 تعني 3%)، وhold_seconds، وmax_per_order، وtime_zone، وsupport_email، وpayment_methods، وmail_simulated (صحيح ما دامت الرسائل تُكتب في سجل واجهة API)
GET/api/settings/publicأي شخصقيم الموقع site_name وcontact_email وcontact_city

أرباح المنظّم ليست جزءًا من أي إجابة عامة أبدًا.

حسابات الحضور

الطريقةالمسارمن يحق له استدعاؤهوظيفته
POST/api/customer-auth/registerأي شخصالتسجيل: first_name وlast_name وemail وpassword (من 8 إلى 72 حرفًا فيها حرف ورقم) وterms_accepted (true)، واختياريًا role (attendee أو organiser، ولا يُقرأ أبدًا). وأي حقل آخر يجيب 400 ويسمّيه. يجيب 201، مع تسجيل الدخول فورًا، ويرسل رمزًا من ستة أرقام
POST/api/customer-auth/loginأي شخصدخول الحاضر: email وpassword، وremember لرمز مدته 30 يومًا بدلًا من يوم واحد
POST/api/customer-auth/logoutأي شخصيجيب { signed_out: true }؛ الرموز بلا حالة، فينسى العميل نسخته
POST/api/customer-auth/forgot-passwordأي شخصemail. يرسل رابط إعادة ضبط صالحًا ساعة واحدة إذا كان الحساب موجودًا، ويجيب بالطريقة نفسها في الحالتين
POST/api/customer-auth/reset-passwordأي شخصtoken (من الرابط) وpassword الجديد. والرابط المنتهي أو المستخدم يجيب 400 مع TOKEN_EXPIRED
POST/api/customer-auth/verify-emailحاضر مسجَّل الدخولcode، الأرقام الستة من البريد، صالح 24 ساعة. والطلبات التي اشتُريت بذلك البريد كضيف تنضم إلى الحساب
POST/api/customer-auth/resend-verificationحاضر مسجَّل الدخولأرسل رمزًا جديدًا؛ مرة واحدة في الدقيقة على الأكثر (429 مع COOLDOWN وretry_after)
GET/api/meحاضر مسجَّل الدخولالملف الشخصي للحاضر
PATCH/api/meحاضر مسجَّل الدخولغيّر first_name أو last_name أو email أو marketing_emails أو reminder_emails
GET/api/me/savedحاضر مسجَّل الدخولالفعاليات المحفوظة، كبطاقات
GET/api/me/saved/slugsحاضر مسجَّل الدخولمعرّفات الفعاليات المحفوظة فقط، لأزرار القلب
PUT/api/me/saved/:slugحاضر مسجَّل الدخولاحفظ فعالية
DELETE/api/me/saved/:slugحاضر مسجَّل الدخولألغِ حفظ فعالية
GET/api/me/ticketsحاضر مسجَّل الدخولتذاكر الحاضر كـ upcoming وpast، بطاقة لكل طلب
GET/api/me/tickets/:referenceحاضر مسجَّل الدخولبطاقات طلب واحد، مع رموز QR وروابط التنزيل
GET/api/me/ordersحاضر مسجَّل الدخولطلبات الحاضر
GET/api/me/orders/:referenceحاضر مسجَّل الدخولإيصال طلب واحد، مع جدوله الزمني

التسجيل محدود بـ 10 لكل عنوان في 10 دقائق، وطلبات إعادة ضبط كلمة المرور بـ 5. وما دام مفتاح البريد غير مضبوط، تُكتب الرموز والروابط في سجل واجهة API، ويقول mail_simulated ذلك.

الحجوزات والدفع

الشراء استدعاءان: احجز المقاعد أو الأماكن، ثم أتمّ الدفع من الحجز. كلاهما يعمل للضيف وللحاضر المسجَّل دخوله، الذي يُقرأ رمزه حين يُرسل.

الطريقةالمسارمن يحق له استدعاؤهوظيفته
POST/api/holdsأي شخصاحجز { session_code, seats: ["A12", "B12"] } للمقاعد المحجوزة، أو { session_code, ticket_type_id, quantity } للدخول العام، من 1 إلى 8 في المرة. يحتاج إلى Idempotency-Key. يجيب 201 مع الحجز وexpires_at وساعة الخادم، وtoken الخاص به، ويظهر مرة واحدة
GET/api/holds/:idمالك الحجز، مع X-Hold-Tokenاقرأ الحجز
PATCH/api/holds/:idمالك الحجز، مع X-Hold-Tokenاستبدل الاختيار؛ لا يتحرك الموعد النهائي
DELETE/api/holds/:idمالك الحجز، مع X-Hold-Tokenحرّر المقاعد الآن
GET/api/checkout/methodsأي شخصطرق الدفع المعروضة، لكل منها provider وlive
POST/api/checkoutمالك الحجز، مع X-Hold-Tokenhold_id وattendee (first_name وlast_name وemail) وprovider (stripe أو paypal أو simulated) وterms_accepted. يحتاج إلى Idempotency-Key. يجيب 201 مع order_reference وstatus وredirect_url وaccess_token، وهو سر الطلب ويظهر مرة واحدة. ويُحفظ Accept-Language الخاص بالطلب (ar، وإلا en) على الطلب باسم locale، وهو لغة كل بريد عنه
  • يدوم الحجز مدة حجز مساحة العمل (hold_seconds، عشر دقائق في البيانات التجريبية)، محسوبة بساعة الخادم. وبعدها يجيب الحجز 410 مع HOLD_EXPIRED وتصبح المقاعد متاحة من جديد.
  • المقعد الذي يحجزه شخص آخر أو اشتراه يجيب 409 مع SEAT_UNAVAILABLE والمقاعد في details.seats؛ ونوع التذكرة الممتلئ يجيب SOLD_OUT؛ وما يزيد على حد الطلب الواحد يجيب TOO_MANY.
  • وجّه المتصفح إلى redirect_url: صفحة Stripe أو PayPal نفسها، أو صفحة المحاكي في الموقع. ولا تُرسل بيانات البطاقة إلى واجهة API هذه أبدًا.
  • الحجز الذي إجماليه 0 لا يحتاج إلى provider: يُؤكَّد الطلب فورًا بالمزوّد free والحالة paid، وredirect_url هو صفحة تأكيده.

الطلبات وملفات التذاكر والمدفوعات

الطريقةالمسارمن يحق له استدعاؤهوظيفته
GET/api/orders/:reference/statusحاضر الطلب، أو ضيف مع X-Order-Tokenstatus (pending_payment أو paid أو payment_failed أو expired أو payment_review أو partially_refunded أو refunded)، والمزوّد وساعة الخادم، للصفحة التي تنتظر الدفع
GET/api/orders/:reference/receiptحاضر الطلب، أو ضيف مع X-Order-Tokenالطلب مع فعاليته ومكانه وتذاكره (كل تذكرة مدفوعة برمز QR الخاص بها) وحالة بريد التذاكر وروابط downloads الموقّعة
POST/api/orders/:reference/resend-emailحاضر الطلب، أو ضيف مع X-Order-Tokenأرسل التذاكر مرة أخرى إلى عنوان الطلب، بلغة Accept-Language الخاص بالطلب. يجيب 202، أو 429 مع COOLDOWN خلال دقيقة من آخر إرسال
GET/api/orders/:reference/tickets.pdfأي شخص يحمل الرابط الموقّعكل تذاكر الطلب في ملف PDF واحد
GET/api/orders/:reference/calendar.icsأي شخص يحمل الرابط الموقّعالفعالية كملف تقويم
GET/api/tickets/:reference/pdfأي شخص يحمل الرابط الموقّعتذكرة واحدة كملف PDF
GET/api/payments/return/paypalأي شخصيرسل PayPal المشتري إلى هنا: تلتقط واجهة API الدفعة وتعيد التوجيه إلى صفحة انتظار الموقع (أو صفحة الإلغاء)
POST/api/payments/simulated/:reference/completeصفحة المحاكي، مع رمز الطلبtoken وoutcome (pay أو fail أو cancel). يجيب 404 متى لم يكن المحاكي معروضًا
POST/api/webhooks/:providerStripe أو PayPalstripe أو paypal. يُفحص التوقيع مقابل STRIPE_WEBHOOK_SECRET أو PAYPAL_WEBHOOK_ID؛ والمفقود أو الخاطئ يجيب 401. ويُعالَج كل حدث مرة واحدة مهما تكرر إرساله
  • روابط التنزيل موقّعة بـ exp وsig وتعمل 30 دقيقة من الإيصال الذي صنعها؛ والقديم يجيب 404، وقراءة الإيصال من جديد تصنع روابط جديدة. وتُبنى من PUBLIC_API_URL.
  • تُصدر التذاكر متى أكد المزوّد الدفعة، بخطاف الويب الخاص به، أو بعودة PayPal، أو بالمحاكي. يرسل Stripe checkout.session.completed وcheckout.session.async_payment_succeeded وcheckout.session.async_payment_failed وrefund.updated؛ ويرسل PayPal PAYMENT.CAPTURE.COMPLETED وPAYMENT.CAPTURE.DENIED وPAYMENT.CAPTURE.REFUNDED.
  • يُعرض المحاكي ما دام لا يوجد مفتاح Stripe أو PayPal حي؛ وPAYMENTS_SIMULATOR=on أو off يتقدم على ذلك.

نموذج التواصل

الطريقةالمسارمن يحق له استدعاؤهوظيفته
POST/api/leadsأي شخصname وemail وsubject (general أو tickets أو organisers أو scale أو press) وmessage (من 10 إلى 2000 حرف) وclient_token (UUID v4). يجيب 201 مع { id, received_at }
  • يعيد client_token المكرر إيصال الإرسال الأول بدل تخزين إرسال ثانٍ.
  • يُعامل الحقل company المملوء كأنه روبوت: يبدو الرد نفسه، ولا يُخزَّن شيء.
  • يستطيع كل عنوان إرسال خمس في عشر دقائق؛ والتالية تجيب 429.

الفعاليات

الطريقةالمسارمن يحق له استدعاؤهوظيفته
GET/api/admin/eventsالموظفون الذين لديهم events.viewالفعاليات مع counts لكل تبويب. tab (all أو published أو draft أو ended)، وq، وcategory، وstatus، وvenue (المعرّف)، وfrom، وto، وsort (starts_at، وإلا آخر تحديث)، وorder (asc أو desc)، وpage، وlimit
GET/api/admin/events/:idالموظفون الذين لديهم events.viewفعالية واحدة للمحرر، مع قائمة readiness وversion والبداية والنهاية بالتوقيت المحلي
POST/api/admin/eventsالموظفون الذين لديهم events.editأنشئ مسودة: title وsummary وdescription (لكل منها en وar)، وcategory (معرّف نصي)، وvenue_id، وcolor (pink أو yellow أو teal أو blue)، وadmission_mode (reserved أو general)، وvisibility (public أو unlisted)، وstarts_local وends_local وtime_zone وagenda وticket_types (title وprice_minor وcapacity، واختياريًا description وmax_per_order وstatus)، واختياريًا slug
PATCH/api/admin/events/:idالموظفون الذين لديهم events.editاحفظ الحقول نفسها مع version الذي حمّله المحرر. حفظ أحدث يجيب 409 مع VERSION_CONFLICT؛ وسعر نوع التذكرة المباع مقفل (PRICE_LOCKED)
POST/api/admin/events/:id/publishالموظفون الذين لديهم events.publishاعرض مسودة للبيع. التي ليست جاهزة تجيب 400 مع NOT_READY وما ينقص
POST/api/admin/events/:id/unpublishالموظفون الذين لديهم events.publishالعودة إلى مسودة: يتوقف البيع وتُحرَّر الحجوزات، وتبقى التذاكر المباعة صالحة
POST/api/admin/events/:id/cancelالموظفون الذين لديهم events.publish{ confirm }، المعرّف النصي للفعالية مكتوبًا بالكامل. يتوقف البيع والدخول، ويصل بريد إلى صاحب كل طلب مدفوع. ثم تُجرى الاستردادات لكل طلب
POST/api/admin/events/:id/duplicateالموظفون الذين لديهم events.editمسودة جديدة بالتفاصيل وأنواع التذاكر نفسها، وبلا مبيعات
POST/api/admin/events/:id/archiveالموظفون الذين لديهم events.publishأرشف مسودة، أو فعالية انتهت أو أُلغيت
GET/api/admin/events/:id/attendeesالموظفون الذين لديهم events.viewتذاكر الفعالية مع الحامل والمقعد والنوع والحالة ووقت الدخول. q وstatus (admitted أو not_admitted أو void) وpage وlimit

الأماكن ومخططات المقاعد

الطريقةالمسارمن يحق له استدعاؤهوظيفته
GET/api/admin/venuesالموظفون الذين لديهم venues.viewالأماكن. q وcity وpage وlimit
GET/api/admin/venues/mapالموظفون الذين لديهم venues.viewدبوس كل مكان للخريطة
GET/api/admin/venues/:idالموظفون الذين لديهم venues.viewمكان واحد مع مخططاته
POST/api/admin/venuesالموظفون الذين لديهم venues.editأضف مكانًا: name (en وar)، وaddress، وcity، وtime_zone، وcapacity، وaccessibility (en وar)، واختياريًا slug وtransit وlocation (latitude وlongitude)
PATCH/api/admin/venues/:idالموظفون الذين لديهم venues.editغيّر أيًّا من هذه الحقول
GET/api/admin/venues/:id/layoutsالموظفون الذين لديهم venues.viewإصدارات مخطط المكان
GET/api/admin/venues/:id/layouts/:versionالموظفون الذين لديهم venues.viewإصدار واحد مع مقاعده
POST/api/admin/venues/:id/layoutsالموظفون الذين لديهم venues.editابدأ مسودة جديدة
PATCH/api/admin/venues/:id/layouts/:versionالموظفون الذين لديهم venues.editاحفظ المسودة: rows (من 1 إلى 40)، وseats_per_row (من 1 إلى 60)، وaisles_after (حتى 6)، وseats (label، واختياريًا accessible وcompanion وdisabled وprice_tier من 0 إلى 9) وloaded_at. المسودة التي حفظها شخص آخر منذ ذلك تجيب 409 مع VERSION_CONFLICT
POST/api/admin/venues/:id/layouts/:version/publishالموظفون الذين لديهم venues.edit{ acknowledged: true }. ينشر المسودة كمخطط للمكان؛ وتحتفظ المقاعد المباعة بالإصدار الذي بيعت عليه. ويُرفض المخطط الفارغ، أو الذي فيه مقاعد أكثر من سعة المكان (OVER_CAPACITY)

الطلبات والتذاكر والاستردادات

الطريقةالمسارمن يحق له استدعاؤهوظيفته
GET/api/admin/ordersالموظفون الذين لديهم orders.viewالطلبات مع counts لكل حالة. status (paid أو pending_payment أو refunded أو payment_failed أو payment_review)، وevent (معرّف نصي)، وprovider (stripe أو paypal أو simulated أو free)، وq (الرقم المرجعي أو البريد أو الاسم)، وfrom وto وpage وlimit
GET/api/admin/orders/eventsالموظفون الذين لديهم orders.viewكل فعالية لها طلبات، لفلتر صفحة الطلبات
GET/api/admin/orders/:referenceالموظفون الذين لديهم orders.viewطلب واحد: التذاكر والاستردادات والجدول الزمني للدفع ورابط إليه في لوحة المزوّد وversion الخاص به
GET/api/admin/orders/:reference/refund-previewالموظفون الذين لديهم refunds.createما سيعيده استرداد ?tickets=TKT-1042-2,…، لكل تذكرة
POST/api/admin/orders/:reference/refundsالموظفون الذين لديهم refunds.createاسترد تذاكر كاملة: tickets (من 1 إلى 8 أرقام مرجعية)، وreason (customer_request أو event_cancelled أو duplicate_order أو event_changed أو other)، وacknowledged (true) وorder_version. يحتاج إلى Idempotency-Key. يجيب 202 مع الاسترداد pending
POST/api/admin/refunds/:id/retryالموظفون الذين لديهم refunds.createأرسل استردادًا فاشلًا إلى المزوّد مرة أخرى
POST/api/admin/refunds/:id/restoreالموظفون الذين لديهم refunds.createأغلق استردادًا فاشلًا نهائيًا؛ فتعود تذاكره صالحة
POST/api/admin/tickets/:reference/reissueالموظفون الذين لديهم tickets.manageرمز QR جديد لتذكرة صالحة؛ ويتوقف الرمز القديم عن العمل عند الباب
POST/api/admin/tickets/:reference/voidالموظفون الذين لديهم tickets.manageألغِ تذكرة مجانية. التذكرة المدفوعة تجيب 409 مع USE_REFUND: فتُسترد بدلًا من ذلك

تُعلَّق تذاكره (refund_pending) بمجرد طلب الاسترداد، فيرفضها الباب. ويستقر الاسترداد حين يؤكده المزوّد، بعد ثوانٍ في المحاكي: فتُلغى التذاكر وتعود مقاعدها للبيع. والاسترداد الفاشل يُبقيها معلّقة إلى أن يُعاد أو يُستعاد، فتصبح صالحة من جديد. اقرأ الطلب مرة أخرى لترى أين وصل.

تسجيل الدخول عند الباب

الطريقةالمسارمن يحق له استدعاؤهوظيفته
GET/api/admin/check-in/sessionsالموظفون الذين لديهم checkin.scanالجلسات التي يستطيع هذا العضو مسحها، من يوم مضى فصاعدًا، مع أعداد من دخلوا والمتوقعين وهل الأبواب مفتوحة
GET/api/admin/check-in/sessions/:code/summaryالموظفون الذين لديهم checkin.scanمن دخلوا والمتوقعون والمتبقون، والتنبيهات المنتظرة
GET/api/admin/check-in/sessions/:code/scansالموظفون الذين لديهم checkin.scanآخر عمليات المسح، كل منها admitted أو eligible أو duplicate أو wrong_session أو void أو not_found
POST/api/admin/check-in/sessions/:code/acknowledgeالموظفون الذين لديهم checkin.scanعلّم تنبيهات الجلسة كمرئية
POST/api/admin/check-in/validateالموظفون الذين لديهم checkin.scansession_code وcode: ما قرأته الكاميرا، أو رقم مرجعي لتذكرة مكتوب مثل TKT-1042-1. يقول هل تستطيع التذكرة الدخول، دون أن يُدخلها
POST/api/admin/check-in/admitالموظفون الذين لديهم checkin.scanالشيء نفسه مع client_request_id (UUID)، ويُدخل التذكرة. التذكرة التي دخلت بالفعل تجيب 409 مع ALREADY_ADMITTED، ومتى ومن فعل؛ ويُرفض WRONG_SESSION وTICKET_VOID أيضًا
GET/api/admin/session-staffالموظفون الذين لديهم admins.editأي موظفي تسجيل الدخول مُسندون إلى أي جلسات
PUT/api/admin/session-staff/:codeالموظفون الذين لديهم admins.editحدّد موظفي باب الجلسة: admin_ids، مفصولة بفواصل

الأعضاء الذين يستطيعون تعديل الفعاليات أو نشرها يصلون إلى كل جلسة؛ وغيرهم إلى الجلسات المسندة إليهم فقط، وغيرها يجيب 403. ويستطيع كل عضو إجراء 120 فحصًا في الدقيقة.

النظرة العامة والتقارير والتصدير

الطريقةالمسارمن يحق له استدعاؤهوظيفته
GET/api/admin/overviewالموظفون الذين لديهم overview.viewالنظرة العامة: الإجماليات وسلسلة المبيعات والمبيعات بحسب الفعالية والمزوّد والفئة، والباب المباشر، والفعاليات القادمة، وما يحتاج إلى انتباه. range (last_7_days أو last_30_days أو this_month أو all)، والقيمة الافتراضية last_30_days
GET/api/admin/reportsالموظفون الذين لديهم reports.viewأرقام المبيعات نفسها، لـ range، أو from وto، واختياريًا event واحدة
POST/api/admin/reports/exportالموظفون الذين لديهم reports.exportابدأ ملف CSV: kind (orders أو sales أو attendees) وfilters اختيارية. يجيب 202 مع id الخاص به
GET/api/admin/reports/exports/:idالموظفون الذين لديهم reports.exportأين وصل التصدير؛ وعند الجاهزية، download_url الخاص به
GET/api/admin/reports/exports/:id/downloadأي شخص يحمل token الرابطملف CSV. يعمل الرابط ساعة واحدة ويظهر مرة واحدة

تُكتب ملفات CSV في EXPORT_DIR في الخلفية، ويُبنى رابط التنزيل من PUBLIC_API_URL.

مساحة العمل والدفع وإعدادات الموقع

الطريقةالمسارمن يحق له استدعاؤهوظيفته
GET/api/admin/workspaceالموظفون الذين لديهم settings.viewمساحة العمل: الاسم وبريد الدعم والعملة والمنطقة الزمنية ورسوم الحجز (fee_bps) وhold_seconds وmax_per_order (للقراءة فقط: هي أعمدة تُملأ من back-end/src/database/seeders/data/settings.json)، وnotification_settings، وهي مفاتيح جرس إشعارات الفريق
PATCH/api/admin/workspaceالموظفون الذين لديهم settings.editغيّر name أو support_email أو currency (USD أو EUR أو GBP أو AED أو SAR) أو time_zone أو fee_bps (من 0 إلى 2000، بأجزاء من مئة من النسبة المئوية؛ ويدفعها الحاضر دائمًا عند الدفع) أو notification_settings (order_paid وrefund_requested وcheckin_alerts)، مع version المحمَّل. تُقفل العملة متى باعت مساحة العمل (CURRENCY_LOCKED). وأي حقل آخر، ومنه fee_payer وhold_seconds وmax_per_order، يجيب 400
GET/api/admin/payment-providersالموظفون الذين لديهم settings.viewconfigured وlive وoffered لكل مزوّد. تبقى المفاتيح في .env الخاص بواجهة API ولا تُعاد أبدًا
GET/api/settingsالموظفون الذين لديهم settings.viewكل إعدادات الموقع. search وcategory وpage وpage_count
GET/api/settings/:keyالموظفون الذين لديهم settings.viewإعداد واحد بالمفتاح
PATCH/api/settings/:keyالموظفون الذين لديهم settings.editغيّر قيمة إعداد واحد
DELETE/api/settings/:keyالموظفون الذين لديهم settings.editاحذف إعدادًا واحدًا

الفريق والأدوار

الطريقةالمسارمن يحق له استدعاؤهوظيفته
GET/api/adminsالموظفون الذين لديهم admins.viewفريق مساحة العمل. email وname وphone (يجب أن يطابق كل ما يُعطى)، وpage وpage_count
GET/api/admins/statisticsالموظفون الذين لديهم admins.viewأعداد لقائمة الفريق
GET/api/admins/:idالموظفون الذين لديهم admins.viewعضو واحد، بالمعرّف أو اسم المستخدم
POST/api/adminsالموظفون الذين لديهم admins.createأضف عضوًا: first_name وlast_name وemail وpassword وpassword_confirmation (6 أحرف أو أكثر)، واختياريًا phone
PATCH/api/admins/:idالموظفون الذين لديهم admins.editغيّر عضوًا
PATCH/api/admins/:id/rolesالموظفون الذين لديهم admins.assign_rolesحدّد أدوار عضو: role_ids
DELETE/api/admins/:idالموظفون الذين لديهم admins.deleteأخرج عضوًا من مساحة العمل الحالية. لا يُحذف الحساب نفسه إلا إذا كانت تلك آخر مساحة له؛ ويجيب data.removed بـ workspace أو account. وإزالة نفسك تجيب 403 مع REMOVE_SELF، وإزالة آخر مالك في مساحة العمل 409 مع LAST_OWNER
PATCH/api/admins/profileأي موظف مسجَّل الدخولغيّر first_name أو last_name أو email أو phone أو profile_picture أو country_id الخاصة بالعضو المسجَّل دخوله. وأي password أو role_ids في الجسم يجيب 400: فلكلمة المرور مسارها الخاص
PATCH/api/admins/profile/passwordأي موظف مسجَّل الدخولغيّر كلمة مرور العضو المسجَّل دخوله نفسه: current_password وpassword وpassword_confirmation
GET/api/rolesالموظفون الذين لديهم roles.viewالأدوار. name وguard_name وcreated_from وcreated_to وpage وpage_count
GET/api/roles/statisticsالموظفون الذين لديهم roles.viewأعداد لقائمة الأدوار
GET/api/roles/selectالموظفون الذين لديهم roles.viewمعرّف كل دور واسمه، لقائمة الاختيار
GET/api/roles/permissionsالموظفون الذين لديهم roles.viewكل صلاحية، مجمعة حسب المنطقة
GET/api/roles/:idالموظفون الذين لديهم roles.viewدور واحد بصلاحياته
POST/api/rolesالموظفون الذين لديهم roles.createأضف دورًا: name
PUT/api/roles/:idالموظفون الذين لديهم roles.editأعد تسمية دور: name
POST/api/roles/:id/permissionsالموظفون الذين لديهم roles.assign_permissionsحدّد permissions الدور، بالاسم
DELETE/api/roles/:idالموظفون الذين لديهم roles.deleteحذف دور

الاستفسارات والإشعارات والملفات المرفوعة

الطريقةالمسارمن يحق له استدعاؤهوظيفته
GET/api/leadsالموظفون الذين لديهم leads.viewاستفسارات نموذج التواصل، مع أعداد لكل حالة. status وq وreceived_within_days وpage وpage_size
GET/api/leads/:idالموظفون الذين لديهم leads.viewاستفسار واحد
PATCH/api/leads/:idالموظفون الذين لديهم leads.editحدّد status (new أو contacted أو closed) أو notes أو assigned_admin_id
GET/api/notificationsأي موظف مسجَّل الدخولأحدث 30 إشعارًا للعضو المسجَّل دخوله
PATCH/api/notifications/read-allأي موظف مسجَّل الدخولحدّدها كلها كمقروءة
PATCH/api/notifications/:id/readأي موظف مسجَّل الدخولتعليم إشعار واحد كمقروء
DELETE/api/notifications/:idأي موظف مسجَّل الدخولحذف إشعار واحد
POST/api/helpers/uploadأي موظف مسجَّل الدخولخزّن ملفًا (file متعدد الأجزاء، مع path للمجلد، وfor لضبط الحجم المسبق مثل venue أو cover أو logo أو profile، وtype). تُحوَّل الصور إلى ترميز جديد بعرض لا يزيد على 1920 بكسل؛ وتُقبل مقاطع الفيديو بصيغ MP4 أو WebM أو MOV أو M4V؛ بحد أقصى 150 ميغابايت. يجيب بعناوين الملف المخزَّن

تغطي الإشعارات الطلبات المدفوعة وطلبات الاسترداد وتنبيهات الباب والاستفسارات الجديدة ومفاهيم الأماكن المنتهية، وتُحفظ 30 يومًا. ليس للملف المرفوع صلاحية خاصة: ما يصير إليه الملف يفحصه المسار الذي يحفظه. وتذهب الملفات إلى حاوية R2 متى ضُبطت متغيراتها الخمسة، وإلى MEDIA_UPLOAD_DIR في غير ذلك.

الحدود لكل عنوان

المسارالحدالمتغير
POST /api/auth/login, POST /api/customer-auth/login10 محاولات دخول فاشلة كل 15 دقيقة، كل نوع يُحسب على حدةRATE_LIMIT_LOGIN
POST /api/customer-auth/register10 كل 10 دقائقلا شيء
POST /api/customer-auth/forgot-password5 كل 10 دقائقلا شيء
POST /api/leads5 كل 10 دقائقلا شيء
POST /api/admin/check-in/validate, /admit120 في الدقيقة لكل موظفلا شيء
POST /api/customer-auth/resend-verification, POST /api/orders/:reference/resend-emailمرة في الدقيقةلا شيء

الطلب الذي يتجاوز حدًّا يُجاب بـ 429. العدّادات محفوظة في ذاكرة واجهة API، لذلك يمسحها إعادة التشغيل. خلف وكيل عكسي، اضبط TRUST_PROXY ليُحسب كل زائر على عنوانه.

مساعد الفعاليات بالذكاء الاصطناعي ومحادثاته

مُضمَّن مع مشترياتك. سجّل الدخول لقراءته، أو افتحه في ملف التنزيل.

مسار بث المساعد، وقائمة نماذجه، واعتماد المسودات، والمحادثات المحفوظة.

استوديو الأماكن

مُضمَّن مع مشترياتك. سجّل الدخول لقراءته، أو افتحه في ملف التنزيل.

مسارات الاستوديو: عمليات الإنشاء والمفاهيم المحفوظة في مكان.

خادم MCP

مُضمَّن مع مشترياتك. سجّل الدخول لقراءته، أو افتحه في ملف التنزيل.

نقطة نهاية MCP لوكلاء البرمجة وكيفية التصريح لها.

التحديثات المباشرة عبر WebSocket

مُضمَّن مع مشترياتك. سجّل الدخول لقراءته، أو افتحه في ملف التنزيل.

مساحات أسماء Socket.IO التي تستمع إليها لوحة التحكم، وأحداثها، وكيفية التصريح للاتصال.

مسارات وضع العرض التجريبي

مُضمَّن مع مشترياتك. سجّل الدخول لقراءته، أو افتحه في ملف التنزيل.

المسارات الموجودة فقط لبناء العرض التجريبي العام.

توقفت عند خطوة؟

ابحث عن الحل قبل أن تبدأ من جديد.

حل المشكلات

تفضيلات ملفات تعريف الارتباط

نستخدم ملفات تعريف الارتباط لتعزيز تجربة التصفح الخاصة بك وتحليل حركة المرور على الموقع وتخصيص المحتوى. بالنقر على "قبول الكل"، فإنك توافق على استخدامنا لملفات تعريف الارتباط للتحليلات والإعلانات المخصصة.