كل مثال في هذه الصفحة هو طلب كامل وقابل للتشغيل. استبدل المفتاح والمحتوى بما يخصّك وسيعمل كما هو.
المصادقة
لا رؤوس (headers) ولا رمز حامل (bearer token). ينتقل بيانا الاعتماد كلاهما داخل محتوى JSON لكل طلب، ولا يُقبل المفتاح إلا للحساب الذي يخصّه ذلك البريد الإلكتروني.
الحقل
النوع
ما يفعله
account_api_key
مطلوب
string
string
مفتاح API الخاص بحسابك. يُوضع في المحتوى، لا في رأس الطلب.
email
مطلوب
string
string
العنوان الذي يسجّل به حسابك على Puzzel.org الدخول. لا يكون المفتاح صالحًا إلا معه.
يوجد مفتاحك في قسم الحساب من لوحة التحكم، خلف زر "إظهار".
تعامل مع المفتاح معاملة كلمة المرور. فهو ينشئ الأنشطة ويستبدلها في حسابك، لذا احتفظ به على الخادم بعيدًا عن أي شيء يمكن للمتصفح قراءته.
محتوى الطلب
تأخذ كل نقطة نهاية الحقول الخمسة نفسها. ما يختلف هو حقل المحتوى تحتها: تأخذ معظمها مصفوفة من items، ويأخذ بعضها جملة واحدة أو صورة واحدة، ولا يأخذ السودوكو شيئًا على الإطلاق.
الحقل
النوع
ما يفعله
account_api_key
مطلوب
string
string
مفتاح API الخاص بحسابك. يُوضع في المحتوى، لا في رأس الطلب.
email
مطلوب
string
string
العنوان الذي يسجّل به حسابك على Puzzel.org الدخول. لا يكون المفتاح صالحًا إلا معه.
title
اختياري
string
string
الاسم الذي يحمله النشاط في لوحة التحكم. اتركه فارغًا لتستخدم نقطة النهاية اسمها الاحتياطي الخاص.
language
اختياري
string
string
يحدّد فقط اللغة في الرابط الذي تحصل عليه — ولا يترجم أي شيء ترسله. تقرؤه الكلمات المخفية أيضًا لتبديل حروف الحشو إلى العربية عندما تكون قيمته "ar".
الافتراضي: "en"
activity_key
اختياري
string
string
اتركه فارغًا لإنشاء نشاط جديد. مرّر مفتاح نشاط تملكه بالفعل ليُعاد بناء ذلك النشاط بدلًا من ذلك.
settings كائن يحوي خيارات خاصة بكل نقطة نهاية. الخيارات التي تقرأها كل نقطة نهاية مذكورة معها أدناه؛ وأي شيء آخر تضعه فيها يُتجاهَل.
ما الذي يعود إليك
يردّ الطلب الناجح بالرمز 200 مع مفتاح النشاط الجديد والرابط الذي يُلعب عليه. وأي حالة أخرى تردّ بقيمة success مضبوطة على false ونص خطأ واحد.
{
"success": false,
"error": "Invalid Email or API Key"
}
الرابط url الذي تحصل عليه هو عرض التضمين. استبدل embed بـ play لفتحه في صفحة كاملة، أو بـ build لفتحه في المحرِّر — يبقى المفتاح بعد p= كما هو.
الإنشاء مقابل التحديث
أرسل activity_key ليُعاد بناء النشاط الذي يمثّله في مكانه: يُستبدَل محتواه، ويُحدَّث اسمه وختم نسخته، ويبقى المفتاح نفسه كما هو — فتظل الروابط وأدوات التضمين التي شاركتها من قبل تعمل. أما النتائج ومكان المجلد وكل إعداد لا تكتبه نقطة النهاية بنفسها فتبقى كما كانت.
activity_key
{
"account_api_key": "YOUR_API_KEY",
"email": "you@example.com",
"activity_key": "-Nq8sample_activity_key",
"title": "Fruit crossword, week 2",
"items": [
{
"answer": "BANANA",
"description": "A long yellow fruit",
"type": "text"
},
{
"answer": "CHERRY",
"description": "A small red stone fruit",
"type": "text"
},
{
"answer": "MELON",
"description": "Big, green outside, sweet inside",
"type": "text"
}
]
}
يُطبَّق title في كل تحديث، بما في ذلك قيمته الافتراضية — اتركه فارغًا ليُعاد تسمية النشاط باسم نقطة النهاية الاحتياطي.
تُعاد كتابة كتل الإعدادات التي تكتبها نقطة النهاية بنفسها من الصفر، لذا يعيد التحديث أيضًا ضبطها على القيم التي ترسلها، أو على القيم الافتراضية لنقطة النهاية.
لا يمكنك تحديث إلا الأنشطة التي يملكها حسابك. مفتاح حساب آخر يردّ بالرمز 403.
يكلّف التحديث مثل الإنشاء تمامًا: طلبًا واحدًا يُخصَم من حصة اليوم.
حد معدل الطلبات
10
10 أنشطة لكل حساب يوميًا
يُحتسَب كل طلب ناجح، سواء كان إنشاءً أو تحديثًا. وإذا تجاوزت الحد، يردّ الطلب التالي بالرمز 429 حتى تُصفَّر العدّادات.
تُصفَّر العدّادات مرة واحدة يوميًا بمهمة مجدولة، لا وفق نافذة متحركة مدتها 24 ساعة.
الأخطاء
تصل الأخطاء دائمًا بصيغة JSON بالحقلين نفسهما، ولا تصل أبدًا كصفحة HTML. نص الخطأ مكتوب ليقرأه إنسان — فهو يسمّي الحقل أو الحد الذي فشل.
الحالة
ما يعنيه
400
Bad Request
شيء ما في المحتوى مفقود أو غير صحيح الصياغة أو خارج النطاق المسموح. تسمّي الرسالة الحقل المعني.
401
Unauthorized
البريد الإلكتروني غير معروف، أو المفتاح لا يخصّ ذلك الحساب.
403
Forbidden
activity_key الذي أرسلته يخصّ حسابًا آخر.
429
Too Many Requests
استُنفدت حصة اليوم. تُصفَّر مرة واحدة يوميًا.
500
Server Error
لم يتمكّن المولّد من بناء لغز مما أرسلته — غالبًا بسبب قلة الكلمات، أو كلمات يتعذّر ترتيبها معًا.
نقاط النهاية
مسار واحد لكل نوع نشاط، جميعها POST، وجميعها تحت الرابط الأساسي نفسه. تسرد كل واحدة المحتوى الذي تحتاجه، والإعدادات التي تقرؤها، وطلبًا يمكنك تشغيله.
POST/api/public/v1/typing-practiceعلى الأقل 1 عناصر في items
المحتوى
api_c_typing_practice
تعود إلى الاسم الاحتياطي "Typing Practice API"
طلب مثال
POST typing-practice
curl -X POST https://puzzel.org/api/public/v1/typing-practice \
-H "Content-Type: application/json" \
-d '{
"account_api_key": "YOUR_API_KEY",
"email": "you@example.com",
"title": "Typing Practice",
"language": "ar",
"items": [
{
"answer": "The quick brown fox jumps over the lazy dog",
"description": "Every letter of the alphabet",
"type": "text"
},
{
"answer": "Pack my box with five dozen liquor jugs",
"description": "Another pangram",
"type": "text"
}
]
}'
نجاح
{
"success": true,
"id": "-Nq8sample_activity_key",
"url": "https://puzzel.org/en/typing-practice/embed?p=-Nq8sample_activity_key",
"message": "Typing Practice created successfully"
}
مصفوفة من الأسئلة. تحمل أسئلة الاختيار من متعدد إجاباتها؛ وتحمل الأسئلة المفتوحة الإجابة التي تقبلها.
تعود إلى الاسم الاحتياطي "Quiz API"
جدير بالمعرفة
قيمة question_type إما "multiple_choice"، حيث يحمل الخيار الصحيح isCorrect بقيمة true، أو "open_answer"، التي تستخدم correct_answer بدلًا من ذلك. إن تُركت فارغة، تُعامَل كاختيار من متعدد.
تمرّر نقطة نهاية الاختبار settings مباشرة كما هي كتل إعدادات النشاط، لذا فهي ليست مكانًا لخيارات متفرقة — عدّل الاختبار في المحرِّر بعد ذلك.
طلب مثال
POST quiz
curl -X POST https://puzzel.org/api/public/v1/quiz \
-H "Content-Type: application/json" \
-d '{
"account_api_key": "YOUR_API_KEY",
"email": "you@example.com",
"title": "Quiz",
"language": "ar",
"items": [
{
"question_type": "multiple_choice",
"description": "Which fruit is yellow?",
"answers": [
{
"type": "text",
"description": "Banana",
"isCorrect": true
},
{
"type": "text",
"description": "Cherry",
"isCorrect": false
}
]
},
{
"question_type": "open_answer",
"description": "What colour is a lemon?",
"correct_answer": "Yellow",
"explanation": "Lemons ripen from green to yellow."
}
]
}'
POST/api/public/v1/board-gameعلى الأقل 1 عناصر في items
المحتوى
api_c_board_game
تعود إلى الاسم الاحتياطي "Board Game API"
جدير بالمعرفة
قيمة question_type إما "multiple_choice"، حيث يحمل الخيار الصحيح isCorrect بقيمة true، أو "open_answer"، التي تستخدم correct_answer بدلًا من ذلك. إن تُركت فارغة، تُعامَل كاختيار من متعدد.
الإعدادات التي تقرؤها
الحقل
النوع
ما يفعله
number_of_tiles
اختياريفي settings
number
number
عدد مربّعات اللوح. بين 10 و75.
الافتراضي: 30
game_mode
اختياريفي settings
string
string
ما إذا كان اللاعبون يتسابقون إلى خط النهاية أم يجمعون عناصر في الطريق.
واحد منrace_to_finishcollect_items
الافتراضي: "race_to_finish"
طلب مثال
POST board-game
curl -X POST https://puzzel.org/api/public/v1/board-game \
-H "Content-Type: application/json" \
-d '{
"account_api_key": "YOUR_API_KEY",
"email": "you@example.com",
"title": "Board Game",
"language": "ar",
"items": [
{
"question_type": "multiple_choice",
"description": "Which fruit is yellow?",
"answers": [
{
"type": "text",
"description": "Banana",
"isCorrect": true
},
{
"type": "text",
"description": "Cherry",
"isCorrect": false
}
]
},
{
"question_type": "open_answer",
"description": "What colour is a lemon?",
"correct_answer": "Yellow",
"explanation": "Lemons ripen from green to yellow."
}
],
"settings": {
"number_of_tiles": 30,
"game_mode": "race_to_finish"
}
}'
نجاح
{
"success": true,
"id": "-Nq8sample_activity_key",
"url": "https://puzzel.org/en/board-game/embed?p=-Nq8sample_activity_key",
"message": "Board Game created successfully"
}
لا ترسل items ولا sentence — الحجم والصعوبة هما المُدخل بأكمله.
لا يوفّر المحرِّر إعداد الصعوبة إلا للأحجام 2x3 و3x3 و3x4. أما API فيطبّقه على كل الأحجام، بما فيها 2x2 و4x4.
الإعدادات التي تقرؤها
الحقل
النوع
ما يفعله
size
اختياريفي settings
string
string
حجم الكتلة الواحدة، مكتوبًا كصفوف × أعمدة — يعطي 3x3 الشبكة الكلاسيكية 9x9. لا تتحقق نقطة النهاية إلا من إمكانية تفسيره كرقمين، لذا التزم بالأحجام التي يوفّرها المحرِّر.
رابط صورة واحد، في حقل image. لا تأخذ نقطة النهاية هذه أي items.
تعود إلى الاسم الاحتياطي "Jigsaw Game API"
جدير بالمعرفة
ينشئ API دائمًا صورة مقطّعة بحجم 4×4. عدد القطع والقطع غير المنتظمة والحواف المستقيمة إعدادات خاصة بالمحرِّر — إرسال rows أو columns هنا لا يفعل شيئًا.
يُخزَّن الرابط كما أرسلته ولا يُنسخ الملف أبدًا، لذا يجب أن يبقى قابلًا للوصول العام طالما ظل النشاط يُلعب.
الإعدادات التي تقرؤها
الحقل
النوع
ما يفعله
image
مطلوب
string
string
الرابط المطلق للصورة المراد تقطيعها. يُرسَل في المستوى الأعلى، لا داخل settings.