يمنح API العامة مسؤولي المنظمة وصولًا مباشرًا عبر HTTP إلى بيانات منظمتك الحية — اسحبها إلى أي موقع أو تطبيق أو بوت أو أتمتة تستطيع إرسال طلب HTTP. وهي ميزة في خطة Business.

صفحة API العامة: أنشئ مفتاح API للمنظمة، وفعّل تسجيل الدخول عبر Ludoya

المفتاح مقصور على منظمتك — وتعمل جميع نقاط النهاية على تلك المجموعة تلقائيًا. الرابط الأساسي: https://api.ludoya.com/public/v1. ترويسة المصادقة: X-Api-Key: YOUR_KEY. حد المعدل: 100 طلب في الدقيقة، وبعدها تحصل على 429.

تبدأ المفاتيح بـldy_ وطولها 36 حرفًا، فيسهل تمييزها في ملف إعدادات — ويسهل البحث عنها إن انتهى أحدها يومًا في مكان لا ينبغي. تعامل معه كأنه كلمة مرور: على الخادم فقط، واسحبه من الصفحة نفسها إن تسرّب.

ما الذي يمكنك الوصول إليه

  • المواقع — أماكن مجموعتك المتاحة ومواضعها؛ تُستخدم مدخلًا عند إنشاء الفعاليات
  • الفعاليات (قراءة) — الفعاليات القادمة والسابقة بعنوانها ووصفها وتاريخها ووقتها ومنطقتها الزمنية وسعتها وعدد مشاركيها وحالتها
  • الفعاليات (كتابة) — أنشئ الفعاليات وحدّثها عبر POST وPUT، مع تحكم كامل في الموقع والسعة والصلاحيات والظهور والصورة
  • الفعاليات الفرعية — اسرد الفعاليات المتداخلة داخل فعالية أب
  • المشاركون — أضف شخصًا إلى فعالية، أو غيّر حضوره، أو أزِله
  • الأعضاء — قائمة الأعضاء بملفاتهم وأدوارهم (مالك، مسؤول، عضو)، مقسمة إلى صفحات
  • الدعوات — ادعُ شخصًا إلى مجموعتك
  • البحث — ابحث عن مستخدمي Ludoya وعن فهرس ألعاب الطاولة، لتحويل الأسماء إلى معرّفات قبل الكتابة
  • المجموعة — مجموعة الألعاب مع التصفية حسب الملكية والاسم وعدد اللاعبين والقائمة؛ قابلة للترتيب ومقسمة إلى صفحات؛ وكل لعبة تتضمن بيانات BGG الوصفية
  • الإحصاءات — إحصاءات اللعب لأي فترة زمنية: الإجماليات والمتوسطات وأفضل اللاعبين بانتصاراتهم ونتائجهم، وتوزيعات حسب عدد اللاعبين والموقع واللعبة
  • الحملات (قراءة) — اسرد حملات المجموعة بأعداد الأعضاء والجلسات؛ واحصل على تفاصيل الحملة كاملة بما فيها الأعضاء والجلسات السابقة والفعاليات المجدولة
  • الحملات (كتابة) — أنشئ حملات للمجموعة وحدّث اسمها ووصفها وحالتها وظهورها
  • أعضاء الحملة — أضف الأشخاص في الحملة وحدّثهم وأزِلهم

نقاط النهاية

GET /locations

تُعيد المواقع المتاحة للمجموعة. ولكل موقع id وname وaddress اختياري وcapacity وراية isDefault ومصفوفة spots (ولكل موضع id وname وcapacity خاص به). استخدم معرّفات المواقع والمواضع عند إنشاء الفعاليات.

تسجيل الدخول عبر Ludoya

الصفحة نفسها التي تحوي مفتاح API تحوّل منظمتك أيضًا إلى مزوّد تسجيل دخول. دع الناس يسجّلون الدخول إلى موقعك أو منتداك أو منصة مجتمعك بحساباتهم على Ludoya — بلا كلمة مرور منفصلة ينسونها، وبلا قاعدة بيانات مستخدمين تديرها أنت.

لماذا يستحق ذلك

حين يوافق أحدهم على تسجيل الدخول، يُربط بمنظمتك: فبحسب سياسة الانضمام في مجموعتك إما يصير عضوًا فورًا (مفتوحة)، أو يقدّم طلب انضمام يوافق عليه مسؤول (بالطلب)، أو يسجّل الدخول فحسب دون انضمام (بالدعوة فقط). وفي كل الأحوال يظهر في نقطة النهاية /members كأي شخص آخر — فيبقى تسجيل الدخول في موقعك وقائمة أعضائك في Ludoya متوافقَين تلقائيًا.

كيفية الإعداد

