POST /device/code
يبدأ تدفق رمز الجهاز ويعيد رمزاً للاعب ورابطاً جاهزاً للموافقة.
جسم الطلب: {"game_id": "..."}
كل ما تحتاجه لدمج لعبتك مع المنصة: تسجيل دخول اللاعبين دون مشاركة كلمات المرور، ولوحات الصدارة، والحفظ السحابي.
API Base URL: https://blindgames.info/api/dev
ثلاث خطوات لتشغيل لعبتك على المنصة:
كل طلب إلى الـ API يجب أن يحمل ترويستي المفتاح والسرّ. لا ترسل السرّ في كود اللعبة المنشور للاعبين؛ ضعه في الخادم الخاص بلعبتك إن أمكن.
الترويسات المطلوبة في كل طلب:
X-API-Key: your_api_key
X-API-Secret: your_api_secret
يربط اللاعب حسابه بلعبتك دون أن يعطيك كلمة مروره، عبر تدفق رمز الجهاز:
مثال:
POST https://blindgames.info/api/dev/device/code
Content-Type: application/json
{"game_id": "your_game_id"}
# Response
{
"user_code": "ABCD2345",
"device_code": "long-opaque-code",
"verification_uri": "https://blindgames.info/api/dev/../device",
"verification_uri_complete": "https://blindgames.info/api/dev/../device?code=ABCD2345",
"expires_in": 600,
"interval": 5
}
يتحقق من حالة الموافقة. أعد المحاولة كل 5 ثوانٍ حتى تتغير الحالة من authorization_pending.
POST https://blindgames.info/api/dev/device/token
Content-Type: application/json
{"device_code": "long-opaque-code"}
# Response while waiting
{"status": "authorization_pending"}
# Response after approval
{
"status": "approved",
"session_token": "session-token-value",
"player": {"id": "...", "display_name": "...", "avatar": "..."}
}
رمز الجلسة يُرسل في ترويسة X-Session-Token مع الطلبات الخاصة باللاعب (مثل حفظ النقاط أو الحفظ السحابي).
يمكن للاعب الواحد امتلاك عدة شخصيات داخل اللعبة، ولكل شخصية خاناتها المستقلة للحفظ. الحقل profile يربط كل خانة بشخصية معينة، وتركه فارغاً يعني حفظاً على مستوى اللعبة دون شخصية (متوافق مع السلوك القديم).
الهرمية الكاملة:
player
└── profile (character) ← optional, free-form key OR profile_id
└── slot ← e.g. "default", "checkpoint", "settings"
└── data ← up to 1 MiB, any text you serialize
POST /device/codeيبدأ تدفق رمز الجهاز ويعيد رمزاً للاعب ورابطاً جاهزاً للموافقة.
جسم الطلب: {"game_id": "..."}
POST /device/tokenيتحقق من حالة الموافقة. أعد المحاولة كل 5 ثوانٍ حتى تتغير الحالة من authorization_pending.
جسم الطلب: {"device_code": "..."}
GET /playerيعيد المعلومات العامة للاعب المرتبط بالجلسة.
الترويسات: X-Session-Token
{"player": {"id": "...", "display_name": "...", "avatar": "..."}}
POST /scoreيسجّل نقطة في لوحة الصدارة. يُحفظ أعلى رقم فقط لكل لاعب ووضع.
الترويسات: X-Session-Token
POST https://blindgames.info/api/dev/score
X-Session-Token: session-token-value
Content-Type: application/json
{"game_id": "your_game_id", "score": 1500, "mode": "default", "display_name": "Knight", "profile": "rec123", "metadata": {"difficulty": "hard", "duration": 95, "items": false}}
# Response
{"ok": true, "improved": true}
الحقلان display_name وprofile اختياريان: اسمح للاعب باختيار الاسم الظاهر في الصدارة (اسم حسابه أو اسم شخصيته). إن تركت display_name فارغاً يُستخدم اسم الحساب تلقائياً.
الحقل metadata اختياري وحرّ: كائن JSON بمفاتيح تعرّفها أنت لتمييز كيف تحققت النتيجة (الصعوبة، مدة الجولة، أي شيء يخص لعبتك). عرّف الأعمدة المقابلة من لوحة المطورين عبر «حقول لوحة الصدارة»، وأي مفتاح بلا حقل معرَّف يُحفظ دون أن يُعرض.
GET /leaderboardيعيد أعلى النقاط للعبة ووضع محدد.
GET https://blindgames.info/api/dev/leaderboard?game_id=your_game_id&mode=default&limit=20
# Response
{"fields": [
{"key": "difficulty", "label": "Difficulty", "type": "text"},
{"key": "duration", "label": "Time", "type": "duration"}
],
"leaderboard": [
{"rank": 1, "display_name": "...", "score": 9000, "metadata": {"difficulty": "hard", "duration": 95}},
{"rank": 2, "display_name": "...", "score": 7500, "metadata": {"difficulty": "easy", "duration": 140}}
]}
تُعرض الصدارة أيضاً تلقائياً في صفحة عامة بالموقع على /games/SLUG/leaderboard بالأعمدة التي عرّفتها، فيراها الجميع دون أي عمل إضافي منك.
GET /banيتحقق إن كان اللاعب الحالي محظوراً من لعب لعبتك. يتطلّب جلسة لاعب نشطة. أنت تضبط الحظر والسبب والمدة من لوحة المطورين.
الترويسات: X-Session-Token
GET https://blindgames.info/api/dev/ban?game_id=your_game_id
X-Session-Token: session-token-value
# Response (not banned)
{"banned": false}
# Response (banned)
{"banned": true, "reason": "...", "permanent": false, "expires_at": "2025-01-01T00:00:00Z", "remaining_seconds": 86400}
عند الحظر النهائي يكون permanent=true بلا remaining_seconds، فلا تعرض وقتاً متبقياً. ينتهي الحظر المؤقت تلقائياً عند انقضاء مدته. السبب خاص بهذا اللاعب فقط.
GET /saveيقرأ خانة الحفظ السحابي للاعب.
الترويسات: X-Session-Token
GET https://blindgames.info/api/dev/save?game_id=your_game_id&profile=hero1&slot=default
X-Session-Token: session-token-value
# Response
{"data": "...", "exists": true}
المعامل profile اختياري في كل عمليات الحفظ؛ احذفه للحفظ على مستوى اللعبة.
PUT /saveيكتب خانة الحفظ السحابي للاعب (الحد الأقصى 1 ميجابايت لكل خانة).
الترويسات: X-Session-Token
PUT https://blindgames.info/api/dev/save
X-Session-Token: session-token-value
Content-Type: application/json
{"game_id": "your_game_id", "profile": "hero1", "slot": "default", "data": "..."}
# Response
{"ok": true}
GET /savesيعرض قائمة خانات الحفظ الموجودة للاعب (الأسماء والأحجام) دون البيانات.
الترويسات: X-Session-Token
GET https://blindgames.info/api/dev/saves?game_id=your_game_id
X-Session-Token: session-token-value
# Response (omit profile to list every character's slots)
{"saves": [
{"profile": "hero1", "slot": "default", "size": 1240, "updated_at": "2026-06-14T10:00:00Z"},
{"profile": "hero2", "slot": "checkpoint", "size": 980, "updated_at": "2026-06-14T11:30:00Z"}
]}
DELETE /saveيحذف خانة حفظ سحابي للاعب. عملية مكرّرة الأثر (idempotent).
الترويسات: X-Session-Token
DELETE https://blindgames.info/api/dev/save
X-Session-Token: session-token-value
Content-Type: application/json
{"game_id": "your_game_id", "profile": "hero1", "slot": "default"}
# Response
{"ok": true, "deleted": true}
GET /profilesيعرض قائمة شخصيات اللاعب في اللعبة مع بياناتها الوصفية.
الترويسات: X-Session-Token
GET https://blindgames.info/api/dev/profiles?game_id=your_game_id
X-Session-Token: session-token-value
# Response
{"profiles": [
{"id": "rec123", "name": "Knight", "data": "...", "last_played": "2026-06-15T09:00:00Z", "created_at": "...", "updated_at": "..."}
]}
الحقل last_played يُحدَّث تلقائياً عند كل حفظ تحت الشخصية، أو يدوياً عبر POST /profile/select. اعرضه في قائمة الشخصيات ليرى اللاعب آخر مرة لعب بكل شخصية.
POST /profileينشئ شخصية جديدة للاعب ويعيد معرّفها. حقل البيانات الوصفية حر حتى 1 ميجابايت.
الترويسات: X-Session-Token
POST https://blindgames.info/api/dev/profile
X-Session-Token: session-token-value
Content-Type: application/json
{"game_id": "your_game_id", "name": "Knight", "data": "..."}
# Response
{"profile": {"id": "rec123", "name": "Knight", "data": "...", "created_at": "...", "updated_at": "..."}}
استخدم القيمة id الناتجة كقيمة profile في خانات الحفظ لربطها بهذه الشخصية.
PUT /profileيعدّل اسم الشخصية أو بياناتها الوصفية. الحقول اختيارية، يُحدّث المُرسل منها فقط.
الترويسات: X-Session-Token
PUT https://blindgames.info/api/dev/profile
X-Session-Token: session-token-value
Content-Type: application/json
{"game_id": "your_game_id", "profile_id": "rec123", "name": "Paladin", "data": "..."}
# Response
{"ok": true, "profile": { ... }}
DELETE /profileيحذف الشخصية وكل خانات الحفظ المرتبطة بها (حذف متتالٍ).
الترويسات: X-Session-Token
DELETE https://blindgames.info/api/dev/profile
X-Session-Token: session-token-value
Content-Type: application/json
{"game_id": "your_game_id", "profile_id": "rec123"}
# Response
{"ok": true, "deleted": true}
POST /profile/selectيسجّل وقت آخر لعب للشخصية عند اختيار اللاعب لها، ويعيد بياناتها المحدّثة.
الترويسات: X-Session-Token
POST https://blindgames.info/api/dev/profile/select
X-Session-Token: session-token-value
Content-Type: application/json
{"game_id": "your_game_id", "profile_id": "rec123"}
# Response
{"ok": true, "profile": { ..., "last_played": "2026-06-15T09:00:00Z"}}
تعيد نقاط النهاية رمز حالة HTTP مناسباً مع حقل error يصف المشكلة:
{"error": "invalid_credentials"}
missing_credentials / invalid_credentialsmissing_session_token / invalid_session / session_expiredinvalid_requesttoo_many_pendinginvalid_device_code / expired_token / access_deniedscore_out_of_rangesave_too_largeprofile_not_foundforbiddenserver_errorإن واجهتك مشكلة أو كان لديك اقتراح، تواصل معنا عبر صفحة التواصل. اتصل بنا