واجهة API لنظام التذاكر هي ما يجعل كل تكامل آخر ممكنًا حين لا يوجد موصّل جاهز. الأسئلة التي تحدد جودتها ست: كيف تُصادق، وما حدود المعدّل، وكيف تُرقَّم النتائج، وهل توجد Webhooks أم استطلاع فقط، وكيف تُمنع الكتابة المكرّرة، وما مدى استقرار الإصدارات. لا تسأل «هل لديكم API» — الجواب دائمًا نعم.
«هل لديكم API؟» سؤال بلا قيمة، لأن الإجابة نعم من كل مزوّد على وجه الأرض. الفرق بين واجهة تبني عليها بثقة وواجهة تلعنها كل شهر يكمن في تفاصيل لا تظهر في العرض التجريبي أبدًا. هذا الدليل يعطيك الأسئلة التي تكشفها قبل التوقيع لا بعده.
تشريح واجهة صالحة للاعتماد
أغلب واجهات أنظمة التذاكر اليوم على نمط REST: موارد لها روابط (تذاكر، جهات اتصال، تعليقات)، وأفعال HTTP قياسية، ورموز حالة مفهومة، وحمولة JSON. هذا الحد الأدنى المتوقع. ما يميّز الجيدة عن الرديئة:
- رموز حالة صادقة — الواجهة التي تُعيد 200 مع
{"error": "..."}في الجسم تجبر كل عميل على تحليل النص لمعرفة النجاح. أسوأ ما قد تتعامل معه. - أخطاء قابلة للقراءة آليًا — رمز خطأ ثابت وحقل يحدد أي حقل أخطأ. رسالة نصية بالعربية لا يمكن التعامل معها برمجيًا.
- الحقول المخصّصة كمواطنين كاملين — إن كانت حقولك المخصّصة تُقرأ ولا تُكتب عبر الواجهة، فنصف تكاملاتك مستحيلة.
- توثيق ببيئة تجريب — وثائق حية بأمثلة قابلة للتنفيذ وبيئة اختبار منفصلة. توثيق PDF يعني واجهة مهجورة.
- سياسة إصدارات معلنة — كيف تُعلن التغييرات الكاسرة، وكم مدة دعم الإصدار السابق؟ بلا سياسة، أي تحديث قد يكسر تكاملك دون إنذار.
المصادقة: مفتاح ثابت أم OAuth؟
| النمط | كيف يعمل | الحكم |
|---|---|---|
| مفتاح API ثابت | سلسلة سرية تُرسل مع كل طلب، لا تنتهي صلاحيتها. | الأبسط والأخطر. من يسرّبه يملك وصولك للأبد. مقبول لتكامل خادم-إلى-خادم بشروط: نطاق مقيّد، وتدوير دوري، وتخزين في خزنة أسرار. |
| مفتاح بنطاق محدود | مفتاح مرتبط بصلاحيات محددة (قراءة التذاكر فقط مثلًا) وقابل للإلغاء منفردًا. | تحسّن جوهري. مفتاح لكل تكامل، بأقل صلاحية، ويُلغى دون أن يتأثر غيره. |
| OAuth 2.0 — بيانات العميل | يتبادل التطبيق معرّفه وسرّه برمز وصول قصير الأجل يتجدد. | الأنسب لتكامل الخوادم. الرمز المسروق ينتهي وحده، والصلاحيات محددة بنطاقات. |
| OAuth 2.0 — نيابة عن مستخدم | يأذن مستخدم للتطبيق بالعمل باسمه ضمن صلاحياته هو. | ضروري حين يجب أن تُنسب الأفعال لمستخدم بعينه لا لحساب خدمة عام. أساسي لسجل تدقيق ذي معنى. |
حدود المعدّل والترقيم
كل واجهة سحابية تفرض حدًا للطلبات، والسؤال ليس هل يوجد بل كم هو وكيف يُعلَن. الواجهة المهذّبة تُعيد رمز 429 مع ترويسة تخبرك متى تعيد المحاولة، وترويسات تبيّن رصيدك المتبقي فتتكيّف قبل الاصطدام. الواجهة الرديئة تُسقط الطلب بلا تفسير، أو تحظر مفتاحك ساعة بلا إنذار.
من جانبك، التعامل الصحيح هو التراجع الأسّي مع عشوائية: انتظر ثم أعد المحاولة بمضاعفة المهلة، وأضف تشويشًا عشوائيًا يمنع كل عملائك من إعادة المحاولة في اللحظة نفسها فيصنعوا موجة ثانية. وضع حدًا لعدد المحاولات ثم أرسل الطلب الفاشل إلى قائمة معالجة لاحقة بدل إسقاطه بصمت.
| الوجه | الترقيم بالإزاحة (offset/page) | الترقيم بالمؤشر (cursor) |
|---|---|---|
| الآلية | «أعطني 100 سجل بدءًا من رقم 200». | «أعطني 100 سجل بعد هذا المؤشر». |
| البيانات المتحركة | تكسر. إن أُنشئت تذكرة جديدة أثناء تصفحك، تنزاح السجلات فتقرأ سجلًا مرتين وتفوّت آخر تمامًا. | مستقر. المؤشر يشير إلى موضع ثابت في الترتيب مهما أُضيف أو حُذف. |
| الأداء على الأعماق | يتدهور. القفز إلى الصفحة الألف يكلف قاعدة البيانات كثيرًا. | ثابت تقريبًا مهما بلغ العمق. |
| القفز لصفحة بعينها | ممكن. | غير ممكن عادةً — تتقدم للأمام فقط. |
| الملاءمة | واجهة تصفح بشرية على بيانات ساكنة. | التصدير والمزامنة وأي قراءة برمجية لبيانات حية. هذا حالتك. |
الصف الثاني يستحق وقفة لأنه يفسّر أعطالًا تبدو سحرية. مثال افتراضي: تصدّر 5000 تذكرة ليلًا بالإزاحة، وتُنشأ تذاكر أثناء التصدير. النتيجة أن ملفك يحوي 5000 سجل — لكنها ليست الـ5000 الصحيحة: بعضها مكرر وبعضها غائب، والعدد الإجمالي سليم فلا ينتبه أحد. هذا النوع من الخلل يعيش شهورًا في تقارير يثق بها الجميع.
Webhooks مقابل الاستطلاع، والتكرار
| الوجه | Webhooks | الاستطلاع الدوري |
|---|---|---|
| الاتجاه | النظام يدفع إليك عند الحدث. | أنت تسأل النظام دوريًا: ما الجديد؟ |
| زمن الاستجابة | ثوانٍ. | بمقدار الفترة. |
| الكفاءة | نداء عند التغيير فقط. | أغلب النداءات تعود فارغة وتستهلك حدّك. |
| المتطلبات | نقطة استقبال عامة متاحة دائمًا، وتحقق من التوقيع، ورد سريع. | مهمة مجدولة وتتبّع لعلامة آخر تعديل. |
| عند الانقطاع | يُعاد الإرسال لعدد محدود من المرات، ثم يضيع الحدث نهائيًا. | ذاتي التعافي — الدورة التالية تلتقط ما فات. |
| التوصية | للأحداث العاجلة والتفاعلية. | كشبكة أمان مجدولة تسدّ ما ضاع. |
التصميم الناضج يستخدمهما معًا: Webhooks للسرعة، ومزامنة ليلية للسلامة. الاعتماد على Webhooks وحدها يعني أن انقطاعًا لعشرين دقيقة يترك ثقبًا صامتًا في بياناتك لا يكتشفه أحد إلا بعد شهر — وحينها لن تعرف حجمه.
ثلاث قواعد غير قابلة للتفاوض في استقبال Webhooks. الأولى: تحقق من التوقيع. نقطة استقبالك عامة، وأي أحد يستطيع إرسال حمولة مزيفة إليها؛ التوقيع المُحسَب بمفتاح مشترك هو ما يثبت أن الحدث من النظام فعلًا. الثانية: ردّ فورًا واعمل لاحقًا. استقبل، خزّن في طابور، ردّ بنجاح خلال ثوانٍ، ثم عالج. المعالجة داخل الطلب تعني مهلة انتهاء فإعادة إرسال فتكرار. الثالثة: افترض التكرار دائمًا. التسليم «مرة واحدة على الأقل» لا «مرة واحدة بالضبط»؛ سيصلك الحدث نفسه مرتين، وقد يصل مقلوب الترتيب.
منع التكرار: الفرق بين تكامل ناضج وآخر ساذج
السيناريو: ترسل طلب إنشاء تذكرة، فينقطع الاتصال قبل وصول الرد. هل أُنشئت التذكرة أم لا؟ لا تعرف. إن أعدت المحاولة فقد تُنشئ تذكرة مكرّرة، وإن لم تُعد فقد تفقد بلاغ عميل. هذه ليست حالة نادرة؛ إنها تحدث كل يوم على أي شبكة.
- هل الوثائق عامة ومتاحة الآن قبل التوقيع؟ (رفض إعطائها إشارة كافية بذاتها.)
- هل توجد بيئة اختبار منفصلة، وكيف نحصل عليها؟
- ما أنماط المصادقة المدعومة؟ وهل تُدعم مفاتيح بنطاق محدود قابلة للإلغاء منفردة؟
- ما حدود المعدّل بالأرقام؟ وهل تُعاد ترويسات تبيّن الرصيد المتبقي ووقت إعادة المحاولة؟
- هل الترقيم بالإزاحة أم بالمؤشر؟ وما الحد الأقصى للسجلات في الصفحة؟
- هل تُقرأ وتُكتب الحقول المخصّصة عبر الواجهة، أم تُقرأ فقط؟
- ما الأحداث المتاحة عبر Webhooks؟ وما سياسة إعادة المحاولة وكيف يُتحقق من التوقيع؟
- هل يوجد سجل بالأحداث المرسلة يمكن مراجعته وإعادة إرسال ما فشل منه يدويًا؟
- هل تُدعم مفاتيح منع التكرار، أو حقل مرجع خارجي فريد على التذكرة؟
- ما سياسة الإصدارات؟ كم مدة دعم الإصدار السابق، وكيف تُعلَن التغييرات الكاسرة؟
- هل تُدعم العمليات الدفعية للتعبئة الأولية، أم سجل بسجل ضمن الحد نفسه؟
- هل نستطيع تصدير كل بياناتنا عبر الواجهة إن قررنا المغادرة؟
البند الأخير هو الأهم استراتيجيًا. واجهة تسمح بإدخال كل شيء ولا تسمح بإخراجه هي قفل مورّد بشكل مهذّب. اجعل التصدير الكامل بندًا في العقد لا وعدًا في العرض؛ هو ما يجعل قرار البقاء اختيارًا لا اضطرارًا. هذه الأسئلة تنتمي إلى نفس عائلة ما تجمعه في قائمة متطلبات نظام التذاكر، وتُطرح عمليًا ضمن أسئلة العرض التجريبي — لا في اجتماع تفاوض السعر. أما بقية القدرات التي تُبنى فوق هذه الواجهة فتجدها في مزايا نظام TixDesk.
الأسئلة الشائعة
ما الفرق بين Webhook وAPI؟
الاتجاه. مع API أنت تنادي النظام وتطلب شيئًا. مع Webhook النظام ينادي خادمك ويخبرك بحدث وقع. الأول تسحب به، والثاني يُدفع إليك. أغلب التكاملات تحتاج الاثنين: Webhook يخبرك أن شيئًا تغيّر، ثم نداء API لجلب التفاصيل الكاملة وتنفيذ إجراء.
كم فترة استطلاع مناسبة؟
لا يوجد رقم صحيح مطلقًا؛ اشتقّه من حدّك ومن حاجتك. القاعدة: أطول فترة تحقق متطلبك الفعلي، لا أقصر فترة يسمح بها الحد. إن كان التكامل يعبّئ لوحة تُراجَع صباحًا فالاستطلاع كل ساعة كافٍ، واستطلاع كل دقيقة يهدر حدّك على نداءات فارغة ويخنق تكاملاتك الأخرى. للحاجات اللحظية استخدم Webhooks بدل تقصير الفترة.
لماذا تظهر تذاكر مكرّرة رغم أن الكود يرسل مرة واحدة؟
غالبًا بسبب إعادة محاولة بعد انتهاء مهلة. طلبك وصل ونُفّذ، لكن الرد لم يعد إليك في الوقت، فاعتبرته فشلًا وأعدت الإرسال — فأُنشئت تذكرة ثانية. العلاج مفتاح منع تكرار ثابت عبر المحاولات، أو حقل مرجع خارجي فريد تبحث به قبل الإنشاء. لا تعالجها بإطالة المهلة؛ ذلك يؤجّل المشكلة فقط.
هل أبني التكامل بنفسي أم أستخدم منصّة وسيطة؟
البناء المباشر يعطيك تحكمًا كاملًا ولا رسوم اشتراك، مقابل كود تصونه إلى الأبد. المنصّة الوسيطة تختصر أسابيع وتتولى إعادة المحاولة والسجلات، مقابل اشتراك وطبقة إضافية ونقطة فشل. المعيار: عدد التكاملات وتوفر قدرة تطوير لديك. تكامل واحد بسيط؟ ابنِه. خمسة تكاملات وفريق بلا وقت؟ المنصّة أرخص فعليًا.
ما الذي يجب تسجيله من عمليات التكامل؟
سجّل لكل نداء: الوقت، والوجهة، ورمز الحالة، ومعرّف الطلب إن أعادته الواجهة، ومفتاح منع التكرار. لا تسجّل الحمولة كاملة إن حوت بيانات شخصية. الأهم أن يكون السجل قابلًا للبحث حين يسأل أحدهم «لماذا لم تُنشأ التذكرة أمس الساعة الثالثة؟» — بلا هذا السجل، الإجابة تخمين.