إنه OpenID Connect القياسي، فلا تحتاج معظم المنصات إلى أكثر من رابط المُصدِر (issuer) ومعرّف العميل وسرّه. سجّل تطبيقك من صفحة API العامة للحصول على تلك البيانات، واذكر عناوين إعادة التوجيه التي سيستخدمها موقعك — يمكنك تسجيل عدة عناوين، وعلى كل واحد أن يطابق redirect_uri الذي يرسله موقعك حرفًا بحرف، بما في ذلك الشرطة المائلة الأخيرة. والتطابق شبه التام هو السبب الأشيع لفشل أول محاولة تسجيل دخول.

  • Discourse — ثبّت إضافة OpenID Connect، والصق رابط الاكتشاف، وأضف البيانات
  • WordPress — أي إضافة OpenID Connect عامة، باستخدام خيار "auto discover" فيها
  • أي شيء آخر — إن كان يتحدث OIDC فوجّهه إلى رابط المُصدِر وسيضبط نفسه

ويُعيد كل تسجيل دخول المعرّف الدائم للشخص واسم المستخدم والاسم المعروض والصورة الرمزية والبريد الإلكتروني. أما تعليمات الإعداد الكاملة، بما فيها التدفق اليدوي، فتوجد في دليل المطورين داخل التطبيق تحت Developers → Sign in with Ludoya.

لمن يسجّلون الدخول

كل من استخدم Ludoya لتسجيل الدخول في مكان ما يستطيع مراجعة تلك الاتصالات ضمن الإعدادات ← التطبيقات المتصلة، ورؤية متى رُبط كل منها ومتى استُخدم آخر مرة، وقطع أي منها في أي وقت. وقطع الاتصال ينهي وصول الموقع فورًا لكنه لا يزيله من مجموعتك.

GET /events

تُعيد الفعاليات القادمة والسابقة في قائمتين منفصلتين مقسمتين إلى صفحات.

المعامل النوع الافتراضي الوصف
onlyFuture boolean true اضبطها على false لإعادة الفعاليات السابقة أيضًا

تتضمن كل فعالية: type (MEETUP أو PLANNED_PLAY)، وtitle، وdescription، وstartsAt، وendsAt، وtimeZone، وimageUrl، وcapacity، وparticipantCount، وcanceled، وteacher (كائن مستخدم أو null)، وmaster (كائن مستخدم أو null). وتحتوي كائنات المستخدم على id، وusername، وname، وavatarUrl.

POST /events

تُنشئ فعالية في المجموعة. الحقول المطلوبة: type وtitle. وإن أُغفل locationId فيُستخدم الموقع الافتراضي للمجموعة؛ وإن لم يوجد فتُعيد 400.

تشمل الحقول الاختيارية: description، وlocationId، وspotId، وgameId، وparentEventId (للفعاليات الفرعية)، وstartsAt، وendsAt، وrestrictedAttendance، وcapacity، وminParticipants، وestimatedDurationMinutes، وmaxReservationsPerUser، وtakeGamesPermission، وorganizePlaysPermission، وteacherUserId، وmasterUserId، وvisibility، وimage.

يقبل الحقل image إما {"base64": "data:image/jpeg;base64,..."} or {"url": "https://..."}. بحد أقصى 5 ميغابايت.

تُعيد {"id": "string"} بالحالة 201.

PUT /events/{eventId}

يحدّث فعالية قائمة. بنية الطلب نفسها المستخدمة في POST — أدرج الحقول التي تريد تغييرها فقط. يجب أن يكون المُرسِل هو منظم الفعالية (حساب المجموعة). يُعيد 202 مع جسم فارغ.

GET /events/{eventId}

يجلب حدثًا واحدًا حسب المعرّف، بالبنية نفسها المستخدمة في عناصر GET /events.

GET /events/{eventId}/children

يعرض الفعاليات الفرعية المتداخلة داخل فعالية رئيسية — المسارات أو الجلسات الفردية ضمن تجمّع أكبر. لكل فعالية فرعية البنية نفسها المستخدمة في الفعالية العادية.

إدارة المشاركين

تتيح لك ثلاث نقاط نهاية إدارة قائمة حضور فعالية من خارج Ludoya — وهو أمر مفيد إن كان التسجيل يجري على موقعك أنت، أو إن كنت تستورد قائمة بالفعل.

