All attendance / auth / QR endpoints emit one of the following canonical reason_code values inside data.reason_code. Mobile clients must treat these as a closed enum and key UX off them โ never off HTTP status alone.
| reason_code | Meaning |
|---|---|
success | Operation succeeded |
policy_qr_disabled | Policy does not allow QR for this flow |
policy_geofence_required | Geofence coordinates required by policy |
qr_required | Direct check-in blocked; QR mandatory |
outside_geofence | Coordinates outside gym radius |
qr_expired | QR token TTL passed |
qr_invalid | QR token signature/format invalid |
qr_already_used | Single-use token already consumed |
role_not_allowed | User role cannot use this flow |
user_inactive | User account deactivated |
gym_inactive | Gym deactivated |
membership_expired | Member's membership has expired |
payment_due | Member has overdue payment and policy blocks |
already_checked_in | Already has open check-in today |
already_checked_out | Already completed today's session |
has_dependents | Cascade conflict on delete (HTTP 409) |
unknown_error | Fallback |
QR scan / legacy attendance endpoints always reply with HTTP 200 for policy and business-rule rejections; only true transport/server faults return 4xx/5xx.
โ Success Response (200)
{"success": true, "message": "Login successful", "data": {"user_id": 1, "name": "Super Admin", "email": "superadmin@gymops.com", "role": "super_admin", "gym_id": null, "message": "Use X-User-Id header with value 1 for subsequent API calls"}}โ Error Response (401)
{"success": false, "message": "Invalid credentials"}No additional parameters. Uses X-User-Id header.
โ Success (200) โ normal gym admin
{"success": true, "data": {"id": 2, "name": "Gym Admin", "email": "admin@testgym.com", "role": "gym_admin", "gym_id": 1, "status": "active", "gym": {"id": 1, "name": "Test Gym", "status": "active"}}, "subscription_warning": false, "warning_code": null, "warning_message": null, "days_to_expiry": 12, "subscription_expiry_at": "2026-05-14T23:59:59+05:30"}โ Success (200) โ member with assigned programs
{"success": true, "data": {"id": 4, "name": "Alice Member", "role": "member", "member_type": "trainer_assigned", "trainer_id": 3, "trainer": {"id": 3, "name": "John Trainer", "email": "trainer@example.com"}, "section_id": 1, "section_name": "Strength", "sections": [{"id": 1, "name": "Strength", "type": "gym"}, {"id": 2, "name": "Cardio", "type": "sport"}], "memberships": [{"id": 11, "member_id": 4, "trainer_id": 3, "section_id": 1, "program_id": 1, "section_name": "Strength", "program_name": "Strength", "status": "active", "member_type": "trainer_assigned", "plan": "monthly", "amount": "100.00", "start_date": "2026-05-04", "expiry_date": "2026-06-03", "section": {"id": 1, "name": "Strength", "type": "gym"}}], "gym": {"id": 1, "name": "Test Gym", "status": "active"}}, "subscription_warning": false}โ Success (200) โ trainer with assigned programs
{"success": true, "data": {"id": 3, "name": "John Trainer", "role": "trainer", "availability_summary": {"has_availability": true, "weekly_days_configured": 2, "total_weekly_slots": 3, "next_available_at": "2026-06-03T06:00:00+05:30", "today_windows": [{"start_time": "06:00:00", "end_time": "08:00:00"}]}, "section_id": 1, "section_name": "Strength", "sections": [{"id": 1, "name": "Strength", "type": "gym"}, {"id": 2, "name": "Cardio", "type": "sport"}], "memberships": [{"id": 21, "member_id": null, "trainer_id": 3, "section_id": 1, "program_id": 1, "section_name": "Strength", "program_name": "Strength", "status": "active", "member_type": null, "section": {"id": 1, "name": "Strength", "type": "gym"}}], "gym": {"id": 1, "name": "Test Gym", "status": "active"}}, "subscription_warning": false}โ ๏ธ Success (200) โ active gym expiring soon
{"success": true, "data": {"id": 2, "name": "Gym Admin", "role": "gym_admin", "gym_id": 1, "gym": {"id": 1, "name": "Test Gym", "status": "active"}}, "subscription_warning": true, "warning_code": "SUBSCRIPTION_EXPIRING_SOON", "warning_message": "Gym subscription will expire within 2 days. Please renew soon.", "days_to_expiry": 2, "subscription_expiry_at": "2026-05-04T23:59:59+05:30"}โ ๏ธ Success (200) โ active gym already expired
{"success": true, "data": {"id": 2, "name": "Gym Admin", "role": "gym_admin", "gym_id": 1, "gym": {"id": 1, "name": "Test Gym", "status": "active"}}, "subscription_warning": true, "warning_code": "SUBSCRIPTION_EXPIRED", "warning_message": "Gym subscription has expired. Contact Super Admin.", "days_to_expiry": -1, "subscription_expiry_at": "2026-05-01T23:59:59+05:30"}โ Success (200) โ super admin
{"success": true, "data": {"id": 1, "name": "Super Admin", "email": "superadmin@gymops.com", "role": "super_admin", "gym_id": null, "status": "active", "gym": null}}โ Success Response (200)
{"success": true, "message": "Password changed successfully"}No auth required. Returns latest active Android APK release.
โ Success (200)
{"success": true, "data": {"id": 1, "title": "AhaNexa Android App", "version": "1.0.4", "build_number": "14", "notes": "Bug fixes and attendance improvements", "platform": "android", "file_name": "ahanexa-v1.0.4.apk", "file_url": "https://gym.sroy.cloud/storage/app-releases/ahanexa-v1.0.4.apk", "file_size": 24567890, "file_size_label": "23.4 MB", "is_active": true, "uploaded_at": "2026-05-02T10:20:30Z"}}โ Not Found (404)
{"success": false, "message": "No active app release found"}Requires super admin `X-User-Id`.
โ Success (200) with data
{"success": true, "data": {"id": 1, "title": "AhaNexa Android App", "version": "1.0.4", "build_number": "14", "notes": "Bug fixes", "platform": "android", "file_name": "ahanexa-v1.0.4.apk", "file_url": "https://gym.sroy.cloud/storage/app-releases/ahanexa-v1.0.4.apk", "file_size": 24567890, "file_size_label": "23.4 MB", "is_active": true, "uploaded_at": "2026-05-02T10:20:30Z"}}โ Success (200) with null
{"success": true, "data": null}๐ multipart/form-data fields
title= AhaNexa Android App version= 1.0.4 build_number= 14 (optional) notes= Bug fixes and attendance improvements (optional) platform= android (optional) file= ahanexa-v1.0.4.apk (required, max 100MB)
โ Success (201)
{"success": true, "message": "APK release created successfully", "data": {"id": 1, "title": "AhaNexa Android App", "version": "1.0.4", "build_number": "14", "notes": "Bug fixes and attendance improvements", "platform": "android", "file_name": "ahanexa-v1.0.4-20260502102030.apk", "file_url": "https://gym.sroy.cloud/storage/app-releases/ahanexa-v1.0.4-20260502102030.apk", "file_size": 24567890, "file_size_label": "23.4 MB", "is_active": true, "uploaded_at": "2026-05-02T10:20:30Z"}}โ Validation (422)
{"success": false, "message": "Validation failed", "errors": {"file": ["The file field must not be greater than 102400 kilobytes."]}}โ Payload Too Large (413)
{"success": false, "message": "Uploaded file exceeds server limit. Maximum allowed size is 100MB.", "data": {"reason_code": "payload_too_large", "max_upload_mb": 100}}Use Postman/cURL for file upload testing from docs UI.
๐ multipart/form-data fields
title= AhaNexa Android App version= 1.0.5 build_number= 15 (optional) notes= Patch release (optional) platform= android (optional) file= ahanexa-v1.0.5.apk (optional replacement, max 100MB)
โ Success (200)
{"success": true, "message": "APK release updated successfully", "data": {"id": 1, "title": "AhaNexa Android App", "version": "1.0.5", "build_number": "15", "notes": "Patch release", "platform": "android", "file_name": "ahanexa-v1.0.5-20260502113000.apk", "file_url": "https://gym.sroy.cloud/storage/app-releases/ahanexa-v1.0.5-20260502113000.apk", "file_size": 25200000, "file_size_label": "24.0 MB", "is_active": true, "uploaded_at": "2026-05-02T10:20:30Z"}}โ Success (200)
{"success": true, "message": "APK release deleted successfully"}/api/v1/gyms/{gym_id} (use X-User-Id: 2 for gym admin testing)โ Success Response (200)
{"success": true, "message": "Inventory items fetched successfully", "data": [{"id": 1, "name": "Treadmill X", "sku": "TR-100", "custom_fields": {"weight_kg": 60, "brand": "FitPro"}, "weight_kg": 60}], "meta": {"total": 2}}โ Success Response (201)
{"success": true, "message": "Inventory item created successfully", "data": {"id": 3, "name": "Air Bike", "sku": "AB-200", "custom_fields": {"category": "cardio", "weight_kg": 18.5}, "weight_kg": 18.5}}โ Duplicate SKU (422)
{"error":{"code":"validation_failed","message":"Validation failed","details":{"sku":["The sku has already been taken."]}}}โ Success Response (200)
{"success": true, "data": {"id": 1, "name": "Treadmill X", "sku": "TR-100", "custom_fields": {"brand": "FitPro", "weight_kg": 60}, "weight_kg": 60}}โ Success Response (200)
{"success": true, "message": "Inventory item updated successfully", "data": {"id": 1, "custom_fields": {"weight_kg": 62}, "weight_kg": 62}}โ Duplicate SKU (422)
{"error":{"code":"validation_failed","message":"Validation failed","details":{"sku":["The sku has already been taken."]}}}โ Success Response (200)
{"success": true, "message": "Inventory item deleted successfully"}Use Raw JSON for multiple updates payload.
โ Success Response (200)
{"success": true, "message": "Inventory updated in bulk"}โ Success Response (200)
{"success": true, "data": [{"action":"updated"}]}โ Success Response (200)
{"success": true, "data": {"categories":[],"suppliers":[],"statuses":["in_working_condition","not_working","not_available"]}}โ Success Response (200)
{"success": true, "data": [{"id": 1, "inventory_item_id": 1, "file_name": "photo.jpg", "mime_type": "image/jpeg", "size_bytes": 24512, "download_url": "https://gym.sroy.cloud/api/v1/gyms/1/inventory/1/images/1", "created_at": "2026-04-29T10:00:00Z"}]}Use Postman or cURL multipart with images[] files for actual upload bytes.
โ Success Response (201)
{"success": true, "message": "Inventory images uploaded successfully", "data": [{"id": 11, "file_name":"photo.jpg", "mime_type":"image/jpeg", "size_bytes":24512, "download_url":"https://gym.sroy.cloud/api/v1/gyms/1/inventory/1/images/11"}]}โ Success Response (200)
Binary image stream with image Content-Type
โ Success Response (200)
{"success": true, "message": "Inventory image deleted successfully", "data": {"id": 1}}โ Success Response (200)
{"success": true, "data": [{"id":1,"status":"pending"}]}โ Success Response (201)
{"success": true, "message": "Inventory request created successfully", "data": {"id": 1, "status": "pending"}}โ Success Response (200)
{"success": true, "message": "Inventory request updated successfully"}โ Success Response (200)
{"success": true, "message": "Inventory request resolved successfully"}โ Success Response (200)
{"success": true, "message": "Inventory audit logs fetched successfully", "data": [{"action":"request_change"}]}โ Success Response (201)
{"success": true, "message": "Gym created successfully with admin account", "data": {"gym": {"id": 2, "gym_id": "GYM-AB12CD34", "name": "PowerGym", "gym_email": "powergym@example.com", "status": "active"}, "admin": {"user_id": 5, "name": "PowerGym Admin", "email": "admin.powergym@example.com"}, "admin_user_id": 5, "admin_email": "admin.powergym@example.com"}}โ Success Response (200)
{"success": true, "data": {"data": [{"id": 1, "gym_id": "GYM-DEMO0001", "name": "FitLife Gym", "status": "active", "members_count": 2, "trainers_count": 1}], "current_page": 1, "total": 1}}โ Success Response (200)
{"success": true, "data": {"id": 1, "gym_id": "GYM-DEMO0001", "name": "FitLife Gym", "gym_email": "fitlife@example.com", "status": "active", "members_count": 2, "trainers_count": 1, "gym_admin": {"id": 2, "email": "admin@fitlife.com", "name": "FitLife Gym Admin", "status": "active"}}}โ Success (200)
{"success": true, "message": "Gym profile updated successfully", "data": {"id": 1, "gym_id": "GYM-DEMO0001", "name": "FitLife Elite", "city": "Mumbai"}}โ Success (200)
{"success": true, "data": [{"id": 12, "name": "Admin A", "email": "a@gym.com", "status": "active", "gym_id": 1, "created_at": "2026-05-04T06:00:00.000000Z", "updated_at": "2026-05-04T06:00:00.000000Z"}]}โ Success (201)
{"success": true, "message": "Gym admin created successfully", "data": {"id": 13, "name": "Admin C", "email": "admin.c@example.com", "status": "active", "gym_id": 1}}โ Validation Error (422)
{"success": false, "message": "Validation failed", "errors": {"email": ["The email has already been taken."]}}โ Success (200)
{"success": true, "message": "Gym admin updated successfully", "data": {"id": 13, "name": "Admin C Updated", "email": "admin.c.updated@example.com", "status": "active", "gym_id": 1}}โ Cross Gym (403)
{"success": false, "message": "Forbidden cross-gym admin update"}โ Validation (422)
{"success": false, "message": "Validation failed", "errors": {"fields": ["At least one of name, email, status is required."]}}โ Success (200)
{"success": true, "message": "Gym admin deactivated successfully", "data": {"id": 13, "name": "Admin C", "email": "admin.c@example.com", "status": "inactive", "gym_id": 1}}โ Not Found (404)
{"success": false, "message": "Gym admin not found"}โ Success (200)
{"success": true, "message": "Gym admin activated successfully", "data": {"id": 13, "name": "Admin C", "email": "admin.c@example.com", "status": "active", "gym_id": 1}}โ Not Found (404)
{"success": false, "message": "Gym admin not found"}โ Success (200)
{"success": true, "message": "Gym admin deleted successfully", "data": {"id": 13, "gym_id": 1}}โ Last Active Admin (409)
{"success": false, "message": "Cannot delete the last active gym admin", "data": {"reason_code": "last_active_admin"}}โ Success (200)
{"success": true, "message": "Gym activated successfully"}โ Success (200)
{"success": true, "message": "Gym deactivated successfully"}โ Success (200, auto expiry)
{"success": true, "message": "Subscription assigned successfully", "data": {"subscription_expiry": "2027-04-30", "expiry_source": "auto", "gym": {"id": 1, "subscription_plan": "yearly"}}}โ Success (200, manual override)
{"success": true, "message": "Subscription assigned successfully", "data": {"subscription_expiry": "2027-12-31", "expiry_source": "manual", "gym": {"id": 1, "subscription_plan": "yearly"}}}โ Success (200)
{"success": true, "message": "Subscription expiry updated successfully", "data": {"gym_id": 1, "old_expiry": "2027-04-30", "subscription_expiry": "2027-06-30", "changed_by": 1, "reason": "Approved extension", "source": "manual"}}โ Success (200)
{"success": true, "message": "Subscription audit history fetched successfully", "data": [{"id": 14, "gym_id": 1, "old_expiry": "2027-04-30", "new_expiry": "2027-06-30", "changed_by": 1, "changed_by_name": "Super Admin", "changed_by_email": "superadmin@gymops.com", "reason": "Approved extension", "source": "manual", "changed_at": "2026-04-30T08:40:00.000000Z"}], "meta": {"current_page": 1, "last_page": 1, "per_page": 15, "total": 1}}โ Success (200)
{"success": true, "data": {"total_gyms": 1, "active_gyms": 1, "inactive_gyms": 0, "monthly_saas_revenue": "12000.00", "gyms": [{"gym_id": "GYM-DEMO0001", "name": "FitLife Gym", "members_count": 2, "status": "active"}]}}โ Success (201)
{"success": true, "message": "Payment recorded successfully", "data": {"id": 1, "gym_id": 1, "amount": "12000.00", "plan": "yearly", "invoice_number": "INV-20260331-AB12CD", "status": "paid"}}โ Success (200) โ status=all/paid
{
"success": true,
"data": {
"data": [
{
"id": 12,
"gym_id": 1,
"gym_name": "FitLife Gym",
"gym_code": "GYM-DEMO0001",
"amount": 5000,
"plan": "monthly",
"status": "paid",
"payment_date": "2026-05-01",
"valid_from": "2026-05-01",
"valid_to": "2026-06-01",
"notes": "Monthly renewal",
"created_at": "2026-05-01T10:00:00+00:00",
"gym": {"id": 1, "name": "FitLife Gym", "gym_id": "GYM-DEMO0001", "status": "active"}
}
],
"current_page": 1,
"last_page": 4,
"per_page": 15,
"total": 57
},
"meta": {
"monthly_total": 12345,
"filtered_total": 54321
}
}โ Success (200) โ status=due alias
{
"success": true,
"data": {
"data": [
{
"gym_id": 3,
"gym_code": "GYM-003",
"gym_name": "Expired Gym",
"due_amount": 5000,
"due_date": "2026-03-15",
"overdue_days_max": 46,
"last_due_date": "2026-03-15"
}
],
"current_page": 1,
"last_page": 1,
"per_page": 15,
"total": 1
},
"meta": {
"monthly_total": 0,
"filtered_total": 5000,
"due_gyms_count": 1,
"total_due_amount": 5000
}
}โ Success (200)
{"success": true, "data": [{"gym_id": 1, "gym_code": "GYM-DEMO0001", "name": "FitLife Gym", "status": "active", "total_paid": "12000.00", "total_payments": 1, "last_payment_date": "2026-03-31"}]}โ 201 Created (cash/upi with reference)
{"success": true, "message": "Payment recorded successfully.", "data": {"id": 5, "gym_id": 1, "gym_name": "FitLife Gym", "gym_code": "GYM-DEMO0001", "amount": 5000.0, "payment_mode": "upi", "plan": "monthly", "status": "paid", "payment_date": "2026-05-02", "valid_from": "2026-05-02", "valid_to": "2026-06-02", "reference_no": "UPI202605020001", "utr_no": null, "cheque_no": null, "cheque_date": null, "notes": null, "created_at": "2026-05-02T10:00:00+05:30"}}โ 422 โ UPI without reference_no/utr_no
{"success": false, "message": "reference_no or utr_no is required for the selected payment mode.", "errors": {"reference_no": ["Provide reference_no or utr_no for this payment mode."], "utr_no": ["Provide reference_no or utr_no for this payment mode."]}}โ 422 โ cheque without cheque_no/cheque_date
{"success": false, "message": "cheque_no and cheque_date are required for cheque mode.", "errors": {"cheque_no": ["The cheque_no field is required for cheque mode."], "cheque_date": ["The cheque_date field is required for cheque mode."]}}โ 422 โ custom plan without valid_to
{"success": false, "message": "The valid to field is required when plan is custom.", "errors": {"valid_to": ["The valid to field is required when plan is custom."]}}โ 200 OK
{"success": true, "message": "Gym payment deleted successfully.", "data": {"id": 15}}โ 404 Not Found
{"message": "No query results for model [App\\Models\\GymPayment] 999999"}โ Paid
{"success": true, "data": {"gym_id": 1, "gym_name": "FitLife Gym", "current_status": "paid", "days_remaining": 30, "days_overdue": 0, "next_due_date": "2026-05-30", "last_payment": {"id": 5, "amount": 5000.0, "plan": "monthly", "receipt_number": "AHX-202604-000001"}}}โ ๏ธ Due
{"success": true, "data": {"gym_id": 2, "gym_name": "Old Gym", "current_status": "due", "days_remaining": 0, "days_overdue": 15, "next_due_date": "2026-04-15", "last_payment": null}}โ 200 OK
{"success": true, "data": {"due_gyms_count": 2, "total_due_amount": 10000.0, "gyms": [{"gym_id": 3, "gym_code": "GYM-003", "gym_name": "Expired Gym", "due_amount": 5000.0, "due_date": "2026-03-15", "overdue_days_max": 46, "last_due_date": "2026-03-15"}, {"gym_id": 5, "gym_code": "GYM-005", "gym_name": "New Gym (No Payment)", "due_amount": 5000.0, "due_date": null, "overdue_days_max": 0, "last_due_date": null}]}}โ 200 OK
{"success": true, "data": {"receipt_number": "AHX-202604-000001", "issued_at": "2026-04-30T10:00:00+05:30", "brand": {"name": "AhaNexa", "logo_text": "AhaNexa", "logo_url": null}, "gym": {"id": 1, "gym_id": "GYM-DEMO0001", "name": "FitLife Gym", "email": "fitlife@example.com", "phone": "9999999999", "address": "123 Main St, Mumbai, Maharashtra, India"}, "payment": {"id": 5, "amount": 5000.0, "plan": "monthly", "payment_date": "2026-04-30", "valid_from": "2026-04-30", "valid_to": "2026-05-30", "status": "paid", "notes": null}, "issued_by": {"name": "Super Admin", "email": "super@ahanexaplatform.com"}, "footer": "Issued by AhaNexa Platform"}}โ 200 OK
{"success": true, "data": [{"id": 5, "gym_id": 1, "gym_name": "FitLife Gym", "amount": 5000.0, "plan": "monthly", "payment_date": "2026-04-30", "valid_from": "2026-04-30", "valid_to": "2026-05-30", "status": "paid", "receipt_number": "AHX-202604-000001"}], "meta": {"current_page": 1, "last_page": 1, "per_page": 15, "total": 1}}โ Success (200)
{"success": true, "data": {"total_gyms": 1, "active_gyms": 1, "inactive_gyms": 0, "total_revenue": "12000.00", "monthly_revenue": "12000.00", "top_gyms": [{"id": 1, "gym_id": "GYM-DEMO0001", "name": "FitLife Gym", "status": "active", "members_count": 2}], "expiry_alerts": []}}โ Success (200)
{"success": true, "message": "Password updated successfully for John Doe", "data": {"user_id": 2, "name": "John Doe", "email": "john@example.com", "role": "gym_admin"}}โ Validation Error (422)
{"success": false, "message": "Validation failed", "errors": {"password": ["The password confirmation does not match."]}}โ Admin Exists โ Password Updated (200)
{"success": true, "message": "Password updated for admin of FitLife Gym", "data": {"user_id": 2, "name": "FitLife Gym Admin", "email": "fitlife@example.com", "created": false}}โ No Admin โ Admin Created (201)
{"success": true, "message": "Admin account created for FitLife Gym", "data": {"user_id": 5, "name": "FitLife Gym Admin", "email": "fitlife@example.com", "created": true}}โ No Email on Gym (422)
{"success": false, "message": "Cannot create admin: gym has no contact email. Update gym_email first."}โ Success (201)
{"success": true, "message": "Trainer added successfully", "data": {"id": 6, "name": "Mike Trainer", "email": "mike.trainer@example.com", "role": "trainer", "trainer_salary": "30000.00"}}โ Success (201)
{"success": true, "message": "Member added successfully", "data": {"id": 7, "name": "Charlie Member", "role": "member", "member_type": "self", "fitness_goal": "General Fitness", "payment_components": {"membership_amount": 2000, "one_time_registration_fee": 300, "total_amount": 2300, "apply_registration_fee": true, "amount": 2300}, "onboarding_payment": {"amount": "2300.00", "membership_amount": "2000.00", "one_time_registration_fee": "300.00", "total_amount": "2300.00", "apply_registration_fee": true, "section_id": 3, "notes": "Initial membership payment during onboarding"}}}โ Success (200) โ Paginated users with full program info
{"success": true, "data": {"current_page": 1, "data": [{"id": 5, "name": "Anjali Das", "role": "member", "status": "active", "section_id": 3, "section_name": "Ladies Multi Gym", "sections": [{"id": 3, "name": "Ladies Multi Gym", "type": "gym"}, {"id": 8, "name": "Top Program", "type": "sport"}], "memberships": [{"id": 11, "member_id": 5, "trainer_id": 3, "section_id": 3, "program_id": 3, "section_name": "Ladies Multi Gym", "program_name": "Ladies Multi Gym", "status": "active", "member_type": "trainer_assigned"}]}, {"id": 3, "name": "John Trainer", "role": "trainer", "section_id": 3, "section_name": "Ladies Multi Gym", "sections": [{"id": 3, "name": "Ladies Multi Gym", "type": "gym"}], "memberships": [{"id": 7, "member_id": null, "trainer_id": 3, "section_id": 3, "program_id": 3, "section_name": "Ladies Multi Gym", "program_name": "Ladies Multi Gym", "status": "active", "member_type": null}]}], "from": 1, "to": 20, "total": 45, "per_page": 20, "last_page": 3}}Program filter: ?role=member§ion_id=3&per_page=20
{"success": true, "data": {"current_page": 1, "data": [...], "total": 12, "per_page": 20, "last_page": 1}}Search: ?role=member§ion_id=3&search=anj&per_page=20
{"success": true, "data": {"current_page": 1, "data": [{"id": 5, "name": "Anjali Das", ...}], "total": 1, "per_page": 20, "last_page": 1}}Response now includes sections[] (all active assigned programs) and memberships[] for member/trainer users.
โ Success (200)
{"success": true, "message": "User updated successfully", "data": {"id": 5, "name": "Updated Member Name", "email": "newemail@example.com", "phone": "9876543210", "address": "123 New Street, City, State 12345", "gender": "male", "emergency_contact": "Mom - 555-1234-5678", "role": "member", "gym_id": 1, "status": "active"}}โ Validation Error (422)
{"success": false, "message": "Validation failed", "errors": {"email": ["The email field must be a valid email address."]}}โ Unchanged Email (422)
{"success": false, "message": "Email is unchanged", "error": "The new email must be different from the current email"}โ Success (200) โ Force Delete
{"success": true, "message": "User force-deleted safely", "data": {"force_mode": true, "counts": {"memberships_cancelled": 1, "trainer_assignments_archived": 0, "member_trainer_links_detached": 1, "membership_trainer_links_detached": 0, "member_payments_kept": 1, "section_membership_payments_kept": 0, "users_soft_deleted": 1}}}โ Blocked (409) โ Default Safe Mode
{"success": false, "message": "Cannot delete: active dependents exist. Retry with force=1 for safe archival.", "data": {"reason_code": "has_dependents", "members_count": 1, "trainers_count": 0, "force_supported": true}}โ Forbidden (403) โ Cross Gym
{"success": false, "message": "You are not allowed to delete users from another gym", "data": {"reason_code": "forbidden_cross_gym"}}โ Success (200)
{"success": true, "message": "Checked in successfully", "data": {"attendance": {"id": 1, "user_id": 3, "gym_id": 1, "date": "2026-03-31", "time_in": "09:30:00", "lat_in": "19.07600000", "long_in": "72.87770000", "distance_in": "0.00", "status": "checked_in"}, "distance_from_gym": "0.00m"}}โ Geo-fence Error (403)
{"success": false, "message": "You are 150.00m away from gym. Must be within 50m.", "data": {"distance": 150.00, "allowed_radius": 50}}No additional parameters. Uses X-User-Id header.
โ Checked In (200)
{"success": true, "data": {"checked_in": true, "attendance": {"id": 1, "date": "2026-03-31", "time_in": "09:30:00", "time_out": null, "status": "checked_in"}}}โน๏ธ Not Checked In (200)
{"success": true, "data": {"checked_in": false, "attendance": null}}Optional pagination. Uses X-User-Id header.
โ Success (200)
{"success": true, "data": {"data": [{"id": 12, "date": "2026-03-30", "time_in": "09:12:00", "time_out": "18:03:00", "status": "checked_out"}], "current_page": 1, "total": 15}}โ Success (200)
{"success": true, "message": "User checked in by admin", "data": {"attendance": {"id": 5, "user_id": 3, "gym_id": 1, "date": "2026-03-31", "time_in": "09:30:00", "status": "checked_in"}}}โ Success (200)
{"success": true, "message": "User checked out by admin", "data": {"attendance": {"id": 5, "user_id": 3, "gym_id": 1, "date": "2026-03-31", "time_in": "09:30:00", "time_out": "17:00:00", "status": "checked_out"}}}โ Success (200)
{"success": true, "data": [{"id": 12, "member_id": 4, "amount": "2000.00", "plan": "monthly", "payment_mode": "upi", "payment_date": "2026-04-29", "valid_from": "2026-04-29", "valid_to": "2026-05-29", "invoice_number": "MP-20260429-000012", "status": "paid", "notes": "April payment", "section_id": 3, "section_name": "Yoga", "member_sections": [{"id": 11, "name": "AssignFlow"}, {"id": 3, "name": "Yoga"}], "all_section_names": "AssignFlow, Yoga", "payment_source": "member_payment", "created_at": "2026-04-30T13:43:51.000000Z", "updated_at": "2026-04-30T13:43:51.000000Z"}, {"id": "smp-17", "member_id": 4, "amount": "1800.00", "plan": "monthly", "payment_mode": "upi", "payment_date": "2026-04-15", "valid_from": "2026-04-15", "valid_to": "2026-05-14", "invoice_number": "SMP-20260415-000017", "status": "paid", "notes": "legacy section payment", "section_id": 11, "section_name": "AssignFlow", "member_sections": [{"id": 11, "name": "AssignFlow"}, {"id": 3, "name": "Yoga"}], "all_section_names": "AssignFlow, Yoga", "payment_source": "section_membership_payment", "created_at": "2026-04-15T11:00:00.000000Z", "updated_at": "2026-04-15T11:00:00.000000Z"}]}โน๏ธ Alias
GET /api/member/payments
โ Empty State (200)
{"success": true, "data": []}โ 403 โ Non-member access denied
{"message": "Forbidden"}โ Success (200)
{"success": true, "data": {"payment_id": "smp-17", "invoice_number": "SMP-20260415-000017", "member_id": 4, "member_name": "Alice Member", "amount": "1800.00", "plan": "monthly", "payment_mode": "upi", "payment_date": "2026-04-15", "valid_from": "2026-04-15", "valid_to": "2026-05-14", "section_id": 11, "section_name": "AssignFlow", "member_type": "trainer_assigned", "trainer_id": 3, "trainer_name": "John Trainer", "status": "paid", "notes": "legacy section payment", "member_sections": [{"id": 11, "name": "AssignFlow"}, {"id": 3, "name": "Yoga"}], "all_section_names": "AssignFlow, Yoga"}}โน๏ธ paymentId formats
mp-29 | smp-17 | 29
โ Not Found (404) โ not owned payment
{"success": false, "message": "Payment not found"}โ Success (201)
{"success": true, "message": "Payment recorded successfully", "data": {"payment": {"id": 1, "member_id": 4, "amount": "2300.00", "membership_amount": "2000.00", "one_time_registration_fee": "300.00", "total_amount": "2300.00", "apply_registration_fee": true, "plan": "monthly", "payment_mode": "upi", "invoice_number": "MP-20260331-000001", "section_id": 3, "valid_from": "2026-04-01", "valid_to": "2026-05-01", "status": "paid"}, "validity": {"membership_start": "2026-04-01", "membership_expiry": "2026-05-01"}}}โน๏ธ Idempotent Replay (200)
{"success": true, "message": "Payment already recorded (idempotent replay)", "data": {"payment": {"id": 1, "invoice_number": "MP-20260331-000001"}}}โ Success (200)
{"success": true, "message": "Payment updated successfully", "data": {"id": 1, "member_id": 4, "amount": "2500.00", "plan": "monthly", "valid_from": "2026-04-15", "valid_to": "2026-05-15", "status": "paid"}}โ 404 โ Payment not found or belongs to another gym
{"error": "Not Found"}โ 422 โ Date validation error
{"error": {"code": "validation_failed", "message": "Validation failed", "details": {"valid_to": ["The valid_to date must be on or after valid_from."]}}}โ Success (200)
{"success": true, "message": "Payment deleted successfully"}โ 404 โ Payment not found or belongs to another gym
{"error": "Not Found"}โ Success (200)
{"success": true, "data": [{"id": 4, "member_id": 4, "name": "Bob Martin", "email": "bob@example.com", "membership_expiry": "2026-04-29", "days_overdue": 1, "section_id": 3, "section_name": "Yoga", "membership_plan": "monthly", "status": "inactive"}]}โ Empty (200)
{"success": true, "data": []}โ Success (200)
{"success": true, "data": {"total_dues_members": 2, "programs": [{"section_id": 5, "section_name": "Boxing", "due_members_count": 2}, {"section_id": 3, "section_name": "Yoga", "due_members_count": 1}]}}โ Empty (200)
{"success": true, "data": {"total_dues_members": 0, "programs": []}}โ Success (200)
{"success": true, "message": "Salary defined successfully", "data": {"trainer": {"id": 3, "trainer_salary": "30000.00"}, "increment_audit": {"id": 1, "old_salary": "25000.00", "new_salary": "30000.00", "increment_amount": "5000.00", "increment_percent": "20.00", "reason": "Annual increment", "effective_date": "2026-04-30"}}}โ Success (200)
{"success": true, "data": {"data": [{"id": 1, "trainer_id": 3, "old_salary": "25000.00", "new_salary": "30000.00", "increment_amount": "5000.00", "increment_percent": "20.00", "reason": "Annual increment", "effective_date": "2026-04-30", "changed_by": 2}], "current_page": 1, "total": 1}}โ Success (200)
{"success": true, "data": {"data": [{"id": 10, "trainer_id": 3, "amount": "30000.00", "salary_month": "2026-04", "status": "paid"}], "current_page": 1, "total": 1}}โ Success (201)
{"success": true, "message": "Salary record created", "data": {"id": 1, "trainer_id": 3, "amount": "25000.00", "salary_month": "2026-03", "status": "paid"}}โ Success (200)
{
"success": true,
"data": [
{
"id": 5,
"name": "Alice Member",
"email": "alice@example.com",
"phone": "1234567890",
"fitness_goal": "Weight Loss",
"gender": "Female",
"membership_start": "2025-01-10",
"membership_expiry": "2025-04-10",
"membership_plan": "Gold",
"status": "active",
"is_active": true
}
]
}โ Success (200)
{
"success": true,
"data": [
{
"id": 15,
"trainer_id": 3,
"amount": "50000.00",
"salary_month": "2025-02",
"status": "paid",
"payment_date": "2025-02-05",
"notes": "Regular salary"
},
{
"id": 14,
"trainer_id": 3,
"amount": "50000.00",
"salary_month": "2025-01",
"status": "pending",
"payment_date": null,
"notes": null
}
]
}โ Success (200)
{"success": true, "data": [{"program_id": 11, "program_name": "Yoga", "assignment_id": 9, "status": "active"}]}โน๏ธ Use Raw JSON tab
program_ids must be sent as an array, e.g. {"program_ids":[1,2,3]}โ Success (200)
{"success": true, "data": [{"program_id": 11, "program_name": "Yoga", "assignment_id": 15, "status": "active", "member_type": "self", "trainer_id": null}]}โน๏ธ Use Raw JSON tab
program_ids must be sent as an array, e.g. {"program_ids":[1,2,3]}โ Success (200)
{"success": true, "data": {"members_count": 2, "active_members": 2, "trainers_count": 1, "monthly_earnings": "4000.00", "today_attendance": 3, "monthly_attendance": 45, "total_dues_members": 2, "dues_program_breakdown": [{"section_id": 5, "section_name": "Boxing", "due_members_count": 2}, {"section_id": 3, "section_name": "Yoga", "due_members_count": 1}]}}You do not pass
gym_id in the request body. The server reads the authenticated user's gym from the X-User-Id header and scopes every section to that gym.Use X-User-Id: 2 (Gym Admin of FitLife Gym โ gym_id=1, corp_id=
GYM-DEMO0001) for all section endpoints.
โ Success (201)
{"success": true, "message": "Section created successfully", "data": {"id": 1, "gym_id": 1, "name": "Non A/C Gym", "type": "gym", "monthly_fee": "500.00", "yearly_fee": "5000.00", "status": "active"}}โน๏ธ SaaS Scope
corp_id is auto-attached from the logged-in gym (no need to pass in request).
๐ก Typical sections to create
โข Non A/C Gym (type: gym) โข Premium Gym (type: gym) โข Ladies Gym (type: gym) โข Badminton (type: sport)
โ Success (200)
{"success": true, "data": [{"id": 1, "name": "Non A/C Gym", "type": "gym", "monthly_fee": "500.00", "yearly_fee": "5000.00", "status": "active", "active_members_count": 12, "assigned_trainers_count": 2}]}โ Success (200)
{"success": true, "data": {"id": 1, "name": "Non A/C Gym", "type": "gym", "monthly_fee": "500.00", "yearly_fee": "5000.00", "status": "active", "active_members_count": 12, "assigned_trainers_count": 2}}โ Success (200)
{"success": true, "message": "Section updated successfully", "data": {"id": 1, "name": "Non A/C Gym", "monthly_fee": "600.00"}}โ Success (201)
{"success": true, "message": "Trainer assigned to section", "data": {"id": 1, "section_id": 1, "trainer_id": 3, "status": "active", "trainer": {"id": 3, "name": "John Trainer", "email": "trainer@gym.com"}}}โ Success (200)
{"success": true, "data": {"data": [{"id": 1, "member": {"id": 4, "name": "Alice", "email": "alice@gym.com"}, "trainer": null, "plan": "monthly", "expiry_date": "2026-05-24", "status": "active"}]}}โ Success (201)
{"success":true,"message":"Members assigned to section successfully","data":{"created_memberships":[{"id":12,"section_id":1,"member_id":4,"status":"active"}],"skipped_members":[],"section":{"id":1,"name":"Yoga","members_count":3,"trainers_count":1}}}gym_id in the body. The enrollment is automatically scoped to the gym admin's gym.section_id and member_id must both belong to the same gym. Use X-User-Id: 2 (Gym Admin).
โ Success (201)
{"success": true, "message": "Member enrolled in section successfully", "data": {"id": 1, "section": {"id": 1, "name": "Non A/C Gym", "type": "gym"}, "member": {"id": 4, "name": "Alice"}, "trainer": null, "member_type": "self", "plan": "monthly", "amount": "500.00", "start_date": "2026-04-24", "expiry_date": "2026-05-24", "status": "active"}}โ Already enrolled (422)
{"success": false, "message": "Member is already actively enrolled in this section. Use payment endpoint to extend expiry."}section_membership_id must belong to a membership within the same gym. Use X-User-Id: 2 (Gym Admin).
โ Success (201)
{"success": true, "message": "Payment recorded. Membership extended to 2026-06-24", "data": {"payment": {"id": 1, "amount": "500.00", "payment_mode": "cash", "plan": "monthly", "valid_from": "2026-05-24", "valid_to": "2026-06-24"}, "membership": {"id": 1, "expiry_date": "2026-06-24", "status": "active"}, "validity": {"base_start": "2026-05-24", "new_expiry": "2026-06-24"}}}Multipart fields
payment_qr (file): jpg/jpeg/png/webp, max 4MB online_payment_enabled / is_enabled: true|false|1|0 upi_id: string instructions: string remove_qr_image: true|false|1|0 If remove_qr_image=true, previous QR image is deleted and payment_qr_url becomes null.
โ Success (200)
{"success": true, "message": "Live QR fetched successfully", "data": {"qr_session_id": 21, "qr_token": "...", "expires_at": "2026-05-02T11:10:00Z"}}โ Blocked (403 inactive gym)
{"success": false, "message": "Gym is inactive or blocked. Contact Super Admin.", "code": "GYM_INACTIVE", "data": null}โ Success (200)
{"success": true, "message": "QR session refreshed successfully", "data": {"qr_session_id": 22, "qr_token": "...", "expires_at": "2026-05-02T11:15:00Z"}}โ Blocked (403 inactive gym)
{"success": false, "message": "Gym is inactive or blocked. Contact Super Admin.", "code": "GYM_INACTIVE", "data": null}GymOps API v1.0 • Built with Laravel • Multi-Tenant SaaS Gym Management
Seed Users: Super Admin (ID: 1) • Gym Admin (ID: 2) • Trainer (ID: 3) • Member Alice (ID: 4) • Member Bob (ID: 5)