أنشئ API Key من Dashboard الجيم
ادخل API & Integrations، اضغط إنشاء API Key، ثم اختر الاسم المناسب، الـScopes، والفروع المسموح بها لهذا التكامل.
ابدأ من Quick Start، افهم شكل المصادقة والصلاحيات، ثم انزل إلى كل Endpoint مع أمثلة Request وResponse كاملة. لا يوجد هنا محتوى محشور أو Scroll داخلي يضيعك.
الفكرة بسيطة: تنشئ API Key من Dashboard الجيم، تعطيها الـScopes والفروع المناسبة، ثم يستخدمها تطبيقك أو Backend وسيط للاتصال بـGymDesk API. كل طلب يُعزل تلقائيًا داخل نفس الجيم.
ادخل API & Integrations، اضغط إنشاء API Key، ثم اختر الاسم المناسب، الـScopes، والفروع المسموح بها لهذا التكامل.
المفتاح يُعرض مرة واحدة فقط. خزّنه في Backend، أو Environment Variable، ولا تضعه داخل APK عام أو داخل Git repository.
هذا الطلب يؤكد أن الاتصال صحيح، ويُرجع لك بيانات الجيم، والباقة، والصلاحيات، وتقييد الفروع للمفتاح.
curl 'https://api.gymdesk-system.com/api/v1/external/v1/me' \
-H 'Authorization: Bearer gym_live_YOUR_API_KEY' \
-H 'Accept: application/json'{
"success": true,
"data": {
"tenant": {
"name": "Power House Gym",
"slug": "power-house-gym"
},
"apiKey": {
"name": "Mobile App Production",
"planCode": "starter",
"scopes": [
"members:read",
"attendance:read"
]
}
}
}Base URL
https://api.gymdesk-system.com/api/v1/external/v1أضف المسار بعد هذا العنوان، مثل /me أو /members أو /attendance.
كل Request لازم يحمل الـAPI Key. الأسهل والأوضح هو Authorization header. كل مفتاح مربوط تلقائيًا بجيم واحد فقط، لذلك لا يستطيع الوصول إلى بيانات Tenant آخر حتى لو حاول.
Authorization: Bearer gym_live_YOUR_API_KEYأفضل ممارسة: أنشئ API Key منفصل لكل Integration، وأعطه أقل صلاحيات ممكنة. بهذه الطريقة لو ألغيت التكامل أو حدثت مشكلة، يمكنك إيقافه وحده.
branches:readstaff:readcoaches:readmembers:readmembers:writesubscriptions:readpayments:readattendance:readattendance:writeclasses:readprivate_coaching:readsales:readfinance:readequipment:readdevices:readdaily_sessions:readdashboard:readreports:readpayroll:readكل المسارات التي ترجع قوائم تستخدم page وlimit. في الـExternal API الحد الأقصى هو 200 عنصر في الطلب الواحد.
GET https://api.gymdesk-system.com/api/v1/external/v1/members?page=1&limit=50{
"success": true,
"data": [
"..."
],
"meta": {
"page": 1,
"limit": 50
}
}كل جيم له حد شهري مشترك على مستوى الباقة، وحد لكل دقيقة. كل المفاتيح داخل نفس الجيم تشترك في نفس الحد الشهري.
X-RateLimit-Limitالحد المسموح في الدقيقة
X-RateLimit-Remainingالمتبقي من حد الدقيقة الحالية
X-Monthly-Limitالحد الشهري للجيم
X-Monthly-Remainingالمتبقي من الحد الشهري
Retry-Afterعدد الثواني المقترح انتظارها بعد 429
اعتمد على code البرمجي داخل الاستجابة، وليس النص المعروض فقط. هذا يسهل عليك بناء منطق واضح داخل التطبيق الخارجي.
| HTTP | Code | Meaning |
|---|---|---|
| 401 | API_KEY_REQUIRED | API Key غير موجود أو تم إرساله بشكل خاطئ. |
| 401 | API_KEY_INVALID | المفتاح غير صالح أو مُلغى أو منتهي الصلاحية. |
| 403 | API_SCOPE_REQUIRED | المفتاح لا يملك الـScope المطلوب لهذا المسار. |
| 403 | API_BRANCH_FORBIDDEN | المفتاح يحاول الوصول لفرع غير مسموح له. |
| 403 | API_FEATURE_NOT_ACTIVE | Developer API غير مفعّلة لهذا الجيم. |
| 422 | VALIDATION_ERROR | Body أو Query Parameters لا تطابق المتطلبات. |
| 409 | MEMBER_CONFLICT | بيانات العضو تتعارض مع سجل موجود. |
| 429 | API_RATE_LIMIT_EXCEEDED | تم تجاوز عدد الطلبات في الدقيقة. |
| 429 | API_MONTHLY_QUOTA_EXCEEDED | تم استهلاك الحد الشهري للباقة. |
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/me' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": {
"tenant": {
"id": "tenant_uuid",
"name": "Power House Gym",
"slug": "power-house-gym",
"countryCode": "SA",
"status": "active"
},
"apiKey": {
"name": "Mobile App Production",
"planCode": "starter",
"scopes": [
"members:read",
"attendance:read"
],
"branchIds": null,
"monthlyRequestLimit": 100000,
"requestsPerMinute": 120
}
}
}/meأول طلب لازم تجربه. يرجع بيانات الجيم كاملة بشكل آمن، اسم المفتاح، الباقة، الـScopes، تقييد الفروع وحدود الاستخدام.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/branches' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "branch_uuid",
"name": "Riyadh Main Branch",
"code": "R01",
"phone": "011...",
"whatsapp": "966...",
"city": "Riyadh",
"status": "active",
"timezone": "Asia/Riyadh",
"currency": "SAR",
"logoUrl": null
}
]
}/branchesيعرض كل بيانات الفروع المسموح بها للمفتاح، بما فيها الاتصال والعنوان والمنطقة الزمنية والعملة والشعار والإعدادات العامة.
branches:readcurl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/branches/branch_uuid' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": {
"id": "branch_uuid",
"name": "Riyadh Main Branch",
"code": "R01",
"city": "Riyadh",
"status": "active",
"timezone": "Asia/Riyadh",
"currency": "SAR",
"settings": {}
}
}/branches/:idيعيد فرع واحد بكل بياناته العامة وإعداداته المسموحة للـAPI.
branches:readidrequiredUUID · pathمعرف الفرع.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/staff?page=1&limit=50&status=active' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "user_uuid",
"branchId": "branch_uuid",
"name": "Omar Hassan",
"email": "[email protected]",
"phone": "05...",
"role": "reception",
"status": "active",
"branchName": "Main Branch"
}
],
"meta": {
"page": 1,
"limit": 50,
"returned": 1,
"hasMore": false
}
}/staffيعرض بيانات الموظفين الآمنة فقط: الاسم، الهاتف، البريد، الدور، الحالة والفرع. لا يعيد Password hash أو Permissions الداخلية.
staff:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
branchIdUUIDفلترة حسب فرع مسموح للمفتاح.
statusstringفلترة حسب الحالة.
searchstringبحث بالاسم أو البريد أو الهاتف.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/staff/user_uuid' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": {
"id": "user_uuid",
"name": "Omar Hassan",
"role": "reception",
"status": "active",
"branchName": "Main Branch",
"lastLoginAt": "2026-09-30T12:00:00Z"
}
}/staff/:idيعرض موظفًا واحدًا ببياناته الآمنة بدون أي Credentials أو Secrets.
staff:readidrequiredUUID · pathمعرف الموظف.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/staff/shifts?branchId=branch_uuid&status=active' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "shift_uuid",
"name": "Morning",
"startTime": "08:00:00",
"endTime": "16:00:00",
"graceMinutes": 10,
"isActive": true,
"branchName": "Main Branch"
}
]
}/staff/shiftsيعرض الورديات وأوقات البداية والنهاية وفترة السماح وحالتها.
staff:readbranchIdUUIDفلترة حسب فرع مسموح للمفتاح.
statusactive | inactiveالحالة.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/staff/attendance?page=1&limit=50&branchId=branch_uuid' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "employee_attendance_uuid",
"staffName": "Omar Hassan",
"role": "reception",
"shiftName": "Morning",
"workDate": "2026-09-30",
"checkIn": "2026-09-30T08:05:00Z",
"checkOut": "2026-09-30T16:02:00Z",
"lateMinutes": 0,
"overtimeMinutes": 2,
"status": "present"
}
]
}/staff/attendanceيعرض حضور الموظفين، وقت الدخول والخروج، التأخير، الوقت الإضافي والحالة.
staff:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
branchIdUUIDفلترة حسب فرع مسموح للمفتاح.
statusstringحالة اليوم.
startDateISO date/datetimeبداية الفترة.
endDateISO date/datetimeنهاية الفترة.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/coaches?page=1&limit=50&status=active' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "coach_uuid",
"name": "Coach Ahmed",
"phone": "05...",
"commissionType": "percentage",
"commissionValue": "20.00",
"status": "active",
"branchName": "Main Branch"
}
]
}/coachesيعرض المدربين مع الفرع والحالة ونوع وقيمة العمولة.
coaches:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
branchIdUUIDفلترة حسب فرع مسموح للمفتاح.
statusstringحالة المدرب.
searchstringبحث بالاسم أو الهاتف.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/coaches/coach_uuid' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": {
"id": "coach_uuid",
"name": "Coach Ahmed",
"status": "active",
"commissionType": "percentage",
"commissionValue": "20.00"
}
}/coaches/:idيعرض بيانات مدرب واحد بعد التحقق من الجيم والفرع.
coaches:readidrequiredUUID · pathمعرف المدرب.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/members?page=1&limit=50&status=active&search=Ahmed' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "member_uuid",
"branchId": "branch_uuid",
"branchName": "Main Branch",
"code": "1007",
"fullName": "Ahmed Ali",
"email": "[email protected]",
"phone": "0501234567",
"whatsapp": "0501234567",
"gender": "male",
"birthDate": "1998-02-10",
"status": "active",
"mainCoachId": "coach_uuid",
"mainCoachName": "Coach Ahmed"
}
],
"meta": {
"page": 1,
"limit": 50,
"returned": 1,
"hasMore": false
}
}/membersقائمة غنية للأعضاء تشمل كل البيانات الأساسية والفرع والمدرب الأساسي. بيانات الاشتراكات تظل خلف subscriptions:read ولا تتسرب عبر members:read.
members:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
branchIdUUIDفلترة حسب فرع مسموح للمفتاح.
searchstringبحث بالاسم أو الهاتف أو واتساب أو الكود أو البريد.
statusstringactive / frozen / inactive / banned
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/members/member_uuid' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": {
"id": "member_uuid",
"branchId": "branch_uuid",
"branchName": "Main Branch",
"branchCode": "R01",
"code": "1007",
"fullName": "Ahmed Ali",
"email": "[email protected]",
"phone": "0501234567",
"whatsapp": "0501234567",
"gender": "male",
"birthDate": "1998-02-10",
"emergencyContactName": "Mohamed Ali",
"emergencyContactPhone": "0500000000",
"nationalId": "...",
"passportNumber": null,
"status": "active",
"mainCoachId": "coach_uuid",
"mainCoachName": "Coach Ahmed",
"notes": null,
"cards": [
{
"cardUid": "GD1007",
"cardType": "barcode",
"status": "active"
}
],
"activeSubscription": {
"id": "subscription_uuid",
"planName": "Monthly",
"endDate": "2026-10-30",
"status": "active"
},
"attendanceSummary": {
"totalAllowedVisits": 34,
"visitsThisMonth": 9,
"lastVisitAt": "2026-09-30T18:00:00Z"
},
"paymentSummary": {
"totalPaid": "1250.00",
"paymentsCount": 5,
"lastPaymentAt": "2026-09-20T10:00:00Z"
},
"privateCoachingSummary": {
"enrollmentsCount": 1,
"activeEnrollments": 1
}
}
}/members/:idيرجع كل حقول العضو الموجودة في GymDesk: الفرع، الكود، البريد، الهاتف، واتساب، النوع، الميلاد، بيانات الطوارئ، الرقم القومي أو الجواز، الحالة، المدرب، الملاحظات والكروت. ولو المفتاح يملك Scopes إضافية يضيف أحدث اشتراك وملخص الحضور والمدفوعات والحصص الخاصة.
members:readidrequiredUUID · pathمعرف العضو.
curl --request POST 'https://api.gymdesk-system.com/api/v1/external/v1/members' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --data '{ "branchId": "branch_uuid", "fullName": "Ahmed Ali", "phone": "0501234567", "email": "[email protected]", "whatsapp": "0501234567", "gender": "male", "birthDate": "1998-02-10", "emergencyContactName": "Mohamed Ali", "emergencyContactPhone": "0500000000", "mainCoachId": "coach_uuid", "status": "active" }'
{
"success": true,
"data": {
"id": "member_uuid",
"code": "1008",
"fullName": "Ahmed Ali",
"status": "active"
}
}/membersينشئ عضوًا جديدًا مع كل حقول الملف الأساسية. الكود يمكن تركه فارغًا ليتم توليده تلقائيًا.
members:writebranchIdrequiredUUIDالفرع.
fullNamerequiredstringالاسم الكامل.
phonerequiredstringالهاتف.
emailemailالبريد.
whatsappstringواتساب.
gendermale | femaleالنوع.
birthDatedateتاريخ الميلاد.
emergencyContactNamestringاسم جهة الطوارئ.
emergencyContactPhonestringهاتف الطوارئ.
nationalIdstringالرقم القومي عند الحاجة.
passportNumberstringرقم الجواز عند الحاجة.
mainCoachIdUUIDالمدرب الأساسي.
statusstringحالة العضو.
notesstringملاحظات.
curl --request PATCH 'https://api.gymdesk-system.com/api/v1/external/v1/members/member_uuid' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --data '{ "fullName": "Ahmed Ali Updated", "status": "active" }'
{
"success": true,
"data": {
"id": "member_uuid",
"fullName": "Ahmed Ali Updated",
"status": "active"
}
}/members/:idيعدل أي جزء من الملف الأساسي للعضو مع نفس التحقق من الجيم والفروع والمدرب.
members:writefullNamestringالاسم.
phonestringالهاتف.
whatsappstringواتساب.
emailemailالبريد.
statusstringالحالة.
mainCoachIdUUIDالمدرب الأساسي.
notesstringالملاحظات.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/members/member_uuid/cards' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "card_uuid",
"cardUid": "GD1007",
"cardType": "barcode",
"status": "active",
"assignedAt": "2026-09-01T09:00:00Z"
}
]
}/members/:id/cardsيعرض كل الكروت والباركود المرتبطة بعضو واحد وحالتها.
members:readcurl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/member-cards?page=1&limit=50&status=active' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "card_uuid",
"memberId": "member_uuid",
"memberName": "Ahmed Ali",
"cardUid": "GD1007",
"cardType": "barcode",
"status": "active"
}
]
}/member-cardsيعرض كروت الأعضاء على مستوى الجيم مع التصفية بالفرع والعضو والحالة.
members:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
branchIdUUIDفلترة حسب فرع مسموح للمفتاح.
memberIdUUIDفلترة حسب عضو محدد.
statusstringحالة الكارت.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/members/member_uuid/subscriptions?page=1&limit=50' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "subscription_uuid",
"planName": "Monthly",
"startDate": "2026-09-01",
"endDate": "2026-09-30",
"paidAmount": "250.00",
"remainingAmount": "0.00",
"status": "active"
}
]
}/members/:id/subscriptionsتاريخ اشتراكات عضو محدد بالكامل بشكل Paginated.
subscriptions:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/members/member_uuid/payments?page=1&limit=50' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "payment_uuid",
"amount": "250.00",
"paymentMethod": "cash",
"paymentType": "subscription",
"paidAt": "2026-09-01T10:00:00Z"
}
]
}/members/:id/paymentsتاريخ مدفوعات عضو محدد مع طريقة الدفع والمراجع ومصدر الحركة.
payments:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/members/member_uuid/attendance?page=1&limit=50' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "attendance_uuid",
"branchName": "Main Branch",
"deviceName": "Gate 1",
"direction": "in",
"result": "allowed",
"checkedAt": "2026-09-30T18:00:00Z"
}
]
}/members/:id/attendanceكل سجلات دخول وخروج عضو محدد مع الجهاز والفرع والنتيجة وسبب الرفض إن وجد.
attendance:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
startDateISO date/datetimeبداية الفترة.
endDateISO date/datetimeنهاية الفترة.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/members/member_uuid/private-coaching' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "enrollment_uuid",
"coachName": "Coach Ahmed",
"planName": "PT 12",
"status": "active",
"totalPrice": "1200.00",
"remainingAmount": "0.00",
"progressSummary": "Improving"
}
]
}/members/:id/private-coachingيعرض كل Enrollments الخاصة بعضو مع المدرب والخطة والسعر والتقدم.
private_coaching:readcurl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/membership-plans?branchId=branch_uuid' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "plan_uuid",
"name": "Monthly",
"durationDays": 30,
"price": "250.00",
"allowedVisits": null,
"includesPrivateSessions": 0,
"freezeAllowedDays": 3,
"isActive": true
}
]
}/membership-plansيعرض كل تفاصيل خطط العضوية: المدة، السعر، الزيارات، الحصص الخاصة وأيام التجميد.
subscriptions:readbranchIdUUIDفلترة حسب فرع مسموح للمفتاح.
statusactive | inactiveاختياري لتصفية الخطط.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/membership-plans/plan_uuid' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": {
"id": "plan_uuid",
"name": "Monthly",
"durationDays": 30,
"price": "250.00",
"freezeAllowedDays": 3,
"isActive": true
}
}/membership-plans/:idيعرض خطة عضوية واحدة بكامل بياناتها.
subscriptions:readidrequiredUUID · pathمعرف الخطة.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/subscriptions?page=1&limit=50&status=active' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "subscription_uuid",
"memberName": "Ahmed Ali",
"memberCode": "1007",
"planName": "Monthly",
"startDate": "2026-09-01",
"endDate": "2026-09-30",
"price": "250.00",
"paidAmount": "250.00",
"remainingAmount": "0.00",
"status": "active"
}
]
}/subscriptionsيعرض الاشتراكات مع العضو والخطة والسعر والخصم والمدفوع والمتبقي والحالة.
subscriptions:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
branchIdUUIDفلترة حسب فرع مسموح للمفتاح.
memberIdUUIDفلترة حسب عضو محدد.
statusstringحالة الاشتراك.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/subscriptions/subscription_uuid' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": {
"id": "subscription_uuid",
"memberName": "Ahmed Ali",
"planName": "Monthly",
"status": "active",
"freezes": [
{
"startDate": "2026-09-10",
"endDate": "2026-09-12",
"daysCount": 3,
"status": "completed"
}
]
}
}/subscriptions/:idيرجع الاشتراك كاملًا ومعه Freeze history الخاصة به.
subscriptions:readcurl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/payments?page=1&limit=50&memberId=member_uuid' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "payment_uuid",
"memberName": "Ahmed Ali",
"amount": "250.00",
"paymentMethod": "card",
"paymentType": "subscription",
"paymentReference": "REF123",
"settlementStatus": "immediate",
"paidAt": "2026-09-01T10:00:00Z"
}
]
}/paymentsيعرض المدفوعات بكل حقول الربط المهمة: العضو، الاشتراك، الفاتورة، الحساب البنكي، الطريقة، النوع، المراجع، العمولة وحالة التسوية.
payments:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
branchIdUUIDفلترة حسب فرع مسموح للمفتاح.
memberIdUUIDفلترة حسب عضو محدد.
subscriptionIdUUIDفلترة باشتراك.
startDateISO date/datetimeبداية الفترة.
endDateISO date/datetimeنهاية الفترة.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/payments/payment_uuid' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": {
"id": "payment_uuid",
"memberId": "member_uuid",
"amount": "250.00",
"paymentMethod": "cash",
"sourceType": "subscription_initial",
"settlementStatus": "immediate"
}
}/payments/:idيرجع حركة دفع واحدة بكل بياناتها التشغيلية الآمنة.
payments:readcurl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/invoices?page=1&limit=50&status=issued' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "invoice_uuid",
"invoiceNumber": "INV-10023",
"countryCode": "SA",
"currency": "SAR",
"totalAmount": "287.50",
"status": "issued",
"issueDate": "2026-09-01T10:00:00Z"
}
]
}/invoicesيعرض الفواتير الضريبية/المالية مع المبالغ والعملة وSnapshot العميل وQR الآمن، بدون Raw provider secrets.
payments:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
branchIdUUIDفلترة حسب فرع مسموح للمفتاح.
memberIdUUIDفلترة حسب عضو محدد.
statusissued | void | draftحالة الفاتورة.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/invoices/invoice_uuid' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": {
"id": "invoice_uuid",
"invoiceNumber": "INV-10023",
"sellerSnapshot": {},
"customerSnapshot": {},
"itemsSnapshot": [],
"taxSettingsSnapshot": {},
"totalAmount": "287.50",
"status": "issued"
}
}/invoices/:idيرجع Snapshot كامل للفاتورة: البائع، العميل، العناصر، إعدادات الضريبة، المصدر والـQR المتاح.
payments:readcurl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/attendance?branchId=branch_uuid&page=1&limit=50' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "attendance_uuid",
"memberId": "member_uuid",
"direction": "in",
"result": "allowed",
"checkedAt": "2026-09-30T18:00:00Z"
}
]
}/attendanceيعرض حضور فرع محدد مع التاريخ والنتيجة والعضو والاتجاه. branchId مطلوب لهذا المسار.
attendance:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
branchIdrequiredUUIDفلترة حسب فرع مسموح للمفتاح.
startDateISO date/datetimeبداية الفترة.
endDateISO date/datetimeنهاية الفترة.
curl --request POST 'https://api.gymdesk-system.com/api/v1/external/v1/attendance' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --data '{ "branchId": "branch_uuid", "memberId": "member_uuid", "direction": "in" }'
{
"success": true,
"data": {
"id": "attendance_uuid",
"memberId": "member_uuid",
"source": "external_api",
"result": "allowed"
}
}/attendanceيسجل حضورًا عبر Attendance Service الأصلية، لذلك يطبق التحقق من العضو والفرع والاشتراك والـduplicate attendance.
attendance:writebranchIdrequiredUUIDالفرع.
memberIdUUIDمعرف العضو.
memberSearchstringبديل memberId: كود/هاتف/بحث عضو.
directionin | out | check_in | check_outاتجاه الحركة.
checkedAtISO datetimeوقت مخصص اختياري.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/classes/types?branchId=branch_uuid&status=active' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "class_type_uuid",
"name": "Boxing",
"nameAr": "ملاكمة",
"category": "combat",
"defaultCapacity": 20,
"durationMinutes": 60,
"isActive": true
}
]
}/classes/typesأنواع الكلاسات: الاسم العربي/الإنجليزي، التصنيف، السعة، المدة والحالة.
classes:readbranchIdUUIDفلترة حسب فرع مسموح للمفتاح.
statusactive | inactiveالحالة.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/classes/instructors?branchId=branch_uuid&status=active' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "instructor_uuid",
"source": "gym_coach",
"coachId": "coach_uuid",
"name": "Coach Ahmed",
"status": "active"
}
]
}/classes/instructorsيعرض مدربي الكلاسات سواء Coach داخلي أو Instructor خارجي.
classes:readbranchIdUUIDفلترة حسب فرع مسموح للمفتاح.
statusstringالحالة.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/classes/contracts?page=1&limit=50&status=active' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "contract_uuid",
"instructorName": "Coach Ahmed",
"agreedSessions": 12,
"agreementAmount": "3000.00",
"status": "active"
}
]
}/classes/contractsيعرض عقود المدربين وعدد الجلسات والقيمة والعمولة وحالة العقد.
classes:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
branchIdUUIDفلترة حسب فرع مسموح للمفتاح.
statusstringحالة العقد.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/classes/sessions?page=1&limit=50&branchId=branch_uuid' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "session_uuid",
"instructorName": "Coach Ahmed",
"classTypeName": "Boxing",
"sessionDate": "2026-09-30T19:00:00Z",
"durationMinutes": 60,
"attendeesCount": 14
}
]
}/classes/sessionsيعرض الجلسات الفعلية: النوع، المدرب، التاريخ، المدة وعدد الحضور.
classes:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
branchIdUUIDفلترة حسب فرع مسموح للمفتاح.
startDateISO date/datetimeبداية الفترة.
endDateISO date/datetimeنهاية الفترة.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/private-coaching/plans?branchId=branch_uuid&status=active' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "pt_plan_uuid",
"coachName": "Coach Ahmed",
"name": "PT 12",
"sessionsCount": 12,
"durationDays": 30,
"price": "1200.00",
"isActive": true
}
]
}/private-coaching/plansخطط الـPT مع المدرب وعدد الحصص والمدة والسعر وإعداد العمولة.
private_coaching:readbranchIdUUIDفلترة حسب فرع مسموح للمفتاح.
coachIdUUIDالمدرب.
statusactive | inactiveالحالة.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/private-coaching/enrollments?page=1&limit=50&status=active' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "enrollment_uuid",
"memberName": "Ahmed Ali",
"coachName": "Coach Ahmed",
"planName": "PT 12",
"totalPrice": "1200.00",
"paidAmount": "1200.00",
"remainingAmount": "0.00",
"status": "active",
"coachPayoutStatus": "eligible"
}
]
}/private-coaching/enrollmentsيعرض العضو والمدرب والخطة والتواريخ والسعر والمدفوع والمتبقي وحالة عمولة المدرب والتقدم.
private_coaching:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
branchIdUUIDفلترة حسب فرع مسموح للمفتاح.
memberIdUUIDفلترة حسب عضو محدد.
coachIdUUIDالمدرب.
statusstringالحالة.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/private-coaching/sessions?page=1&limit=50&memberId=member_uuid' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "pt_session_uuid",
"memberName": "Ahmed Ali",
"coachName": "Coach Ahmed",
"sessionDate": "2026-09-30T17:00:00Z",
"status": "completed",
"durationMinutes": 60,
"performanceScore": 8
}
]
}/private-coaching/sessionsيعرض جلسات PT مع الأداء والمدة والحالة والملاحظات.
private_coaching:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
branchIdUUIDفلترة حسب فرع مسموح للمفتاح.
memberIdUUIDفلترة حسب عضو محدد.
coachIdUUIDالمدرب.
statusstringالحالة.
startDateISO date/datetimeبداية الفترة.
endDateISO date/datetimeنهاية الفترة.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/private-coaching/progress?page=1&limit=50&memberId=member_uuid' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "progress_uuid",
"memberName": "Ahmed Ali",
"progressDate": "2026-09-30",
"weightKg": "82.40",
"bodyFatPercentage": "18.20",
"measurements": {
"waist": 86
},
"progressRating": 8
}
]
}/private-coaching/progressيعرض قياسات وتقدم العضو: الوزن، نسبة الدهون، measurements، القوة والتقييم.
private_coaching:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
branchIdUUIDفلترة حسب فرع مسموح للمفتاح.
memberIdUUIDفلترة حسب عضو محدد.
coachIdUUIDالمدرب.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/sales/products?page=1&limit=50&status=active' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "product_uuid",
"name": "Protein Shake",
"sku": "PS01",
"barcode": "123456",
"purchasePrice": "50.00",
"salePrice": "85.00",
"stockQuantity": 42,
"minStockQuantity": 5,
"isActive": true
}
]
}/sales/productsيعرض المنتج، SKU، الباركود، الصورة، سعر الشراء والبيع والمخزون والحد الأدنى.
sales:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
branchIdUUIDفلترة حسب فرع مسموح للمفتاح.
searchstringبحث بالاسم/SKU/باركود.
categorystringالتصنيف.
statusactive | inactiveالحالة.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/sales/products/product_uuid' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": {
"id": "product_uuid",
"name": "Protein Shake",
"stockQuantity": 42,
"salePrice": "85.00"
}
}/sales/products/:idتفاصيل منتج واحد وحالة مخزونه.
sales:readcurl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/sales/invoices?page=1&limit=50' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "sales_invoice_uuid",
"invoiceNo": "S-1002",
"memberName": "Ahmed Ali",
"totalAmount": "170.00",
"grossProfit": "70.00",
"paymentMethod": "cash",
"status": "completed",
"soldAt": "2026-09-30T14:00:00Z"
}
]
}/sales/invoicesيعرض فواتير الـPOS مع العميل والإجماليات والتكلفة والربح والدفع والحالة.
sales:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
branchIdUUIDفلترة حسب فرع مسموح للمفتاح.
memberIdUUIDفلترة حسب عضو محدد.
statusstringالحالة.
startDateISO date/datetimeبداية الفترة.
endDateISO date/datetimeنهاية الفترة.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/sales/invoices/sales_invoice_uuid' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": {
"id": "sales_invoice_uuid",
"invoiceNo": "S-1002",
"totalAmount": "170.00",
"items": [
{
"productName": "Protein Shake",
"quantity": 2,
"unitPrice": "85.00",
"lineProfit": "70.00"
}
]
}
}/sales/invoices/:idيرجع الفاتورة ومعها كل البنود والكميات والأسعار والتكلفة والربح لكل بند.
sales:readcurl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/sales/inventory-movements?page=1&limit=50&productId=product_uuid' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "movement_uuid",
"productName": "Protein Shake",
"movementType": "sale",
"quantityChange": -2,
"stockAfter": 42,
"referenceType": "sales_invoice",
"referenceId": "sales_invoice_uuid"
}
]
}/sales/inventory-movementsيعرض حركة المخزون قبل/بعد البيع أو التعديل مع المرجع والملاحظات.
sales:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
branchIdUUIDفلترة حسب فرع مسموح للمفتاح.
productIdUUIDالمنتج.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/expenses?page=1&limit=50' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "expense_uuid",
"category": "maintenance",
"title": "Treadmill service",
"amount": "450.00",
"expenseDate": "2026-09-30",
"paidByName": "Owner"
}
]
}/expensesيعرض المصروفات الأساسية مع الفئة والعنوان والمبلغ والتاريخ ومن قام بالدفع.
finance:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
branchIdUUIDفلترة حسب فرع مسموح للمفتاح.
categorystringالفئة.
startDateISO date/datetimeبداية الفترة.
endDateISO date/datetimeنهاية الفترة.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/finance/summary?branchId=branch_uuid' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": {
"monthIncome": "82000.00",
"monthExpenses": "24000.00",
"monthNet": 58000,
"todayIncome": "4200.00",
"todayExpenses": "500.00",
"paymentsCount": 181,
"expensesCount": 38
}
}/finance/summaryملخص سريع لإيرادات ومصروفات الشهر واليوم وصافي الشهر داخل الفروع المسموحة.
finance:readbranchIdUUIDفلترة حسب فرع مسموح للمفتاح.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/finance/bank-accounts?status=active' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "bank_uuid",
"name": "Main Bank",
"accountName": "Power House Gym",
"accountNumber": "...",
"iban": "SA...",
"currency": "SAR",
"currentBalance": "50000.00",
"isDefault": true,
"status": "active"
}
]
}/finance/bank-accountsيعرض الحسابات البنكية المسجلة للجيم مع الرصيد والعملة والعمولة وIBAN. استخدم هذا الـScope فقط للتكاملات المالية الموثوقة.
finance:readbranchIdUUIDفلترة حسب فرع مسموح للمفتاح.
statusstringالحالة.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/finance/bank-transactions?page=1&limit=50' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "bank_tx_uuid",
"bankAccountName": "Main Bank",
"sourceType": "payment",
"direction": "credit",
"amount": "250.00",
"reference": "REF123",
"transactionAt": "2026-09-30T12:00:00Z"
}
]
}/finance/bank-transactionsيعرض حركات الخصم والإضافة المرتبطة بالحسابات البنكية ومصدر كل حركة.
finance:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
branchIdUUIDفلترة حسب فرع مسموح للمفتاح.
startDateISO date/datetimeبداية الفترة.
endDateISO date/datetimeنهاية الفترة.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/finance/cash-shifts?page=1&limit=50&status=open' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "cash_shift_uuid",
"openedByName": "Omar",
"openingCash": "1000.00",
"expectedCash": "4800.00",
"actualCash": "4790.00",
"difference": "-10.00",
"status": "closed"
}
]
}/finance/cash-shiftsيعرض فتح وإغلاق ورديات الكاشير والرصيد المتوقع والفعلي والفرق.
finance:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
branchIdUUIDفلترة حسب فرع مسموح للمفتاح.
statusopen | closedالحالة.
startDateISO date/datetimeبداية الفترة.
endDateISO date/datetimeنهاية الفترة.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/finance/refunds?page=1&limit=50&status=pending' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "refund_uuid",
"paymentId": "payment_uuid",
"amount": "100.00",
"reason": "Customer request",
"status": "pending",
"requestedByName": "Owner",
"payoutMethod": null
}
]
}/finance/refundsيعرض طلبات الاسترجاع، الدفعة الأصلية، المبلغ، السبب، المراجعة وطريقة رد الأموال.
finance:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
branchIdUUIDفلترة حسب فرع مسموح للمفتاح.
statuspending | approved | rejectedالحالة.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/equipment?page=1&limit=50&status=active' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "equipment_uuid",
"name": "Treadmill 1",
"code": "TM01",
"brand": "Matrix",
"status": "active",
"nextMaintenanceAt": "2026-10-10",
"maintenanceCost": "0.00"
}
]
}/equipmentكل أجهزة الجيم مع الأكواد والسيريال والموقع والضمان والحالة والصيانة القادمة.
equipment:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
branchIdUUIDفلترة حسب فرع مسموح للمفتاح.
searchstringبحث بالاسم أو الكود أو السيريال.
categorystringالتصنيف.
statusstringالحالة.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/equipment/equipment_uuid' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": {
"id": "equipment_uuid",
"name": "Treadmill 1",
"status": "under_maintenance",
"issueDescription": "Belt noise",
"maintenanceLogs": [
{
"action": "inspection",
"cost": "100.00",
"performedAt": "2026-09-29T10:00:00Z"
}
]
}
}/equipment/:idيرجع كل تفاصيل الجهاز ومعها Maintenance logs كاملة.
equipment:readcurl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/devices?page=1&limit=50&status=active' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "device_uuid",
"name": "Gate 1",
"deviceCode": "FK-01",
"deviceType": "gate",
"connectionMode": "tcp",
"status": "active",
"lastSeenAt": "2026-09-30T17:30:00Z"
}
]
}/devicesيعرض أجهزة الدخول المسجلة: النوع، طريقة الاتصال، الحالة، آخر ظهور وFirmware.
devices:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
branchIdUUIDفلترة حسب فرع مسموح للمفتاح.
statusstringالحالة.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/daily-sessions?page=1&limit=50' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "daily_uuid",
"playerName": "Visitor Name",
"phone": "05...",
"price": "80.00",
"paidAmount": "80.00",
"paymentMethod": "cash",
"visitedAt": "2026-09-30T14:00:00Z",
"status": "completed"
}
]
}/daily-sessionsيعرض زوار اليوم الواحد غير المشتركين مع السعر والمدفوع وطريقة الدفع ووقت الزيارة والحالة.
daily_sessions:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
branchIdUUIDفلترة حسب فرع مسموح للمفتاح.
searchstringبحث بالاسم أو الهاتف.
statusstringالحالة.
startDateISO date/datetimeبداية الفترة.
endDateISO date/datetimeنهاية الفترة.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/payroll/profiles?page=1&limit=50&status=active' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "profile_uuid",
"employeeName": "Omar Hassan",
"employeeType": "staff",
"jobTitle": "Reception",
"baseSalary": "5000.00",
"currency": "SAR",
"status": "active"
}
]
}/payroll/profilesيعرض ملف التوظيف والراتب الأساسي والمسمى الوظيفي والدرجة والعملة والحالة للموظف أو المدرب.
payroll:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
branchIdUUIDفلترة حسب فرع مسموح للمفتاح.
statusstringالحالة.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/payroll/runs?page=1&limit=50&status=paid' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": [
{
"id": "run_uuid",
"employeeName": "Omar Hassan",
"payrollMonth": "2026-09-01",
"baseSalarySnapshot": "5000.00",
"bonusesTotal": "300.00",
"deductionsTotal": "100.00",
"netSalary": "5200.00",
"status": "paid",
"paidAt": "2026-09-28T12:00:00Z"
}
]
}/payroll/runsيعرض راتب الشهر، الأساس، المكافآت، الخصومات، الصافي، الحالة وتاريخ الدفع.
payroll:readpageintegerرقم الصفحة، يبدأ من 1.
limitintegerمن 1 إلى 200، الافتراضي 50.
branchIdUUIDفلترة حسب فرع مسموح للمفتاح.
statusdraft | approved | paidالحالة.
startDateISO date/datetimeبداية الفترة.
endDateISO date/datetimeنهاية الفترة.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/dashboard/summary?branchId=branch_uuid' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": {
"members": {
"total": 520,
"active": 470
},
"subscriptions": {
"total": 610,
"active": 455
},
"attendanceToday": 132,
"paymentsThisMonth": {
"total": "82000.00",
"count": 181
},
"expensesThisMonth": {
"total": "24000.00",
"count": 38
},
"salesThisMonth": {
"total": "12500.00",
"count": 82
},
"coaches": {
"active": 8
},
"equipment": {
"total": 46,
"maintenance": 3
}
}
}/dashboard/summaryKPIs جاهزة للموبايل أو لوحة خارجية: الأعضاء، الاشتراكات، حضور اليوم، الإيرادات والمصروفات والمبيعات والمدربين والأجهزة.
dashboard:readbranchIdUUIDفلترة حسب فرع مسموح للمفتاح.
curl --request GET 'https://api.gymdesk-system.com/api/v1/external/v1/reports/overview?branchId=branch_uuid' \ --header 'Authorization: Bearer gym_live_YOUR_API_KEY' \ --header 'Accept: application/json'
{
"success": true,
"data": {
"memberStatus": [
{
"status": "active",
"count": 470
}
],
"subscriptionStatus": [
{
"status": "active",
"count": 455
}
],
"paymentMethods": [
{
"paymentMethod": "cash",
"amount": "42000.00",
"count": 96
}
],
"attendanceLast30Days": [
{
"day": "2026-09-30",
"visits": 132
}
]
}
}/reports/overviewAggregates جاهزة للرسم والتحليل: توزيع حالات الأعضاء والاشتراكات، طرق الدفع، وحضور آخر 30 يوم.
reports:readbranchIdUUIDفلترة حسب فرع مسموح للمفتاح.