الطريقة المسار ماذا تفعل
POST `/events/

GET /members

يعيد قائمة أعضاء مقسّمة إلى صفحات.

معامل النوع الافتراضي
pagination.size int 50
pagination.offset int 0

يتضمن كل عضو: id, username, name, avatarUrl, role (OWNER, ADMIN, أو MEMBER).

POST /members/invite

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

GET /collection

تُعيد مجموعة ألعابك مع التصفية والترتيب والتقسيم إلى صفحات.

المعامل النوع الافتراضي الوصف
filter string أزواج key=value مفصولة بفاصلة منقوطة. المفاتيح: ownership (OWNED، PREVIOUSLY_OWNED، PREORDERED، WISHLISTED)، وplayed (boolean)، وlistId، وnameFilter، وplayerCountFilterType (OFFICIAL، GOOD، BEST)، وplayerCountFilter (number)
groupExpansions boolean true اجمع التوسعات تحت لعبتها الأساسية
sort string الصيغة: property,direction — مثل name,asc
pagination string الصيغة: size,pageIndex — مثل 20,0

الاستجابة: totalGames، وtotalExpansions، وgames[] — ولكل منها: id، وslug، وname، وimageUrl، وisExpansion، وyearPublished، وminPlayerCount، وmaxPlayerCount.

GET /stats

تُعيد إحصاءات اللعب لنافذة زمنية قابلة للضبط.

المعامل النوع الافتراضي الوصف
period string ALL_TIME الصيغة: PERIOD,date,index. القيم: ALL_TIME، وONE_YEAR، وONE_MONTH، وTHIRTY_DAYS، وSEVEN_DAYS، وONE_DAY، وCUSTOM. ويُزيح index النافذة إلى الوراء (0 = الحالية، 1 = السابقة). مخصص: CUSTOM,startDate,0,endDate

تتضمن الاستجابة:

  • ملخصًا — إجمالي الجلسات، وإجمالي/متوسط وقت اللعب، وأعداد الألعاب واللاعبين والمواقع الفريدة
  • بحسب اللاعب — جلسات كل شخص وانتصاراته ومتوسط نتيجته وأفضلها
  • بحسب عدد اللاعبين — توزيع ألعاب اللاعبَين والثلاثة والأربعة وهكذا
  • بحسب الموقع — عدد الجلسات والألعاب الفريدة لكل مكان
  • بحسب اللعبة — عدد الجلسات وإجمالي/متوسط وقت اللعب واللاعبون الفريدون لكل عنوان

GET /campaigns

تُعيد قائمة مقسمة إلى صفحات بالحملات التابعة للمجموعة.

المعامل النوع الافتراضي الوصف
status string التصفية حسب الحالة: ACTIVE أو COMPLETED أو ARCHIVED
pagination.size int 50 عناصر لكل صفحة
pagination.offset int 0 الإزاحة

تتضمن كل حملة: id، وgame (id، name، imageUrl)، وname، وimage، وstatus، وvisibility، وcreatedAt، وupdatedAt، وmemberCount، وsessionCount.

GET /campaigns/{campaignId}

تُعيد التفاصيل الكاملة لحملة تابعة للمجموعة.

تتضمن الاستجابة: كل حقول القائمة، إضافة إلى template، وdescription، وglobalNotes، وglobalState، وmembers[] (ولكل منها user، وrole، وcharacterNotes، وcharacterState)، وsessions[]، وevents[].

POST /campaigns

تُنشئ حملة للمجموعة. الحقول المطلوبة: gameId وname. وإن أُغفل الظهور فالافتراضي هو أعضاء المجموعة وحدهم (ONLY_GROUP).

الحقول الاختيارية: templateId، وdescription، وvisibility (PUBLIC أو ONLY_GROUP أو ONLY_FRIENDS أو PRIVATE).

تُعيد {"id": "string"} بالحالة 201.

PUT /campaigns/{campaignId}

يحدّث حملة قائمة. جميع الحقول اختيارية — أدرج ما تريد تغييره فقط.

الحقول الاختيارية: name، description، status (ACTIVE، COMPLETED، ARCHIVEDvisibility.

يُعيد 202 مع جسم فارغ.

أعضاء الحملة

أدِر من في الحملة، بالطريقة نفسها التي تدير بها المشاركين في الفعالية.

الطريقة المسار ماذا تفعل
POST `/campaigns/

رموز الأخطاء

الحالة متى
400 فشل التحقق (حقل مطلوب مفقود، لم يُعثر على موقع، صورة غير صالحة)
401 مفتاح API مفقود أو غير صالح
403 الإجراء غير مسموح به أو المجموعة ليست على خطة Business
404 المورد غير موجود
429 تم تجاوز حد الطلبات

البدء

1. إنشاء مفتاح API

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

  1. انتقل إلى صفحة ملف مؤسستك
  2. انقر على القائمة () ← API العامة
  3. انقر على إنشاء مفتاح
  4. انسخ مفتاحك فورًا — فهو يُعرض مرة واحدة فقط ولا يمكن استرجاعه مرة أخرى

المفتاح مرتبط بمؤسستك. احتفظ به سرًا: أي شخص يملك المفتاح يمكنه قراءة كل البيانات المذكورة أعلاه والكتابة إليها.

2. السحب أو إعادة الإنشاء

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

راجع أيضًا: