openapi: 3.0.3 info: title: API سامانه تعاملات بین‌الملل version: 2.0.0 description: مستندات نقاط پایانی سامانه تعاملات بین‌الملل آستان قدس رضوی (فاز دوم) paths: /api/v1/account/admin/directory-users/: get: operationId: v1_account_admin_directory_users_list description: |- Separate, dedicated endpoint for accounts/users list page. Filters users who have an email, are not deleted (deleted_at is null). parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: Number of results to return per page. schema: type: integer tags: - v1 security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedAdminUserList' description: '' post: operationId: v1_account_admin_directory_users_create description: |- Separate, dedicated endpoint for accounts/users list page. Filters users who have an email, are not deleted (deleted_at is null). tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/AdminUserRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/AdminUserRequest' multipart/form-data: schema: $ref: '#/components/schemas/AdminUserRequest' required: true security: - tokenAuth: [] - jwtAuth: [] responses: '201': content: application/json: schema: $ref: '#/components/schemas/AdminUser' description: '' /api/v1/account/admin/directory-users/{id}/: get: operationId: v1_account_admin_directory_users_retrieve description: |- Separate, dedicated endpoint for accounts/users list page. Filters users who have an email, are not deleted (deleted_at is null). parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this User. required: true tags: - v1 security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/AdminUser' description: '' put: operationId: v1_account_admin_directory_users_update description: |- Separate, dedicated endpoint for accounts/users list page. Filters users who have an email, are not deleted (deleted_at is null). parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this User. required: true tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/AdminUserRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/AdminUserRequest' multipart/form-data: schema: $ref: '#/components/schemas/AdminUserRequest' required: true security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/AdminUser' description: '' patch: operationId: v1_account_admin_directory_users_partial_update description: |- Separate, dedicated endpoint for accounts/users list page. Filters users who have an email, are not deleted (deleted_at is null). parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this User. required: true tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedAdminUserRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedAdminUserRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedAdminUserRequest' security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/AdminUser' description: '' delete: operationId: v1_account_admin_directory_users_destroy description: |- Separate, dedicated endpoint for accounts/users list page. Filters users who have an email, are not deleted (deleted_at is null). parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this User. required: true tags: - v1 security: - tokenAuth: [] - jwtAuth: [] responses: '204': description: No response body /api/v1/account/admin/directory-users/export_excel/: get: operationId: v1_account_admin_directory_users_export_excel_retrieve description: |- Export users to an Excel (.xlsx) file. Accepts user_ids in POST body for selective bulk export, or uses current queryset filters if no specific IDs are provided. tags: - v1 security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/AdminUser' description: '' post: operationId: v1_account_admin_directory_users_export_excel_create description: |- Export users to an Excel (.xlsx) file. Accepts user_ids in POST body for selective bulk export, or uses current queryset filters if no specific IDs are provided. tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/AdminUserRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/AdminUserRequest' multipart/form-data: schema: $ref: '#/components/schemas/AdminUserRequest' required: true security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/AdminUser' description: '' /api/v1/account/admin/login/: post: operationId: v1_account_admin_login_create tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/UserLoginRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UserLoginRequest' multipart/form-data: schema: $ref: '#/components/schemas/UserLoginRequest' required: true security: - jwtAuth: [] - {} responses: '201': content: application/json: schema: $ref: '#/components/schemas/UserLogin' description: '' /api/v1/account/admin/notification-templates/: get: operationId: v1_account_admin_notification_templates_list parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: Number of results to return per page. schema: type: integer tags: - v1 security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedNotificationTemplateList' description: '' post: operationId: v1_account_admin_notification_templates_create tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/NotificationTemplateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/NotificationTemplateRequest' multipart/form-data: schema: $ref: '#/components/schemas/NotificationTemplateRequest' required: true security: - tokenAuth: [] - jwtAuth: [] responses: '201': content: application/json: schema: $ref: '#/components/schemas/NotificationTemplate' description: '' /api/v1/account/admin/notification-templates/{id}/: get: operationId: v1_account_admin_notification_templates_retrieve parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this Notification Template. required: true tags: - v1 security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/NotificationTemplate' description: '' put: operationId: v1_account_admin_notification_templates_update parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this Notification Template. required: true tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/NotificationTemplateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/NotificationTemplateRequest' multipart/form-data: schema: $ref: '#/components/schemas/NotificationTemplateRequest' required: true security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/NotificationTemplate' description: '' patch: operationId: v1_account_admin_notification_templates_partial_update parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this Notification Template. required: true tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedNotificationTemplateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedNotificationTemplateRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedNotificationTemplateRequest' security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/NotificationTemplate' description: '' delete: operationId: v1_account_admin_notification_templates_destroy parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this Notification Template. required: true tags: - v1 security: - tokenAuth: [] - jwtAuth: [] responses: '204': description: No response body /api/v1/account/admin/notifications/: get: operationId: v1_account_admin_notifications_list parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: Number of results to return per page. schema: type: integer tags: - v1 security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedAdminNotificationList' description: '' post: operationId: v1_account_admin_notifications_create tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/AdminNotificationRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/AdminNotificationRequest' multipart/form-data: schema: $ref: '#/components/schemas/AdminNotificationRequest' required: true security: - tokenAuth: [] - jwtAuth: [] responses: '201': content: application/json: schema: $ref: '#/components/schemas/AdminNotification' description: '' /api/v1/account/admin/notifications/{id}/: get: operationId: v1_account_admin_notifications_retrieve parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this Notification. required: true tags: - v1 security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/AdminNotification' description: '' put: operationId: v1_account_admin_notifications_update parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this Notification. required: true tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/AdminNotificationRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/AdminNotificationRequest' multipart/form-data: schema: $ref: '#/components/schemas/AdminNotificationRequest' required: true security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/AdminNotification' description: '' patch: operationId: v1_account_admin_notifications_partial_update parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this Notification. required: true tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedAdminNotificationRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedAdminNotificationRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedAdminNotificationRequest' security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/AdminNotification' description: '' delete: operationId: v1_account_admin_notifications_destroy parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this Notification. required: true tags: - v1 security: - tokenAuth: [] - jwtAuth: [] responses: '204': description: No response body /api/v1/account/admin/users/: get: operationId: v1_account_admin_users_list description: |- Admin-only endpoint for full CRUD operations on Users. Includes searching, filtering, and pagination. parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: Number of results to return per page. schema: type: integer tags: - v1 security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedAdminUserList' description: '' post: operationId: v1_account_admin_users_create description: |- Admin-only endpoint for full CRUD operations on Users. Includes searching, filtering, and pagination. tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/AdminUserRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/AdminUserRequest' multipart/form-data: schema: $ref: '#/components/schemas/AdminUserRequest' required: true security: - tokenAuth: [] - jwtAuth: [] responses: '201': content: application/json: schema: $ref: '#/components/schemas/AdminUser' description: '' /api/v1/account/admin/users/{id}/: get: operationId: v1_account_admin_users_retrieve description: |- Admin-only endpoint for full CRUD operations on Users. Includes searching, filtering, and pagination. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this User. required: true tags: - v1 security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/AdminUser' description: '' put: operationId: v1_account_admin_users_update description: |- Admin-only endpoint for full CRUD operations on Users. Includes searching, filtering, and pagination. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this User. required: true tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/AdminUserRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/AdminUserRequest' multipart/form-data: schema: $ref: '#/components/schemas/AdminUserRequest' required: true security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/AdminUser' description: '' patch: operationId: v1_account_admin_users_partial_update description: |- Admin-only endpoint for full CRUD operations on Users. Includes searching, filtering, and pagination. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this User. required: true tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedAdminUserRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedAdminUserRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedAdminUserRequest' security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/AdminUser' description: '' delete: operationId: v1_account_admin_users_destroy description: |- Admin-only endpoint for full CRUD operations on Users. Includes searching, filtering, and pagination. parameters: - in: path name: id schema: type: integer description: A unique integer value identifying this User. required: true tags: - v1 security: - tokenAuth: [] - jwtAuth: [] responses: '204': description: No response body /api/v1/account/admin/users/export_excel/: get: operationId: v1_account_admin_users_export_excel_retrieve description: |- Export users to an Excel (.xlsx) file. Accepts user_ids in POST body for selective bulk export, or uses current queryset filters if no specific IDs are provided. tags: - v1 security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/AdminUser' description: '' post: operationId: v1_account_admin_users_export_excel_create description: |- Export users to an Excel (.xlsx) file. Accepts user_ids in POST body for selective bulk export, or uses current queryset filters if no specific IDs are provided. tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/AdminUserRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/AdminUserRequest' multipart/form-data: schema: $ref: '#/components/schemas/AdminUserRequest' required: true security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/AdminUser' description: '' /api/v1/account/exchange-token/: post: operationId: v1_account_exchange_token_create description: تبدیل temporary token به اطلاعات کاربر برای ورود از اپ موبایل tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/ExchangeTokenRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/ExchangeTokenRequest' multipart/form-data: schema: $ref: '#/components/schemas/ExchangeTokenRequest' required: true security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/ExchangeToken' description: '' /api/v1/account/guest/: post: operationId: v1_account_guest_create tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/UserGuestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UserGuestRequest' multipart/form-data: schema: $ref: '#/components/schemas/UserGuestRequest' security: - jwtAuth: [] - {} responses: '201': content: application/json: schema: $ref: '#/components/schemas/UserGuest' description: '' /api/v1/account/location-update/: post: operationId: v1_account_location_update_create description: Records client coordinates and IP address for session security. summary: Record location update tags: - Location requestBody: content: application/json: schema: $ref: '#/components/schemas/LocationHistoryRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/LocationHistoryRequest' multipart/form-data: schema: $ref: '#/components/schemas/LocationHistoryRequest' security: - tokenAuth: [] - jwtAuth: [] responses: '201': content: application/json: schema: $ref: '#/components/schemas/LocationHistory' description: '' /api/v1/account/login/: post: operationId: v1_account_login_create tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/UserLoginRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UserLoginRequest' multipart/form-data: schema: $ref: '#/components/schemas/UserLoginRequest' required: true security: - jwtAuth: [] - {} responses: '201': content: application/json: schema: $ref: '#/components/schemas/UserLogin' description: '' /api/v1/account/notif/: get: operationId: v1_account_notif_list description: Retrieve a paginated list of notifications for the authenticated user. summary: Retrieve user notifications parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: Number of results to return per page. schema: type: integer tags: - Notifications security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedNotificationList' description: '' /api/v1/account/notif/read/: post: operationId: v1_account_notif_read_create description: Mark all notifications as read for the authenticated user. summary: Mark all notifications as read tags: - Notifications security: - tokenAuth: [] - jwtAuth: [] responses: '200': description: All notifications marked as read /api/v1/account/notif/send/: post: operationId: v1_account_notif_send_create description: Dispatch an in-app notification to a specific user. summary: Send notification to user tags: - Notifications requestBody: content: application/json: schema: $ref: '#/components/schemas/SendNotificationRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/SendNotificationRequest' multipart/form-data: schema: $ref: '#/components/schemas/SendNotificationRequest' required: true security: - tokenAuth: [] - jwtAuth: [] responses: '200': description: Notification dispatched. '404': description: User not found. /api/v1/account/profile/: get: operationId: v1_account_profile_retrieve tags: - v1 security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserProfile' description: '' /api/v1/account/profile/delete/: delete: operationId: v1_account_profile_delete_destroy description: Soft deletes the current authenticated user account and revokes active tokens. summary: Delete current user account tags: - Account security: - tokenAuth: [] - jwtAuth: [] responses: '204': description: Account successfully deleted '404': description: User does not exist /api/v1/account/profile/update/: put: operationId: v1_account_profile_update_update tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/UserProfileRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UserProfileRequest' multipart/form-data: schema: $ref: '#/components/schemas/UserProfileRequest' security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserProfile' description: '' patch: operationId: v1_account_profile_update_partial_update tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedUserProfileRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedUserProfileRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedUserProfileRequest' security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserProfile' description: '' /api/v1/account/recover/: post: operationId: v1_account_recover_create tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/UserRecoverPasswordRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UserRecoverPasswordRequest' multipart/form-data: schema: $ref: '#/components/schemas/UserRecoverPasswordRequest' required: true security: - jwtAuth: [] - {} responses: '201': content: application/json: schema: $ref: '#/components/schemas/UserRecoverPassword' description: '' /api/v1/account/region-info/: get: operationId: v1_account_region_info_retrieve description: Returns basic client region, browser, and network info. summary: Get client region info tags: - Location security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/RegionInfo' description: '' /api/v1/account/register/: post: operationId: v1_account_register_create tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/UserRegisterRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UserRegisterRequest' multipart/form-data: schema: $ref: '#/components/schemas/UserRegisterRequest' required: true security: - jwtAuth: [] - {} responses: '201': content: application/json: schema: $ref: '#/components/schemas/UserRegister' description: '' /api/v1/account/reset/: post: operationId: v1_account_reset_create tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/UserResetPasswordRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UserResetPasswordRequest' multipart/form-data: schema: $ref: '#/components/schemas/UserResetPasswordRequest' required: true security: - tokenAuth: [] - jwtAuth: [] responses: '201': description: No response body /api/v1/account/update-fcm/: post: operationId: v1_account_update_fcm_create tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/UserFCMRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UserFCMRequest' multipart/form-data: schema: $ref: '#/components/schemas/UserFCMRequest' security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserFCM' description: '' /api/v1/account/verify/: post: operationId: v1_account_verify_create tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/UserVerifyRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UserVerifyRequest' multipart/form-data: schema: $ref: '#/components/schemas/UserVerifyRequest' required: true security: - jwtAuth: [] - {} responses: '201': content: application/json: schema: $ref: '#/components/schemas/UserVerify' description: '' /api/v1/account/web/register/: post: operationId: v1_account_web_register_create tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/WebUserRegisterRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/WebUserRegisterRequest' multipart/form-data: schema: $ref: '#/components/schemas/WebUserRegisterRequest' required: true security: - jwtAuth: [] - {} responses: '201': content: application/json: schema: $ref: '#/components/schemas/WebUserRegister' description: '' /api/v1/auth/documents/: get: operationId: v1_auth_documents_list description: Retrieves a list of verification documents uploaded by the current user or managed by admin. summary: List user verification documents parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: Number of results to return per page. schema: type: integer tags: - Authentication & Profile security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedVerificationDocumentList' description: '' post: operationId: v1_auth_documents_create description: Uploads an identity card, passport, institutional license, or recommendation letter for account verification. summary: Upload verification document tags: - Authentication & Profile requestBody: content: multipart/form-data: schema: $ref: '#/components/schemas/VerificationDocumentUploadRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/VerificationDocumentUploadRequest' application/json: schema: $ref: '#/components/schemas/VerificationDocumentUploadRequest' required: true security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '201': content: application/json: schema: $ref: '#/components/schemas/VerificationDocument' description: '' '400': description: Invalid document upload data /api/v1/auth/me/: get: operationId: v1_auth_me_retrieve description: Returns detailed profile data, role hierarchy, and verification status for authenticated user. summary: Get current user details and permissions tags: - Authentication & Profile security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserMe' description: '' patch: operationId: v1_auth_me_partial_update description: Partially updates user profile attributes (name, phone, bio, languages, skills, country, city, avatar). summary: Update current user details tags: - Authentication & Profile requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedUserMeUpdateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedUserMeUpdateRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedUserMeUpdateRequest' security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserMe' description: '' /api/v1/auth/recover-password/: post: operationId: v1_auth_recover_password_create description: Generates and dispatches a password recovery token to the specified user email. summary: Request password recovery token tags: - Authentication & Profile requestBody: content: application/json: schema: $ref: '#/components/schemas/PasswordRecoverRequestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PasswordRecoverRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/PasswordRecoverRequestRequest' required: true security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '200': description: Reset instructions sent if email exists /api/v1/auth/register/: post: operationId: v1_auth_register_create description: Creates a new account and immediately issues JWT access and refresh tokens. summary: Register new user or representative tags: - Authentication & Profile requestBody: content: application/json: schema: $ref: '#/components/schemas/RegisterRequestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/RegisterRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/RegisterRequestRequest' required: true security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '201': content: application/json: schema: $ref: '#/components/schemas/RegisterResponse' description: '' '400': description: Validation error /api/v1/auth/reset-password/: post: operationId: v1_auth_reset_password_create description: Resets the account password given a valid verification token. summary: Reset user password using token tags: - Authentication & Profile requestBody: content: application/json: schema: $ref: '#/components/schemas/PasswordResetRequestRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PasswordResetRequestRequest' multipart/form-data: schema: $ref: '#/components/schemas/PasswordResetRequestRequest' required: true security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '200': description: Password reset successfully '400': description: Invalid or expired token /api/v1/auth/token/: post: operationId: v1_auth_token_create description: |- Takes a set of user credentials and returns an access and refresh JSON web token pair to prove the authentication of those credentials. tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/TokenObtainPairRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/TokenObtainPairRequest' multipart/form-data: schema: $ref: '#/components/schemas/TokenObtainPairRequest' required: true security: - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/TokenObtainPair' description: '' /api/v1/auth/token/refresh/: post: operationId: v1_auth_token_refresh_create description: |- Takes a refresh type JSON web token and returns an access type JSON web token if the refresh token is valid. tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/TokenRefreshRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/TokenRefreshRequest' multipart/form-data: schema: $ref: '#/components/schemas/TokenRefreshRequest' required: true security: - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/TokenRefresh' description: '' /api/v1/auth/token/verify/: post: operationId: v1_auth_token_verify_create description: |- Takes a token and indicates if it is valid. This view provides no information about a token's fitness for a particular use. tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/TokenVerifyRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/TokenVerifyRequest' multipart/form-data: schema: $ref: '#/components/schemas/TokenVerifyRequest' required: true security: - jwtAuth: [] responses: '200': description: No response body /api/v1/chat/centrifugo-token/: get: operationId: v1_chat_centrifugo_token_retrieve description: Generates an HMAC-SHA256 connection JWT for client WebSocket authentication with Centrifugo v5. summary: Obtain Centrifugo real-time WebSocket connection token tags: - Real-Time Messaging & Chat security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/CentrifugoTokenResponse' description: '' /api/v1/chat/rooms/: get: operationId: v1_chat_rooms_list description: Returns all active direct and group conversations for the authenticated user with unread counts. summary: List active conversations & direct chats parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: Number of results to return per page. schema: type: integer tags: - Real-Time Messaging & Chat security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedChatRoomListList' description: '' post: operationId: v1_chat_rooms_create description: Creates a new direct chat or multi-institution group room. Reuses existing direct chat if already active. summary: Start conversation with user or institution tags: - Real-Time Messaging & Chat requestBody: content: application/json: schema: $ref: '#/components/schemas/ChatRoomCreateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/ChatRoomCreateRequest' multipart/form-data: schema: $ref: '#/components/schemas/ChatRoomCreateRequest' security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '201': content: application/json: schema: $ref: '#/components/schemas/ChatRoomDetail' description: '' '200': content: application/json: schema: $ref: '#/components/schemas/ChatRoomDetail' description: '' '400': description: Validation error /api/v1/chat/rooms/{id}/: get: operationId: v1_chat_rooms_retrieve description: Retrieves metadata, participants, and channel name for a conversation. summary: Get chat room details & metadata parameters: - in: path name: id schema: type: integer required: true tags: - Real-Time Messaging & Chat security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/ChatRoomDetail' description: '' '403': description: Not a participant in this conversation '404': description: Room not found /api/v1/chat/rooms/{id}/messages/: get: operationId: v1_chat_rooms_messages_list description: Returns paginated message history for a conversation and marks messages as read. summary: Get message history for chat room parameters: - in: path name: id schema: type: integer required: true - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: Number of results to return per page. schema: type: integer tags: - Real-Time Messaging & Chat security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedChatMessageList' description: '' post: operationId: v1_chat_rooms_messages_create description: Persists message to database and broadcasts real-time WebSocket event via Centrifugo. summary: Send message in conversation parameters: - in: path name: id schema: type: integer required: true tags: - Real-Time Messaging & Chat requestBody: content: multipart/form-data: schema: $ref: '#/components/schemas/ChatMessageCreateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/ChatMessageCreateRequest' application/json: schema: $ref: '#/components/schemas/ChatMessageCreateRequest' security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '201': content: application/json: schema: $ref: '#/components/schemas/ChatMessage' description: '' '400': description: Validation error '403': description: Permission denied /api/v1/chat/rooms/{id}/read/: post: operationId: v1_chat_rooms_read_create description: Updates read receipts for all messages in the room and emits read event. summary: Mark all conversation messages as read parameters: - in: path name: id schema: type: integer required: true tags: - Real-Time Messaging & Chat security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '200': description: Messages marked as read /api/v1/cms/categories/: get: operationId: v1_cms_categories_list description: Returns content categories with optional language filtering. summary: List post categories parameters: - in: query name: language schema: type: string description: Filter categories by language code (fa, ar, en, ur, fr) - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: Number of results to return per page. schema: type: integer tags: - Content Management System (CMS) security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedPostCategoryList' description: '' /api/v1/cms/media/: get: operationId: v1_cms_media_list description: Retrieves uploaded photos, videos, and documents. summary: List media library assets parameters: - in: query name: media_type schema: type: string description: Filter by media type (image, video, audio, document) - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: Number of results to return per page. schema: type: integer tags: - Content Management System (CMS) security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedMediaAssetList' description: '' post: operationId: v1_cms_media_create description: Uploads a new photo, document, or audio file to the media library. summary: Upload media asset tags: - Content Management System (CMS) requestBody: content: multipart/form-data: schema: $ref: '#/components/schemas/MediaAssetRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/MediaAssetRequest' application/json: schema: $ref: '#/components/schemas/MediaAssetRequest' required: true security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '201': content: application/json: schema: $ref: '#/components/schemas/MediaAsset' description: '' /api/v1/cms/posts/: get: operationId: v1_cms_posts_list description: Returns a paginated list of published news, articles, and interviews with multilingual filtering. summary: List multilingual posts & articles parameters: - in: query name: author_id schema: type: integer description: Filter by author user ID - in: query name: category schema: type: string description: Filter by category ID or slug - in: query name: institution_id schema: type: integer description: Filter by associated institution ID - in: query name: is_featured schema: type: boolean description: Filter by featured status - in: query name: language schema: type: string description: Filter by language code (fa, ar, en, ur, fr) - in: query name: my_posts schema: type: boolean description: Filter by current authenticated user posts - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: Number of results to return per page. schema: type: integer - in: query name: post_type schema: type: string description: Filter by type (news, article, report, interview) - in: query name: search schema: type: string description: Search text in title, excerpt, and content - in: query name: status schema: type: string description: Filter by status (staff/admin only) - in: query name: tag schema: type: string description: Filter by tag string tags: - Content Management System (CMS) security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedPostListList' description: '' post: operationId: v1_cms_posts_create description: Creates a new article, news announcement, or report. summary: Publish or draft new post tags: - Content Management System (CMS) requestBody: content: application/json: schema: $ref: '#/components/schemas/PostCreateUpdateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PostCreateUpdateRequest' multipart/form-data: schema: $ref: '#/components/schemas/PostCreateUpdateRequest' required: true security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '201': content: application/json: schema: $ref: '#/components/schemas/PostDetail' description: '' '400': description: Validation error '401': description: Authentication required /api/v1/cms/posts/{pk_or_slug}/: get: operationId: v1_cms_posts_retrieve description: Retrieves full article content and increments the view counter. summary: Get full post details parameters: - in: path name: pk_or_slug schema: type: string required: true tags: - Content Management System (CMS) security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/PostDetail' description: '' '404': description: Post not found patch: operationId: v1_cms_posts_partial_update description: Updates an existing post. Permitted for original author, institution editors, or platform admins. summary: Update post parameters: - in: path name: pk_or_slug schema: type: string required: true tags: - Content Management System (CMS) requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedPostCreateUpdateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedPostCreateUpdateRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedPostCreateUpdateRequest' security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/PostDetail' description: '' '403': description: Permission denied delete: operationId: v1_cms_posts_destroy description: Removes a post from the platform. summary: Delete post parameters: - in: path name: pk_or_slug schema: type: string required: true tags: - Content Management System (CMS) security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '204': description: Post deleted successfully '403': description: Permission denied /api/v1/cms/posts/{pk_or_slug}/comments/: get: operationId: v1_cms_posts_comments_list description: Retrieves approved reader comments for a post. summary: List post comments parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: Number of results to return per page. schema: type: integer - in: path name: pk_or_slug schema: type: string required: true tags: - Content Management System (CMS) security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedPostCommentList' description: '' post: operationId: v1_cms_posts_comments_create description: Submits a comment on an article. summary: Submit post comment parameters: - in: path name: pk_or_slug schema: type: string required: true tags: - Content Management System (CMS) requestBody: content: application/json: schema: $ref: '#/components/schemas/PostCommentCreateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PostCommentCreateRequest' multipart/form-data: schema: $ref: '#/components/schemas/PostCommentCreateRequest' required: true security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '201': content: application/json: schema: $ref: '#/components/schemas/PostComment' description: '' '400': description: Validation error /api/v1/cms/posts/{pk_or_slug}/like/: post: operationId: v1_cms_posts_like_create description: Likes or unlikes an article for the authenticated user and updates the like counter. summary: Toggle like on post parameters: - in: path name: pk_or_slug schema: type: string required: true tags: - Content Management System (CMS) requestBody: content: application/json: schema: $ref: '#/components/schemas/PostLikeResponseRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PostLikeResponseRequest' multipart/form-data: schema: $ref: '#/components/schemas/PostLikeResponseRequest' required: true security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/PostLikeResponse' description: '' /api/v1/cms/tags/: get: operationId: v1_cms_tags_list description: Returns distinct content tags used across posts. summary: List CMS tags parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: Number of results to return per page. schema: type: integer tags: - Content Management System (CMS) security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedPostTagList' description: '' /api/v1/contact-us/: post: operationId: v1_contact_us_create description: Submit a user contact or support inquiry tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/SupportMessageCreateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/SupportMessageCreateRequest' multipart/form-data: schema: $ref: '#/components/schemas/SupportMessageCreateRequest' required: true security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '201': content: application/json: schema: $ref: '#/components/schemas/SupportMessageCreate' description: '' /api/v1/events/: get: operationId: v1_events_list description: Filter events by category, date range, institution organizer, location type, and search keywords. summary: List events and programs parameters: - in: query name: category schema: type: string description: Event category filter - in: query name: end_date schema: type: string format: date description: Filter to date (YYYY-MM-DD) - in: query name: is_featured schema: type: boolean description: Filter featured events - in: query name: language schema: type: string description: Event language (fa, ar, en, ur, fr) - in: query name: location_type schema: type: string description: in_person, online, or hybrid - in: query name: organizer schema: type: integer description: Organizer institution ID - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: Number of results to return per page. schema: type: integer - in: query name: search schema: type: string description: Search in title, description, or speaker - in: query name: start_date schema: type: string format: date description: Filter from date (YYYY-MM-DD) tags: - Events security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedEventListList' description: '' post: operationId: v1_events_create description: Create an event on behalf of an institution where the user is an admin/editor. summary: Create a new event tags: - Events requestBody: content: application/json: schema: $ref: '#/components/schemas/EventCreateUpdateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/EventCreateUpdateRequest' multipart/form-data: schema: $ref: '#/components/schemas/EventCreateUpdateRequest' required: true security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '201': content: application/json: schema: $ref: '#/components/schemas/EventDetail' description: '' /api/v1/events/{id_or_slug}/: get: operationId: v1_events_retrieve description: Get full event details, speaker bio, registration status for current user, and venue/meeting info. summary: Retrieve event details parameters: - in: path name: id_or_slug schema: type: string required: true tags: - Events security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/EventDetail' description: '' put: operationId: v1_events_update parameters: - in: path name: id_or_slug schema: type: string required: true tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/EventCreateUpdateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/EventCreateUpdateRequest' multipart/form-data: schema: $ref: '#/components/schemas/EventCreateUpdateRequest' required: true security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/EventCreateUpdate' description: '' patch: operationId: v1_events_partial_update description: Update event metadata (requires organizer admin/editor permission). summary: Update event parameters: - in: path name: id_or_slug schema: type: string required: true tags: - Events requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedEventCreateUpdateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedEventCreateUpdateRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedEventCreateUpdateRequest' security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/EventDetail' description: '' delete: operationId: v1_events_destroy description: Delete or deactivate an event. summary: Delete event parameters: - in: path name: id_or_slug schema: type: string required: true tags: - Events security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '204': description: No response body /api/v1/events/{id_or_slug}/cancel-registration/: post: operationId: v1_events_cancel_registration_create description: Cancel registration for the current authenticated user. summary: Cancel event registration parameters: - in: path name: id_or_slug schema: type: string required: true tags: - Events security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/EventDetail' description: '' /api/v1/events/{id_or_slug}/register/: post: operationId: v1_events_register_create description: Register the current authenticated user for this event. summary: Register for an event parameters: - in: path name: id_or_slug schema: type: string required: true tags: - Events requestBody: content: application/json: schema: $ref: '#/components/schemas/EventRegisterInputRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/EventRegisterInputRequest' multipart/form-data: schema: $ref: '#/components/schemas/EventRegisterInputRequest' security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/EventDetail' description: '' /api/v1/events/{id_or_slug}/registrations/: get: operationId: v1_events_registrations_list description: View registered participants for an event (organizer admin/editor or staff only). summary: List event attendees parameters: - in: path name: id_or_slug schema: type: string required: true - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: Number of results to return per page. schema: type: integer tags: - Events security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedEventRegistrationList' description: '' /api/v1/events/calendar/: get: operationId: v1_events_calendar_list description: Get streamlined event entries for calendar components filtered by month/year. summary: Calendar view feed parameters: - in: query name: category schema: type: string description: Category filter - in: query name: month schema: type: integer description: Calendar month (1-12) - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: Number of results to return per page. schema: type: integer - in: query name: year schema: type: integer description: Calendar year (e.g. 2026) tags: - Events security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedEventCalendarItemList' description: '' /api/v1/health/: get: operationId: v1_health_retrieve description: Returns system status, current timestamp, and API version summary: Check API server health status tags: - v1 security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/HealthCheckResponse' description: '' /api/v1/map/clusters/: get: operationId: v1_map_clusters_list description: Returns aggregated institution counts and density breakdown per country and region. summary: Regional density & geographic cluster overview parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: Number of results to return per page. schema: type: integer tags: - Smart Geo-Atlas security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedRegionalDensityList' description: '' /api/v1/map/institutions/: get: operationId: v1_map_institutions_list description: Returns geographic markers or aggregated clusters for institutions within the current map viewport. summary: Query map markers with bounding box & clustering parameters: - in: query name: city schema: type: string description: Filter by city - in: query name: cluster schema: type: boolean description: Whether to cluster nearby pins (default true) - in: query name: country schema: type: string description: Filter by country - in: query name: east schema: type: number format: double description: Easternmost longitude of viewport - in: query name: is_featured schema: type: boolean description: Filter by featured status - in: query name: north schema: type: number format: double description: Northernmost latitude of viewport - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: Number of results to return per page. schema: type: integer - in: query name: search schema: type: string description: Search text query - in: query name: south schema: type: number format: double description: Southernmost latitude of viewport - in: query name: tag schema: type: string description: Filter by tag string - in: query name: type schema: type: string description: Filter by institution type - in: query name: west schema: type: number format: double description: Westernmost longitude of viewport - in: query name: zoom schema: type: integer description: Current map zoom level (1 to 20, default 10) tags: - Smart Geo-Atlas security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedMapClusterItemList' description: '' /api/v1/map/stats/: get: operationId: v1_map_stats_retrieve description: Returns total institutions, countries covered, cities count, and classification distributions. summary: Get global atlas statistics tags: - Smart Geo-Atlas security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/MapStats' description: '' /api/v1/meetings/: get: operationId: v1_meetings_list description: List bilateral video meetings involving the authenticated user's affiliated institutions. summary: List scheduled & pending meetings parameters: - in: query name: end_date schema: type: string format: date description: Filter meetings to date (YYYY-MM-DD) - in: query name: institution_id schema: type: integer description: Filter meetings by participating institution ID - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: Number of results to return per page. schema: type: integer - in: query name: search schema: type: string description: Search in title or agenda - in: query name: start_date schema: type: string format: date description: Filter meetings from date (YYYY-MM-DD) - in: query name: status schema: type: string description: Meeting status (pending, scheduled, completed, cancelled, declined) tags: - Meetings security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedMeetingListList' description: '' post: operationId: v1_meetings_create description: Schedule/propose a bilateral meeting between institutions (requires institution admin/editor role). summary: Propose a new video meeting tags: - Meetings requestBody: content: application/json: schema: $ref: '#/components/schemas/MeetingCreateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/MeetingCreateRequest' multipart/form-data: schema: $ref: '#/components/schemas/MeetingCreateRequest' required: true security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '201': content: application/json: schema: $ref: '#/components/schemas/MeetingDetail' description: '' /api/v1/meetings/{id}/: get: operationId: v1_meetings_retrieve description: Get full meeting details including video link, agenda, and participants. summary: Retrieve meeting details parameters: - in: path name: id schema: type: integer required: true tags: - Meetings security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/MeetingDetail' description: '' put: operationId: v1_meetings_update parameters: - in: path name: id schema: type: integer required: true tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/MeetingUpdateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/MeetingUpdateRequest' multipart/form-data: schema: $ref: '#/components/schemas/MeetingUpdateRequest' required: true security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/MeetingUpdate' description: '' patch: operationId: v1_meetings_partial_update description: Accept, reschedule, decline, complete, or update meeting room URL and agenda notes. summary: Update or respond to meeting request parameters: - in: path name: id schema: type: integer required: true tags: - Meetings requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedMeetingUpdateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedMeetingUpdateRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedMeetingUpdateRequest' security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/MeetingDetail' description: '' delete: operationId: v1_meetings_destroy description: Cancel or delete a meeting request. summary: Cancel / delete meeting parameters: - in: path name: id schema: type: integer required: true tags: - Meetings security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '204': description: No response body /api/v1/profiles/: get: operationId: v1_profiles_list description: Returns a paginated list of mosques, cultural centers, and institutes with filtering. summary: List active institutions parameters: - in: query name: city schema: type: string description: Filter by city name - in: query name: country schema: type: string description: Filter by country name - in: query name: is_featured schema: type: boolean description: Filter by featured status - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: Number of results to return per page. schema: type: integer - in: query name: search schema: type: string description: Search query across name, city, country, description - in: query name: tag schema: type: string description: Filter by tag string - in: query name: type schema: type: string description: Filter by institution type (mosque, cultural_center, etc.) - in: query name: verification_status schema: type: string description: Filter by verification status (pending, approved, rejected) tags: - Institutions & Profiles security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedInstitutionListList' description: '' post: operationId: v1_profiles_create description: Registers a new institution profile and designates the creator as primary Administrator. summary: Register a new institution tags: - Institutions & Profiles requestBody: content: application/json: schema: $ref: '#/components/schemas/InstitutionCreateUpdateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/InstitutionCreateUpdateRequest' multipart/form-data: schema: $ref: '#/components/schemas/InstitutionCreateUpdateRequest' required: true security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '201': content: application/json: schema: $ref: '#/components/schemas/InstitutionDetail' description: '' '400': description: Validation error '401': description: Authentication required /api/v1/profiles/{pk_or_slug}/: get: operationId: v1_profiles_retrieve description: Retrieves complete institution information, historical timeline milestones, and media gallery. summary: Get full institution profile parameters: - in: path name: pk_or_slug schema: type: string required: true tags: - Institutions & Profiles security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/InstitutionDetail' description: '' '404': description: Institution not found patch: operationId: v1_profiles_partial_update description: Updates details of an institution. Requires Admin or Editor role on the institution. summary: Update institution profile parameters: - in: path name: pk_or_slug schema: type: string required: true tags: - Institutions & Profiles requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedInstitutionCreateUpdateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedInstitutionCreateUpdateRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedInstitutionCreateUpdateRequest' security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/InstitutionDetail' description: '' '403': description: Permission denied delete: operationId: v1_profiles_destroy description: Deactivates an institution. Permitted for institution administrator or platform administrator. summary: Deactivate / Delete institution parameters: - in: path name: pk_or_slug schema: type: string required: true tags: - Institutions & Profiles security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '204': description: Institution successfully deactivated '403': description: Permission denied /api/v1/profiles/{pk_or_slug}/follow/: post: operationId: v1_profiles_follow_create description: Follows the specified institution to receive updates and news. summary: Follow institution parameters: - in: path name: pk_or_slug schema: type: string required: true tags: - Institutions & Profiles requestBody: content: application/json: schema: $ref: '#/components/schemas/FollowResponseRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/FollowResponseRequest' multipart/form-data: schema: $ref: '#/components/schemas/FollowResponseRequest' required: true security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/FollowResponse' description: '' delete: operationId: v1_profiles_follow_destroy description: Unfollows the specified institution. summary: Unfollow institution parameters: - in: path name: pk_or_slug schema: type: string required: true tags: - Institutions & Profiles security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/FollowResponse' description: '' /api/v1/profiles/{pk_or_slug}/media/: get: operationId: v1_profiles_media_list description: Returns uploaded photos, videos, and documents for an institution. summary: List media gallery assets parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: Number of results to return per page. schema: type: integer - in: path name: pk_or_slug schema: type: string required: true tags: - Institutions & Profiles security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedInstitutionMediaList' description: '' post: operationId: v1_profiles_media_create description: Uploads a photo, video, or publication to the institution media gallery. summary: Upload media to gallery parameters: - in: path name: pk_or_slug schema: type: string required: true tags: - Institutions & Profiles requestBody: content: multipart/form-data: schema: $ref: '#/components/schemas/InstitutionMediaRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/InstitutionMediaRequest' application/json: schema: $ref: '#/components/schemas/InstitutionMediaRequest' required: true security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '201': content: application/json: schema: $ref: '#/components/schemas/InstitutionMedia' description: '' /api/v1/profiles/{pk_or_slug}/media/{media_id}/: delete: operationId: v1_profiles_media_destroy description: Removes an asset from the institution media gallery. summary: Delete media item parameters: - in: path name: media_id schema: type: integer required: true - in: path name: pk_or_slug schema: type: string required: true tags: - Institutions & Profiles security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '204': description: Media deleted /api/v1/profiles/{pk_or_slug}/members/: get: operationId: v1_profiles_members_list description: Retrieves administrative and editorial team members of the institution. summary: List institution team members parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: Number of results to return per page. schema: type: integer - in: path name: pk_or_slug schema: type: string required: true tags: - Institutions & Profiles security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedInstitutionMemberList' description: '' post: operationId: v1_profiles_members_create description: Adds or updates a member role (admin, editor, viewer) for an existing registered user by email. summary: Delegate role / Add team member parameters: - in: path name: pk_or_slug schema: type: string required: true tags: - Institutions & Profiles requestBody: content: application/json: schema: $ref: '#/components/schemas/InstitutionMemberAddRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/InstitutionMemberAddRequest' multipart/form-data: schema: $ref: '#/components/schemas/InstitutionMemberAddRequest' required: true security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '201': content: application/json: schema: $ref: '#/components/schemas/InstitutionMember' description: '' '400': description: User not found or invalid payload '403': description: Only institution administrators can delegate roles /api/v1/profiles/{pk_or_slug}/members/{member_id}/: delete: operationId: v1_profiles_members_destroy description: Revokes institution membership and delegated role for a user. summary: Remove team member parameters: - in: path name: member_id schema: type: integer required: true - in: path name: pk_or_slug schema: type: string required: true tags: - Institutions & Profiles security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '204': description: Member removed /api/v1/profiles/{pk_or_slug}/timeline/: get: operationId: v1_profiles_timeline_list description: Returns historical milestone entries for an institution. summary: List timeline milestones parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: Number of results to return per page. schema: type: integer - in: path name: pk_or_slug schema: type: string required: true tags: - Institutions & Profiles security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedInstitutionTimelineList' description: '' post: operationId: v1_profiles_timeline_create description: Creates a new milestone in the institution historical timeline. summary: Add timeline milestone parameters: - in: path name: pk_or_slug schema: type: string required: true tags: - Institutions & Profiles requestBody: content: application/json: schema: $ref: '#/components/schemas/InstitutionTimelineRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/InstitutionTimelineRequest' multipart/form-data: schema: $ref: '#/components/schemas/InstitutionTimelineRequest' required: true security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '201': content: application/json: schema: $ref: '#/components/schemas/InstitutionTimeline' description: '' /api/v1/profiles/{pk_or_slug}/timeline/{entry_id}/: delete: operationId: v1_profiles_timeline_destroy description: Removes a timeline entry from the institution profile. summary: Delete timeline milestone parameters: - in: path name: entry_id schema: type: integer required: true - in: path name: pk_or_slug schema: type: string required: true tags: - Institutions & Profiles security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '204': description: Entry deleted /api/v1/projects/: get: operationId: v1_projects_list description: Returns a paginated list of collaborative projects with filtering by institution, category, and status. summary: List collaborative projects parameters: - in: query name: category schema: type: string description: Filter by category name - in: query name: institution_id schema: type: integer description: Filter by owner or collaborating institution ID - in: query name: owner_institution_id schema: type: integer description: Filter specifically by owner institution ID - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: Number of results to return per page. schema: type: integer - in: query name: search schema: type: string description: Search query across title and description - in: query name: status schema: type: string description: Filter by project status (active, completed, on_hold, planning) tags: - Collaborative Projects & Kanban security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedProjectListList' description: '' post: operationId: v1_projects_create description: Creates a new multi-institution collaborative project with default Kanban columns. summary: Create collaborative project tags: - Collaborative Projects & Kanban requestBody: content: application/json: schema: $ref: '#/components/schemas/ProjectCreateUpdateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/ProjectCreateUpdateRequest' multipart/form-data: schema: $ref: '#/components/schemas/ProjectCreateUpdateRequest' required: true security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '201': content: application/json: schema: $ref: '#/components/schemas/ProjectDetail' description: '' '400': description: Validation error '401': description: Authentication required /api/v1/projects/{pk_or_slug}/: get: operationId: v1_projects_retrieve description: Retrieves full project details, collaborating institutions, and Kanban boards. summary: Get project details parameters: - in: path name: pk_or_slug schema: type: string required: true tags: - Collaborative Projects & Kanban security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/ProjectDetail' description: '' '404': description: Project not found patch: operationId: v1_projects_partial_update description: Updates project status, progress percentage, or details. Permitted for owner and collaborating editors. summary: Update project parameters: - in: path name: pk_or_slug schema: type: string required: true tags: - Collaborative Projects & Kanban requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedProjectCreateUpdateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedProjectCreateUpdateRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedProjectCreateUpdateRequest' security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/ProjectDetail' description: '' '403': description: Permission denied delete: operationId: v1_projects_destroy description: Removes a collaborative project and associated Kanban boards. summary: Delete project parameters: - in: path name: pk_or_slug schema: type: string required: true tags: - Collaborative Projects & Kanban security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '204': description: Project deleted successfully '403': description: Permission denied /api/v1/projects/{pk_or_slug}/documents/: get: operationId: v1_projects_documents_list description: Returns uploaded agreements, contracts, and progress reports for a project. summary: List project documents & MOUs parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: Number of results to return per page. schema: type: integer - in: path name: pk_or_slug schema: type: string required: true tags: - Collaborative Projects & Kanban security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedProjectDocumentList' description: '' post: operationId: v1_projects_documents_create description: Uploads an agreement, contract, or milestone report. summary: Upload project document parameters: - in: path name: pk_or_slug schema: type: string required: true tags: - Collaborative Projects & Kanban requestBody: content: multipart/form-data: schema: $ref: '#/components/schemas/ProjectDocumentRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/ProjectDocumentRequest' application/json: schema: $ref: '#/components/schemas/ProjectDocumentRequest' required: true security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '201': content: application/json: schema: $ref: '#/components/schemas/ProjectDocument' description: '' '400': description: Validation error '403': description: Permission denied /api/v1/projects/{pk_or_slug}/documents/{doc_id}/: delete: operationId: v1_projects_documents_destroy description: Removes a document attachment from the project. summary: Delete project document parameters: - in: path name: doc_id schema: type: integer required: true - in: path name: pk_or_slug schema: type: string required: true tags: - Collaborative Projects & Kanban security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '204': description: Document removed successfully '403': description: Permission denied /api/v1/projects/{pk_or_slug}/kanban/: get: operationId: v1_projects_kanban_list description: Returns hierarchical Kanban columns with nested task lists for drag-and-drop board interfaces. summary: Get project Kanban board hierarchy parameters: - name: page required: false in: query description: A page number within the paginated result set. schema: type: integer - name: page_size required: false in: query description: Number of results to return per page. schema: type: integer - in: path name: pk_or_slug schema: type: string required: true tags: - Collaborative Projects & Kanban security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/PaginatedKanbanColumnList' description: '' /api/v1/projects/{pk_or_slug}/tasks/: post: operationId: v1_projects_tasks_create description: Adds a new task under a specific column of the project. summary: Create Kanban task parameters: - in: path name: pk_or_slug schema: type: string required: true tags: - Collaborative Projects & Kanban requestBody: content: application/json: schema: $ref: '#/components/schemas/KanbanTaskCreateUpdateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/KanbanTaskCreateUpdateRequest' multipart/form-data: schema: $ref: '#/components/schemas/KanbanTaskCreateUpdateRequest' required: true security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '201': content: application/json: schema: $ref: '#/components/schemas/KanbanTask' description: '' '400': description: Validation error '403': description: Permission denied /api/v1/projects/{pk_or_slug}/tasks/{task_id}/: patch: operationId: v1_projects_tasks_partial_update description: Updates task attributes, priority, assignee, or moves task to another column / reorders within column. summary: Update or move Kanban task parameters: - in: path name: pk_or_slug schema: type: string required: true - in: path name: task_id schema: type: integer required: true tags: - Collaborative Projects & Kanban requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedKanbanTaskCreateUpdateRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedKanbanTaskCreateUpdateRequest' multipart/form-data: schema: $ref: '#/components/schemas/PatchedKanbanTaskCreateUpdateRequest' security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/KanbanTask' description: '' '400': description: Validation error '403': description: Permission denied delete: operationId: v1_projects_tasks_destroy description: Removes a task from the project Kanban board. summary: Delete Kanban task parameters: - in: path name: pk_or_slug schema: type: string required: true - in: path name: task_id schema: type: integer required: true tags: - Collaborative Projects & Kanban security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] responses: '204': description: Task deleted successfully '403': description: Permission denied /api/v1/settings/about-us/: get: operationId: v1_settings_about_us_retrieve tags: - v1 security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/AboutUs' description: '' put: operationId: v1_settings_about_us_update tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/AboutUsRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/AboutUsRequest' multipart/form-data: schema: $ref: '#/components/schemas/AboutUsRequest' security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/AboutUs' description: '' /api/v1/settings/about-us-dobodi/: get: operationId: v1_settings_about_us_dobodi_retrieve tags: - v1 security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/AboutUsDobodi' description: '' put: operationId: v1_settings_about_us_dobodi_update tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/AboutUsDobodiRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/AboutUsDobodiRequest' multipart/form-data: schema: $ref: '#/components/schemas/AboutUsDobodiRequest' security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/AboutUsDobodi' description: '' /api/v1/settings/card/: get: operationId: v1_settings_card_retrieve tags: - v1 security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/Card' description: '' put: operationId: v1_settings_card_update tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/CardRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/CardRequest' multipart/form-data: schema: $ref: '#/components/schemas/CardRequest' security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/Card' description: '' /api/v1/settings/faq-course/: get: operationId: v1_settings_faq_course_retrieve tags: - v1 security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/FAQItem' description: '' /api/v1/settings/faq-general/: get: operationId: v1_settings_faq_general_retrieve tags: - v1 security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/FAQItem' description: '' put: operationId: v1_settings_faq_general_update tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/FAQItemRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/FAQItemRequest' multipart/form-data: schema: $ref: '#/components/schemas/FAQItemRequest' security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/FAQItem' description: '' /api/v1/settings/support/: get: operationId: v1_settings_support_retrieve tags: - v1 security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/Support' description: '' put: operationId: v1_settings_support_update tags: - v1 requestBody: content: application/json: schema: $ref: '#/components/schemas/SupportRequest' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/SupportRequest' multipart/form-data: schema: $ref: '#/components/schemas/SupportRequest' security: - tokenAuth: [] - jwtAuth: [] responses: '200': content: application/json: schema: $ref: '#/components/schemas/Support' description: '' /api/v1/version/: get: operationId: v1_version_retrieve description: Returns latest active mobile/web application version details summary: Get active application version tags: - v1 security: - jwtAuth: [] - tokenAuth: [] - cookieAuth: [] - jwtAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/AppVersion' description: '' '404': description: No active version found components: schemas: AboutUs: type: object properties: content: type: string default: '' AboutUsDobodi: type: object properties: arabic_text: type: string default: '' translated_text: type: string default: '' title: type: string default: '' content: type: string default: '' AboutUsDobodiRequest: type: object properties: arabic_text: type: string default: '' translated_text: type: string default: '' title: type: string default: '' content: type: string default: '' AboutUsRequest: type: object properties: content: type: string default: '' AdminNotification: type: object properties: id: type: integer readOnly: true title: type: string maxLength: 255 message: type: string maxLength: 1024 is_read: type: boolean notification_type: type: string nullable: true maxLength: 50 action: type: string maxLength: 50 navigate_to: type: string nullable: true maxLength: 255 created_at: type: string format: date-time readOnly: true updated_at: type: string format: date-time readOnly: true user_fullname: type: string readOnly: true user_email: type: string readOnly: true user_id: type: integer readOnly: true required: - created_at - id - message - title - updated_at - user_email - user_fullname - user_id AdminNotificationRequest: type: object properties: title: type: string minLength: 1 maxLength: 255 message: type: string minLength: 1 maxLength: 1024 is_read: type: boolean notification_type: type: string nullable: true maxLength: 50 action: type: string minLength: 1 maxLength: 50 navigate_to: type: string nullable: true maxLength: 255 required: - message - title AdminUser: type: object properties: id: type: integer readOnly: true fullname: type: string nullable: true title: Full Name description: Full name of the user. maxLength: 255 email: type: string format: email phone_number: type: string nullable: true description: e.g., +1 555 1234567 maxLength: 128 avatar: type: string nullable: true gender: nullable: true oneOf: - $ref: '#/components/schemas/GenderEnum' - $ref: '#/components/schemas/BlankEnum' - $ref: '#/components/schemas/NullEnum' birthdate: type: string format: date nullable: true info: type: string nullable: true title: Bio / Info skill: type: string nullable: true title: Skill / Role maxLength: 512 city: type: string nullable: true maxLength: 255 country: type: string nullable: true maxLength: 255 device_id: type: string readOnly: true device_os: type: string readOnly: true user_agent: type: string readOnly: true client_ip: type: string readOnly: true fcm: type: string nullable: true title: FCM Token maxLength: 512 user_type: $ref: '#/components/schemas/UserTypeEnum' is_active: type: boolean title: Active description: Designates whether this user should be treated as active. is_staff: type: boolean is_superuser: type: boolean title: Superuser status description: Designates that this user has all permissions without explicitly assigning them. date_joined: type: string format: date-time readOnly: true last_login: type: string format: date-time readOnly: true nullable: true auth_token: type: string readOnly: true plain_password: type: string readOnly: true required: - auth_token - client_ip - date_joined - device_id - device_os - email - id - last_login - plain_password - user_agent AdminUserRequest: type: object properties: fullname: type: string nullable: true title: Full Name description: Full name of the user. maxLength: 255 email: type: string format: email minLength: 1 phone_number: type: string nullable: true description: e.g., +1 555 1234567 maxLength: 128 password: type: string writeOnly: true minLength: 1 avatar: type: string nullable: true minLength: 1 gender: nullable: true oneOf: - $ref: '#/components/schemas/GenderEnum' - $ref: '#/components/schemas/BlankEnum' - $ref: '#/components/schemas/NullEnum' birthdate: type: string format: date nullable: true info: type: string nullable: true title: Bio / Info skill: type: string nullable: true title: Skill / Role maxLength: 512 city: type: string nullable: true maxLength: 255 country: type: string nullable: true maxLength: 255 fcm: type: string nullable: true title: FCM Token maxLength: 512 user_type: $ref: '#/components/schemas/UserTypeEnum' is_active: type: boolean title: Active description: Designates whether this user should be treated as active. is_staff: type: boolean is_superuser: type: boolean title: Superuser status description: Designates that this user has all permissions without explicitly assigning them. required: - email AppTypeEnum: enum: - google_play - app_store - direct type: string description: |- * `google_play` - Google Play * `app_store` - Apple App Store * `direct` - Direct Download AppVersion: type: object properties: id: type: integer readOnly: true version: type: string description: Application version in format X.Y.Z (e.g., 1.0.0) pattern: ^\d+\.\d+\.\d+$ maxLength: 20 apk_file: type: string format: uri nullable: true readOnly: true description: type: string description: Release notes and changes for this version app_type: allOf: - $ref: '#/components/schemas/AppTypeEnum' title: App Distribution Platform downloads_count: type: integer is_active: type: boolean title: Active description: Is this version currently active? created_at: type: string format: date-time readOnly: true updated_at: type: string format: date-time readOnly: true required: - apk_file - created_at - id - updated_at - version BlankEnum: enum: - '' CMSCommentStatusEnum: enum: - pending - approved - spam type: string description: |- * `pending` - Pending Moderation * `approved` - Approved * `spam` - Spam / Rejected CMSPostLanguageEnum: enum: - fa - ar - en - ur - fr type: string description: |- * `fa` - Persian * `ar` - Arabic * `en` - English * `ur` - Urdu * `fr` - French CMSPostStatusEnum: enum: - draft - review - published - archived type: string description: |- * `draft` - Draft * `review` - Under Review * `published` - Published * `archived` - Archived Card: type: object properties: card_number: type: string default: '' card_name: type: string default: '' whatsapp_number: type: string default: '' CardRequest: type: object properties: card_number: type: string default: '' card_name: type: string default: '' whatsapp_number: type: string default: '' CategoryEnum: enum: - religious - educational - cultural - counseling - conference - workshop type: string description: |- * `religious` - Religious * `educational` - Educational * `cultural` - Cultural * `counseling` - Counseling * `conference` - Conference * `workshop` - Workshop CentrifugoTokenResponse: type: object properties: token: type: string description: Signed HMAC-SHA256 JWT for Centrifugo WebSocket connection ws_url: type: string description: WebSocket endpoint URL for frontend client user_id: type: integer description: Authenticated user ID expires_in: type: integer description: Token lifetime in seconds required: - expires_in - token - user_id - ws_url ChatInstitutionMini: type: object properties: id: type: integer readOnly: true name: type: string readOnly: true title: Institution Name description: Official name of the mosque, center, or institute. slug: type: string readOnly: true nullable: true title: Slug / URL Identifier pattern: ^[-\w]+$ type: allOf: - $ref: '#/components/schemas/TypeEnum' readOnly: true title: Institution Type type_display: type: string readOnly: true avatar: type: string format: uri nullable: true readOnly: true title: Logo / Avatar city: type: string readOnly: true country: type: string readOnly: true required: - avatar - city - country - id - name - slug - type - type_display ChatMessage: type: object properties: id: type: integer readOnly: true room: type: integer readOnly: true title: Chat Room sender: allOf: - $ref: '#/components/schemas/ChatUserMini' readOnly: true sender_institution: allOf: - $ref: '#/components/schemas/ChatInstitutionMini' readOnly: true content: type: string readOnly: true nullable: true title: Message Text attachment: type: string format: uri nullable: true readOnly: true title: Attachment File attachment_name: type: string readOnly: true nullable: true title: Attachment Filename is_read_by_me: type: boolean readOnly: true read_by_count: type: integer readOnly: true created_at: type: string format: date-time readOnly: true title: Timestamp required: - attachment - attachment_name - content - created_at - id - is_read_by_me - read_by_count - room - sender - sender_institution ChatMessageCreateRequest: type: object properties: content: type: string attachment: type: string format: binary nullable: true sender_institution_id: type: integer nullable: true ChatRoomCreateRequest: type: object properties: room_type: allOf: - $ref: '#/components/schemas/RoomTypeEnum' default: direct title: type: string maxLength: 255 target_user_id: type: integer nullable: true target_institution_id: type: integer nullable: true participant_user_ids: type: array items: type: integer participant_institution_ids: type: array items: type: integer initial_message: type: string ChatRoomDetail: type: object properties: id: type: integer readOnly: true room_type: allOf: - $ref: '#/components/schemas/RoomTypeEnum' readOnly: true title: type: string readOnly: true nullable: true title: Conversation Title display_title: type: string readOnly: true participant_users: type: array items: $ref: '#/components/schemas/ChatUserMini' readOnly: true participant_institutions: type: array items: $ref: '#/components/schemas/ChatInstitutionMini' readOnly: true unread_count: type: integer readOnly: true centrifugo_channel: type: string readOnly: true created_at: type: string format: date-time readOnly: true updated_at: type: string format: date-time readOnly: true title: Last Activity required: - centrifugo_channel - created_at - display_title - id - participant_institutions - participant_users - room_type - title - unread_count - updated_at ChatRoomList: type: object properties: id: type: integer readOnly: true room_type: allOf: - $ref: '#/components/schemas/RoomTypeEnum' readOnly: true title: type: string readOnly: true nullable: true title: Conversation Title display_title: type: string readOnly: true participant_users: type: array items: $ref: '#/components/schemas/ChatUserMini' readOnly: true participant_institutions: type: array items: $ref: '#/components/schemas/ChatInstitutionMini' readOnly: true last_message: allOf: - $ref: '#/components/schemas/ChatMessage' nullable: true readOnly: true unread_count: type: integer readOnly: true centrifugo_channel: type: string readOnly: true updated_at: type: string format: date-time readOnly: true title: Last Activity required: - centrifugo_channel - display_title - id - last_message - participant_institutions - participant_users - room_type - title - unread_count - updated_at ChatUserMini: type: object properties: id: type: integer readOnly: true email: type: string format: email readOnly: true nullable: true title: Email Address description: User primary email address. fullname: type: string readOnly: true nullable: true title: Full Name description: Full name of the user. avatar: type: string format: uri nullable: true readOnly: true user_type: allOf: - $ref: '#/components/schemas/UserTypeEnum' readOnly: true required: - avatar - email - fullname - id - user_type DeviceOsEnum: enum: - android - apple - web type: string description: |- * `android` - Android * `apple` - Apple iOS * `web` - Web DocTypeEnum: enum: - mou - report - contract - other type: string description: |- * `mou` - MOU / Bilateral Agreement * `report` - Progress / Milestone Report * `contract` - Contract / Agreement * `other` - Other Document DocumentTypeEnum: enum: - national_id - institution_license - recommendation_letter - student_card - other type: string description: |- * `national_id` - National ID / Passport * `institution_license` - Institution Registration / License * `recommendation_letter` - Recommendation Letter * `student_card` - Student / Member Card * `other` - Other Document EventCalendarItem: type: object properties: id: type: integer readOnly: true title: type: string title: Event Title maxLength: 255 slug: oneOf: - type: string maxLength: 280 pattern: ^[-a-zA-Z0-9_]+$ - type: string maxLength: 0 category: $ref: '#/components/schemas/CategoryEnum' event_date: type: string format: date start_time: type: string format: time end_time: type: string format: time nullable: true location_type: $ref: '#/components/schemas/LocationTypeEnum' organizer_name: type: string readOnly: true is_featured: type: boolean required: - event_date - id - organizer_name - start_time - title EventCreateUpdate: type: object properties: id: type: integer readOnly: true title: type: string title: Event Title maxLength: 255 description: type: string title: Event Description category: $ref: '#/components/schemas/CategoryEnum' event_date: type: string format: date start_time: type: string format: time end_time: type: string format: time nullable: true speaker_name: type: string maxLength: 255 speaker_title: type: string title: Speaker Title / Affiliation maxLength: 255 speaker_avatar: type: string format: uri nullable: true location_type: $ref: '#/components/schemas/LocationTypeEnum' venue_address: type: string maxLength: 500 online_meeting_url: title: Online Meeting Link oneOf: - type: string format: uri maxLength: 200 - type: string maxLength: 0 cover_image: type: string format: uri nullable: true capacity: type: integer title: Capacity Limit is_active: type: boolean is_featured: type: boolean language: $ref: '#/components/schemas/CMSPostLanguageEnum' tags: {} required: - description - event_date - id - start_time - title EventCreateUpdateRequest: type: object properties: title: type: string minLength: 1 title: Event Title maxLength: 255 description: type: string minLength: 1 title: Event Description organizer_id: type: integer writeOnly: true category: $ref: '#/components/schemas/CategoryEnum' event_date: type: string format: date start_time: type: string format: time end_time: type: string format: time nullable: true speaker_name: type: string maxLength: 255 speaker_title: type: string title: Speaker Title / Affiliation maxLength: 255 speaker_avatar: type: string format: binary nullable: true location_type: $ref: '#/components/schemas/LocationTypeEnum' venue_address: type: string maxLength: 500 online_meeting_url: title: Online Meeting Link oneOf: - type: string format: uri maxLength: 200 - type: string maxLength: 0 cover_image: type: string format: binary nullable: true capacity: type: integer title: Capacity Limit is_active: type: boolean is_featured: type: boolean language: $ref: '#/components/schemas/CMSPostLanguageEnum' tags: {} required: - description - event_date - organizer_id - start_time - title EventDetail: type: object properties: id: type: integer readOnly: true title: type: string title: Event Title maxLength: 255 slug: oneOf: - type: string maxLength: 280 pattern: ^[-a-zA-Z0-9_]+$ - type: string maxLength: 0 description: type: string title: Event Description category: $ref: '#/components/schemas/CategoryEnum' event_date: type: string format: date start_time: type: string format: time end_time: type: string format: time nullable: true speaker_name: type: string maxLength: 255 speaker_title: type: string title: Speaker Title / Affiliation maxLength: 255 speaker_avatar: type: string format: uri nullable: true location_type: $ref: '#/components/schemas/LocationTypeEnum' venue_address: type: string maxLength: 500 online_meeting_url: title: Online Meeting Link oneOf: - type: string format: uri maxLength: 200 - type: string maxLength: 0 cover_image: type: string format: uri nullable: true capacity: type: integer title: Capacity Limit registration_count: type: integer title: Current Registrations is_active: type: boolean is_featured: type: boolean language: $ref: '#/components/schemas/CMSPostLanguageEnum' tags: {} organizer: allOf: - $ref: '#/components/schemas/EventOrganizerMinimal' readOnly: true is_registered: type: boolean readOnly: true my_registration: type: object additionalProperties: {} nullable: true readOnly: true created_at: type: string format: date-time readOnly: true updated_at: type: string format: date-time readOnly: true required: - created_at - description - event_date - id - is_registered - my_registration - organizer - start_time - title - updated_at EventList: type: object properties: id: type: integer readOnly: true title: type: string title: Event Title maxLength: 255 slug: oneOf: - type: string maxLength: 280 pattern: ^[-a-zA-Z0-9_]+$ - type: string maxLength: 0 category: $ref: '#/components/schemas/CategoryEnum' event_date: type: string format: date start_time: type: string format: time end_time: type: string format: time nullable: true speaker_name: type: string maxLength: 255 speaker_title: type: string title: Speaker Title / Affiliation maxLength: 255 speaker_avatar: type: string format: uri nullable: true location_type: $ref: '#/components/schemas/LocationTypeEnum' venue_address: type: string maxLength: 500 cover_image: type: string format: uri nullable: true capacity: type: integer title: Capacity Limit registration_count: type: integer title: Current Registrations is_active: type: boolean is_featured: type: boolean language: $ref: '#/components/schemas/CMSPostLanguageEnum' tags: {} organizer: allOf: - $ref: '#/components/schemas/EventOrganizerMinimal' readOnly: true created_at: type: string format: date-time readOnly: true required: - created_at - event_date - id - organizer - start_time - title EventOrganizerMinimal: type: object properties: id: type: integer readOnly: true name: type: string title: Institution Name description: Official name of the mosque, center, or institute. maxLength: 255 slug: nullable: true title: Slug / URL Identifier oneOf: - type: string pattern: ^[-\w]+$ maxLength: 255 - type: string maxLength: 0 type: allOf: - $ref: '#/components/schemas/TypeEnum' title: Institution Type city: type: string maxLength: 255 country: type: string maxLength: 255 avatar: type: string format: uri nullable: true title: Logo / Avatar verification_status: $ref: '#/components/schemas/VerificationStatusEnum' required: - city - country - id - name EventParticipantUser: type: object properties: id: type: integer readOnly: true email: nullable: true title: Email Address description: User primary email address. oneOf: - type: string format: email maxLength: 254 - type: string maxLength: 0 fullname: type: string nullable: true title: Full Name description: Full name of the user. maxLength: 255 avatar: type: string format: uri nullable: true required: - id EventRegisterInputRequest: type: object properties: notes: type: string default: '' EventRegistration: type: object properties: id: type: integer readOnly: true event: type: integer readOnly: true user: allOf: - $ref: '#/components/schemas/EventParticipantUser' readOnly: true status: $ref: '#/components/schemas/EventRegistrationStatusEnum' notes: type: string title: Participant Notes registered_at: type: string format: date-time readOnly: true required: - event - id - registered_at - user EventRegistrationStatusEnum: enum: - registered - attended - cancelled type: string description: |- * `registered` - Registered * `attended` - Attended * `cancelled` - Cancelled ExchangeToken: type: object properties: temp_token: type: string maxLength: 128 required: - temp_token ExchangeTokenRequest: type: object properties: temp_token: type: string minLength: 1 maxLength: 128 required: - temp_token FAQItem: type: object properties: question: type: string default: '' answer: type: string default: '' FAQItemRequest: type: object properties: question: type: string default: '' answer: type: string default: '' FollowResponse: type: object properties: is_following: type: boolean follower_count: type: integer message: type: string required: - follower_count - is_following - message FollowResponseRequest: type: object properties: is_following: type: boolean follower_count: type: integer message: type: string minLength: 1 required: - follower_count - is_following - message GenderEnum: enum: - male - female - other type: string description: |- * `male` - Male * `female` - Female * `other` - Other HealthCheckResponse: type: object properties: status: type: string default: healthy timestamp: type: string format: date-time version: type: string default: 1.0.0 required: - timestamp InstitutionCreateUpdateRequest: type: object properties: name: type: string minLength: 1 title: Institution Name description: Official name of the mosque, center, or institute. maxLength: 255 type: allOf: - $ref: '#/components/schemas/TypeEnum' title: Institution Type country: type: string minLength: 1 maxLength: 255 city: type: string minLength: 1 maxLength: 255 address: type: string nullable: true title: Full Address latitude: type: number format: double nullable: true longitude: type: number format: double nullable: true description: type: string nullable: true title: Description & Background website: nullable: true oneOf: - type: string format: uri maxLength: 500 - type: string maxLength: 0 email: nullable: true title: Official Email oneOf: - type: string format: email maxLength: 254 - type: string maxLength: 0 phone: type: string nullable: true title: Official Phone maxLength: 50 established_year: type: integer nullable: true title: Established Year (CE) cover_image: type: string format: binary nullable: true avatar: type: string format: binary nullable: true title: Logo / Avatar social_media: title: Social Media Links description: 'Dictionary with keys: facebook, twitter, instagram, linkedin, youtube, telegram' working_hours: title: Working Hours / Prayer Times Schedule tags: title: Tags & Specializations is_featured: type: boolean required: - city - country - name InstitutionDetail: type: object properties: id: type: integer readOnly: true name: type: string title: Institution Name description: Official name of the mosque, center, or institute. maxLength: 255 slug: type: string readOnly: true nullable: true title: Slug / URL Identifier pattern: ^[-\w]+$ type: allOf: - $ref: '#/components/schemas/TypeEnum' title: Institution Type type_display: type: string readOnly: true country: type: string maxLength: 255 city: type: string maxLength: 255 address: type: string nullable: true title: Full Address latitude: type: number format: double nullable: true longitude: type: number format: double nullable: true description: type: string nullable: true title: Description & Background website: nullable: true oneOf: - type: string format: uri maxLength: 500 - type: string maxLength: 0 email: nullable: true title: Official Email oneOf: - type: string format: email maxLength: 254 - type: string maxLength: 0 phone: type: string nullable: true title: Official Phone maxLength: 50 established_year: type: integer nullable: true title: Established Year (CE) cover_image: type: string format: uri nullable: true avatar: type: string format: uri nullable: true title: Logo / Avatar social_media: title: Social Media Links description: 'Dictionary with keys: facebook, twitter, instagram, linkedin, youtube, telegram' working_hours: title: Working Hours / Prayer Times Schedule tags: title: Tags & Specializations verification_status: allOf: - $ref: '#/components/schemas/VerificationStatusEnum' readOnly: true verification_status_display: type: string readOnly: true follower_count: type: integer readOnly: true title: Followers Count is_featured: type: boolean readOnly: true is_active: type: boolean readOnly: true created_by_email: type: string format: email readOnly: true nullable: true members_count: type: integer readOnly: true is_following: type: boolean readOnly: true user_role: type: string nullable: true readOnly: true timeline_entries: type: array items: $ref: '#/components/schemas/InstitutionTimeline' readOnly: true media_items: type: array items: $ref: '#/components/schemas/InstitutionMedia' readOnly: true created_at: type: string format: date-time readOnly: true updated_at: type: string format: date-time readOnly: true required: - city - country - created_at - created_by_email - follower_count - id - is_active - is_featured - is_following - media_items - members_count - name - slug - timeline_entries - type_display - updated_at - user_role - verification_status - verification_status_display InstitutionList: type: object properties: id: type: integer readOnly: true name: type: string readOnly: true title: Institution Name description: Official name of the mosque, center, or institute. slug: type: string readOnly: true nullable: true title: Slug / URL Identifier pattern: ^[-\w]+$ type: allOf: - $ref: '#/components/schemas/TypeEnum' readOnly: true title: Institution Type type_display: type: string readOnly: true country: type: string readOnly: true city: type: string readOnly: true address: type: string readOnly: true nullable: true title: Full Address latitude: type: number format: double readOnly: true nullable: true longitude: type: number format: double readOnly: true nullable: true avatar: type: string format: uri nullable: true readOnly: true title: Logo / Avatar cover_image: type: string format: uri nullable: true readOnly: true verification_status: allOf: - $ref: '#/components/schemas/VerificationStatusEnum' readOnly: true verification_status_display: type: string readOnly: true follower_count: type: integer readOnly: true title: Followers Count is_featured: type: boolean readOnly: true tags: readOnly: true title: Tags & Specializations is_following: type: boolean readOnly: true created_at: type: string format: date-time readOnly: true required: - address - avatar - city - country - cover_image - created_at - follower_count - id - is_featured - is_following - latitude - longitude - name - slug - tags - type - type_display - verification_status - verification_status_display InstitutionMedia: type: object properties: id: type: integer readOnly: true institution: type: integer readOnly: true file: type: string format: uri title: Media File media_type: $ref: '#/components/schemas/InstitutionMediaMediaTypeEnum' media_type_display: type: string readOnly: true title: type: string nullable: true title: Media Title maxLength: 255 caption: type: string nullable: true title: Caption / Notes uploaded_at: type: string format: date-time readOnly: true required: - file - id - institution - media_type_display - uploaded_at InstitutionMediaMediaTypeEnum: enum: - image - video - document type: string description: |- * `image` - Image * `video` - Video * `document` - Document / Publication InstitutionMediaRequest: type: object properties: file: type: string format: binary title: Media File media_type: $ref: '#/components/schemas/InstitutionMediaMediaTypeEnum' title: type: string nullable: true title: Media Title maxLength: 255 caption: type: string nullable: true title: Caption / Notes required: - file InstitutionMeetingMinimal: type: object properties: id: type: integer readOnly: true name: type: string title: Institution Name description: Official name of the mosque, center, or institute. maxLength: 255 slug: nullable: true title: Slug / URL Identifier oneOf: - type: string pattern: ^[-\w]+$ maxLength: 255 - type: string maxLength: 0 type: allOf: - $ref: '#/components/schemas/TypeEnum' title: Institution Type avatar: type: string format: uri nullable: true title: Logo / Avatar city: type: string maxLength: 255 country: type: string maxLength: 255 required: - city - country - id - name InstitutionMember: type: object properties: id: type: integer readOnly: true institution: type: integer readOnly: true user: allOf: - $ref: '#/components/schemas/MemberUserMini' readOnly: true role: $ref: '#/components/schemas/RoleEnum' role_display: type: string readOnly: true title: type: string nullable: true title: Organizational Title description: e.g., Director, Media Manager, Cultural Affairs Officer maxLength: 150 joined_at: type: string format: date-time readOnly: true required: - id - institution - joined_at - role_display - user InstitutionMemberAddRequest: type: object properties: email: type: string format: email minLength: 1 role: allOf: - $ref: '#/components/schemas/RoleEnum' default: viewer title: type: string maxLength: 150 required: - email InstitutionTimeline: type: object properties: id: type: integer readOnly: true institution: type: integer readOnly: true year: type: string title: Year / Period description: e.g. 1995, 1416 AH, or 2020-Present maxLength: 50 title: type: string title: Milestone Title maxLength: 255 description: type: string nullable: true title: Milestone Description order: type: integer title: Display Order created_at: type: string format: date-time readOnly: true required: - created_at - id - institution - title - year InstitutionTimelineRequest: type: object properties: year: type: string minLength: 1 title: Year / Period description: e.g. 1995, 1416 AH, or 2020-Present maxLength: 50 title: type: string minLength: 1 title: Milestone Title maxLength: 255 description: type: string nullable: true title: Milestone Description order: type: integer title: Display Order required: - title - year KanbanColumn: type: object properties: id: type: integer readOnly: true project: type: integer readOnly: true name: type: string title: Column Name maxLength: 100 code: type: string title: Column Code Identifier maxLength: 50 order: type: integer title: Display Order color: type: string nullable: true title: Badge / Header Color maxLength: 20 tasks: type: array items: $ref: '#/components/schemas/KanbanTask' readOnly: true required: - id - name - project - tasks KanbanTask: type: object properties: id: type: integer readOnly: true project: type: integer readOnly: true column: type: integer title: Kanban Column column_name: type: string readOnly: true column_code: type: string readOnly: true title: type: string title: Task Title maxLength: 255 description: type: string nullable: true title: Task Description priority: $ref: '#/components/schemas/PriorityEnum' priority_display: type: string readOnly: true assignee: allOf: - $ref: '#/components/schemas/ProjectUserMini' readOnly: true due_date: type: string format: date nullable: true labels: title: Task Labels order: type: integer title: Display Order within Column created_at: type: string format: date-time readOnly: true updated_at: type: string format: date-time readOnly: true required: - assignee - column - column_code - column_name - created_at - id - priority_display - project - title - updated_at KanbanTaskCreateUpdateRequest: type: object properties: column: type: integer title: Kanban Column title: type: string minLength: 1 title: Task Title maxLength: 255 description: type: string nullable: true title: Task Description priority: $ref: '#/components/schemas/PriorityEnum' assignee: type: integer nullable: true title: Assignee User due_date: type: string format: date nullable: true labels: title: Task Labels order: type: integer title: Display Order within Column required: - column - title LocationHistory: type: object properties: id: type: integer readOnly: true lat: type: number format: double nullable: true title: Latitude lon: type: number format: double nullable: true title: Longitude country: type: string nullable: true maxLength: 255 city: type: string nullable: true maxLength: 255 selected_manually: type: boolean ip: type: string nullable: true title: IP Address maxLength: 255 timezone: type: string nullable: true maxLength: 60 required: - id LocationHistoryRequest: type: object properties: lat: type: number format: double nullable: true title: Latitude lon: type: number format: double nullable: true title: Longitude country: type: string nullable: true maxLength: 255 city: type: string nullable: true maxLength: 255 selected_manually: type: boolean ip: type: string nullable: true title: IP Address maxLength: 255 timezone: type: string nullable: true maxLength: 60 LocationTypeEnum: enum: - in_person - online - hybrid type: string description: |- * `in_person` - In Person * `online` - Online * `hybrid` - Hybrid MapClusterItem: type: object properties: is_cluster: type: boolean id: type: integer nullable: true name: type: string nullable: true slug: type: string nullable: true type: type: string nullable: true type_display: type: string nullable: true city: type: string nullable: true country: type: string nullable: true avatar: type: string nullable: true cover_image: type: string nullable: true is_featured: type: boolean verification_status: type: string nullable: true follower_count: type: integer cluster_id: type: string count: type: integer lat: type: number format: double lng: type: number format: double type_breakdown: type: object additionalProperties: {} preview_institutions: type: array items: {} required: - is_cluster - lat - lng MapStats: type: object properties: total_institutions: type: integer total_countries: type: integer total_cities: type: integer type_distribution: type: object additionalProperties: {} verified_count: type: integer featured_count: type: integer required: - featured_count - total_cities - total_countries - total_institutions - type_distribution - verified_count MediaAsset: type: object properties: id: type: integer readOnly: true file: type: string format: uri title: Media File title: type: string nullable: true title: Title / Description maxLength: 255 media_type: $ref: '#/components/schemas/MediaAssetMediaTypeEnum' media_type_display: type: string readOnly: true file_size: type: integer readOnly: true title: File Size (Bytes) dimensions: type: string nullable: true title: Dimensions (WxH) maxLength: 50 uploaded_by_email: type: string format: email readOnly: true nullable: true created_at: type: string format: date-time readOnly: true required: - created_at - file - file_size - id - media_type_display - uploaded_by_email MediaAssetMediaTypeEnum: enum: - image - video - audio - document type: string description: |- * `image` - Image * `video` - Video * `audio` - Audio * `document` - Document / PDF MediaAssetRequest: type: object properties: file: type: string format: binary title: Media File title: type: string nullable: true title: Title / Description maxLength: 255 media_type: $ref: '#/components/schemas/MediaAssetMediaTypeEnum' dimensions: type: string nullable: true title: Dimensions (WxH) maxLength: 50 required: - file MeetingCreateRequest: type: object properties: title: type: string minLength: 1 title: Meeting Title / Subject maxLength: 255 requester_institution_id: type: integer writeOnly: true recipient_institution_id: type: integer writeOnly: true meeting_date: type: string format: date title: Proposed / Confirmed Date meeting_time: type: string format: time title: Proposed / Confirmed Time duration_minutes: type: integer title: Duration (Minutes) meeting_url: title: Video Meeting Link oneOf: - type: string format: uri maxLength: 500 - type: string maxLength: 0 agenda: type: string title: Meeting Agenda & Topics required: - meeting_date - meeting_time - recipient_institution_id - requester_institution_id - title MeetingDetail: type: object properties: id: type: integer readOnly: true title: type: string title: Meeting Title / Subject maxLength: 255 requester_institution: allOf: - $ref: '#/components/schemas/InstitutionMeetingMinimal' readOnly: true recipient_institution: allOf: - $ref: '#/components/schemas/InstitutionMeetingMinimal' readOnly: true created_by: allOf: - $ref: '#/components/schemas/MeetingUser' readOnly: true status: $ref: '#/components/schemas/MeetingStatusEnum' meeting_date: type: string format: date title: Proposed / Confirmed Date meeting_time: type: string format: time title: Proposed / Confirmed Time duration_minutes: type: integer title: Duration (Minutes) meeting_url: title: Video Meeting Link oneOf: - type: string format: uri maxLength: 500 - type: string maxLength: 0 agenda: type: string title: Meeting Agenda & Topics admin_notes: type: string title: Internal / Admin Notes created_at: type: string format: date-time readOnly: true updated_at: type: string format: date-time readOnly: true required: - created_at - created_by - id - meeting_date - meeting_time - recipient_institution - requester_institution - title - updated_at MeetingList: type: object properties: id: type: integer readOnly: true title: type: string title: Meeting Title / Subject maxLength: 255 requester_institution: allOf: - $ref: '#/components/schemas/InstitutionMeetingMinimal' readOnly: true recipient_institution: allOf: - $ref: '#/components/schemas/InstitutionMeetingMinimal' readOnly: true created_by: allOf: - $ref: '#/components/schemas/MeetingUser' readOnly: true status: $ref: '#/components/schemas/MeetingStatusEnum' meeting_date: type: string format: date title: Proposed / Confirmed Date meeting_time: type: string format: time title: Proposed / Confirmed Time duration_minutes: type: integer title: Duration (Minutes) meeting_url: title: Video Meeting Link oneOf: - type: string format: uri maxLength: 500 - type: string maxLength: 0 created_at: type: string format: date-time readOnly: true required: - created_at - created_by - id - meeting_date - meeting_time - recipient_institution - requester_institution - title MeetingStatusEnum: enum: - pending - scheduled - completed - cancelled - declined type: string description: |- * `pending` - Pending * `scheduled` - Scheduled * `completed` - Completed * `cancelled` - Cancelled * `declined` - Declined MeetingUpdate: type: object properties: status: $ref: '#/components/schemas/MeetingStatusEnum' meeting_date: type: string format: date title: Proposed / Confirmed Date meeting_time: type: string format: time title: Proposed / Confirmed Time duration_minutes: type: integer title: Duration (Minutes) meeting_url: title: Video Meeting Link oneOf: - type: string format: uri maxLength: 500 - type: string maxLength: 0 agenda: type: string title: Meeting Agenda & Topics admin_notes: type: string title: Internal / Admin Notes required: - meeting_date - meeting_time MeetingUpdateRequest: type: object properties: status: $ref: '#/components/schemas/MeetingStatusEnum' meeting_date: type: string format: date title: Proposed / Confirmed Date meeting_time: type: string format: time title: Proposed / Confirmed Time duration_minutes: type: integer title: Duration (Minutes) meeting_url: title: Video Meeting Link oneOf: - type: string format: uri maxLength: 500 - type: string maxLength: 0 agenda: type: string title: Meeting Agenda & Topics admin_notes: type: string title: Internal / Admin Notes required: - meeting_date - meeting_time MeetingUser: type: object properties: id: type: integer readOnly: true email: nullable: true title: Email Address description: User primary email address. oneOf: - type: string format: email maxLength: 254 - type: string maxLength: 0 fullname: type: string nullable: true title: Full Name description: Full name of the user. maxLength: 255 avatar: type: string format: uri nullable: true required: - id MemberUserMini: type: object properties: id: type: integer readOnly: true email: type: string format: email readOnly: true nullable: true title: Email Address description: User primary email address. fullname: type: string readOnly: true nullable: true title: Full Name description: Full name of the user. avatar: type: string format: uri nullable: true readOnly: true phone_number: type: string readOnly: true nullable: true description: e.g., +1 555 1234567 required: - avatar - email - fullname - id - phone_number Notification: type: object properties: id: type: integer readOnly: true title: type: string maxLength: 255 message: type: string maxLength: 1024 is_read: type: boolean notification_type: type: string nullable: true maxLength: 50 action: type: string maxLength: 50 navigate_to: type: string nullable: true maxLength: 255 created_at: type: string format: date-time readOnly: true updated_at: type: string format: date-time readOnly: true required: - created_at - id - message - title - updated_at NotificationTemplate: type: object properties: id: type: integer readOnly: true notification_type: type: string maxLength: 50 name: type: string maxLength: 100 is_active: type: boolean title: type: string maxLength: 255 body: type: string maxLength: 1024 placeholders_info: type: string nullable: true title: Allowed Placeholders Description maxLength: 255 required: - id - name - notification_type NotificationTemplateRequest: type: object properties: notification_type: type: string minLength: 1 maxLength: 50 name: type: string minLength: 1 maxLength: 100 is_active: type: boolean title: type: string minLength: 1 maxLength: 255 body: type: string minLength: 1 maxLength: 1024 placeholders_info: type: string nullable: true title: Allowed Placeholders Description maxLength: 255 required: - name - notification_type NullEnum: enum: - null PaginatedAdminNotificationList: type: object required: - count - results properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/AdminNotification' PaginatedAdminUserList: type: object required: - count - results properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/AdminUser' PaginatedChatMessageList: type: object required: - count - results properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/ChatMessage' PaginatedChatRoomListList: type: object required: - count - results properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/ChatRoomList' PaginatedEventCalendarItemList: type: object required: - count - results properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/EventCalendarItem' PaginatedEventListList: type: object required: - count - results properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/EventList' PaginatedEventRegistrationList: type: object required: - count - results properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/EventRegistration' PaginatedInstitutionListList: type: object required: - count - results properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/InstitutionList' PaginatedInstitutionMediaList: type: object required: - count - results properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/InstitutionMedia' PaginatedInstitutionMemberList: type: object required: - count - results properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/InstitutionMember' PaginatedInstitutionTimelineList: type: object required: - count - results properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/InstitutionTimeline' PaginatedKanbanColumnList: type: object required: - count - results properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/KanbanColumn' PaginatedMapClusterItemList: type: object required: - count - results properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/MapClusterItem' PaginatedMediaAssetList: type: object required: - count - results properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/MediaAsset' PaginatedMeetingListList: type: object required: - count - results properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/MeetingList' PaginatedNotificationList: type: object required: - count - results properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/Notification' PaginatedNotificationTemplateList: type: object required: - count - results properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/NotificationTemplate' PaginatedPostCategoryList: type: object required: - count - results properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/PostCategory' PaginatedPostCommentList: type: object required: - count - results properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/PostComment' PaginatedPostListList: type: object required: - count - results properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/PostList' PaginatedPostTagList: type: object required: - count - results properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/PostTag' PaginatedProjectDocumentList: type: object required: - count - results properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/ProjectDocument' PaginatedProjectListList: type: object required: - count - results properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/ProjectList' PaginatedRegionalDensityList: type: object required: - count - results properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/RegionalDensity' PaginatedVerificationDocumentList: type: object required: - count - results properties: count: type: integer example: 123 next: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=4 previous: type: string nullable: true format: uri example: http://api.example.org/accounts/?page=2 results: type: array items: $ref: '#/components/schemas/VerificationDocument' PasswordRecoverRequestRequest: type: object properties: email: type: string format: email minLength: 1 required: - email PasswordResetRequestRequest: type: object properties: email: type: string format: email minLength: 1 token: type: string minLength: 1 new_password: type: string minLength: 6 required: - email - new_password - token PatchedAdminNotificationRequest: type: object properties: title: type: string minLength: 1 maxLength: 255 message: type: string minLength: 1 maxLength: 1024 is_read: type: boolean notification_type: type: string nullable: true maxLength: 50 action: type: string minLength: 1 maxLength: 50 navigate_to: type: string nullable: true maxLength: 255 PatchedAdminUserRequest: type: object properties: fullname: type: string nullable: true title: Full Name description: Full name of the user. maxLength: 255 email: type: string format: email minLength: 1 phone_number: type: string nullable: true description: e.g., +1 555 1234567 maxLength: 128 password: type: string writeOnly: true minLength: 1 avatar: type: string nullable: true minLength: 1 gender: nullable: true oneOf: - $ref: '#/components/schemas/GenderEnum' - $ref: '#/components/schemas/BlankEnum' - $ref: '#/components/schemas/NullEnum' birthdate: type: string format: date nullable: true info: type: string nullable: true title: Bio / Info skill: type: string nullable: true title: Skill / Role maxLength: 512 city: type: string nullable: true maxLength: 255 country: type: string nullable: true maxLength: 255 fcm: type: string nullable: true title: FCM Token maxLength: 512 user_type: $ref: '#/components/schemas/UserTypeEnum' is_active: type: boolean title: Active description: Designates whether this user should be treated as active. is_staff: type: boolean is_superuser: type: boolean title: Superuser status description: Designates that this user has all permissions without explicitly assigning them. PatchedEventCreateUpdateRequest: type: object properties: title: type: string minLength: 1 title: Event Title maxLength: 255 description: type: string minLength: 1 title: Event Description organizer_id: type: integer writeOnly: true category: $ref: '#/components/schemas/CategoryEnum' event_date: type: string format: date start_time: type: string format: time end_time: type: string format: time nullable: true speaker_name: type: string maxLength: 255 speaker_title: type: string title: Speaker Title / Affiliation maxLength: 255 speaker_avatar: type: string format: binary nullable: true location_type: $ref: '#/components/schemas/LocationTypeEnum' venue_address: type: string maxLength: 500 online_meeting_url: title: Online Meeting Link oneOf: - type: string format: uri maxLength: 200 - type: string maxLength: 0 cover_image: type: string format: binary nullable: true capacity: type: integer title: Capacity Limit is_active: type: boolean is_featured: type: boolean language: $ref: '#/components/schemas/CMSPostLanguageEnum' tags: {} PatchedInstitutionCreateUpdateRequest: type: object properties: name: type: string minLength: 1 title: Institution Name description: Official name of the mosque, center, or institute. maxLength: 255 type: allOf: - $ref: '#/components/schemas/TypeEnum' title: Institution Type country: type: string minLength: 1 maxLength: 255 city: type: string minLength: 1 maxLength: 255 address: type: string nullable: true title: Full Address latitude: type: number format: double nullable: true longitude: type: number format: double nullable: true description: type: string nullable: true title: Description & Background website: nullable: true oneOf: - type: string format: uri maxLength: 500 - type: string maxLength: 0 email: nullable: true title: Official Email oneOf: - type: string format: email maxLength: 254 - type: string maxLength: 0 phone: type: string nullable: true title: Official Phone maxLength: 50 established_year: type: integer nullable: true title: Established Year (CE) cover_image: type: string format: binary nullable: true avatar: type: string format: binary nullable: true title: Logo / Avatar social_media: title: Social Media Links description: 'Dictionary with keys: facebook, twitter, instagram, linkedin, youtube, telegram' working_hours: title: Working Hours / Prayer Times Schedule tags: title: Tags & Specializations is_featured: type: boolean PatchedKanbanTaskCreateUpdateRequest: type: object properties: column: type: integer title: Kanban Column title: type: string minLength: 1 title: Task Title maxLength: 255 description: type: string nullable: true title: Task Description priority: $ref: '#/components/schemas/PriorityEnum' assignee: type: integer nullable: true title: Assignee User due_date: type: string format: date nullable: true labels: title: Task Labels order: type: integer title: Display Order within Column PatchedMeetingUpdateRequest: type: object properties: status: $ref: '#/components/schemas/MeetingStatusEnum' meeting_date: type: string format: date title: Proposed / Confirmed Date meeting_time: type: string format: time title: Proposed / Confirmed Time duration_minutes: type: integer title: Duration (Minutes) meeting_url: title: Video Meeting Link oneOf: - type: string format: uri maxLength: 500 - type: string maxLength: 0 agenda: type: string title: Meeting Agenda & Topics admin_notes: type: string title: Internal / Admin Notes PatchedNotificationTemplateRequest: type: object properties: notification_type: type: string minLength: 1 maxLength: 50 name: type: string minLength: 1 maxLength: 100 is_active: type: boolean title: type: string minLength: 1 maxLength: 255 body: type: string minLength: 1 maxLength: 1024 placeholders_info: type: string nullable: true title: Allowed Placeholders Description maxLength: 255 PatchedPostCreateUpdateRequest: type: object properties: title: type: string minLength: 1 title: Post Title maxLength: 255 post_type: $ref: '#/components/schemas/PostTypeEnum' category: type: integer nullable: true language: $ref: '#/components/schemas/CMSPostLanguageEnum' status: allOf: - $ref: '#/components/schemas/CMSPostStatusEnum' title: Publication Status institution: type: integer nullable: true title: Associated Institution author_role_label: type: string nullable: true description: e.g. Senior Researcher, Center Director, Diplomatic Envoy maxLength: 150 author_custom_avatar: type: string format: binary nullable: true title: Custom Author Avatar featured_image: type: string format: binary nullable: true title: Featured Cover Image excerpt: type: string nullable: true title: Excerpt / Summary description: Brief summary for search results and cards. content: type: string minLength: 1 title: Rich Text / Markdown Content tags: {} is_featured: type: boolean publish_date: type: string format: date-time PatchedProjectCreateUpdateRequest: type: object properties: title: type: string minLength: 1 title: Project Title maxLength: 255 description: type: string nullable: true title: Project Description & Objectives owner_institution: type: integer title: Lead / Owner Institution collaborating_institutions: type: array items: type: integer title: Collaborating Institutions category: type: string nullable: true title: Project Category description: e.g. Cultural Diplomacy, Educational Academy, Interfaith Dialogue, Humanitarian Relief maxLength: 100 status: allOf: - $ref: '#/components/schemas/ProjectStatusEnum' title: Project Status progress_percentage: type: integer title: Progress Percentage (0-100) budget: type: string nullable: true title: Estimated Budget description: e.g. $50,000 or €35,000 maxLength: 100 team_size: type: integer cover_image: type: string format: binary nullable: true start_date: type: string format: date nullable: true estimated_end_date: type: string format: date nullable: true actual_end_date: type: string format: date nullable: true title: Actual Completion Date PatchedUserMeUpdateRequest: type: object properties: fullname: type: string nullable: true title: Full Name description: Full name of the user. maxLength: 255 phone_number: type: string nullable: true description: e.g., +1 555 1234567 maxLength: 128 avatar: type: string format: binary nullable: true bio: type: string nullable: true languages: {} skills: {} country: type: string nullable: true maxLength: 255 city: type: string nullable: true maxLength: 255 gender: nullable: true oneOf: - $ref: '#/components/schemas/GenderEnum' - $ref: '#/components/schemas/BlankEnum' - $ref: '#/components/schemas/NullEnum' birthdate: type: string format: date nullable: true PatchedUserProfileRequest: type: object properties: fcm: type: string minLength: 1 description: Firebase Cloud Messaging token. fullname: type: string minLength: 1 avatar: type: string nullable: true minLength: 1 phone_number: type: string nullable: true description: e.g., +1 555 1234567 maxLength: 128 password: type: string writeOnly: true minLength: 1 city: type: string nullable: true maxLength: 255 country: type: string nullable: true maxLength: 255 birthdate: type: string format: date nullable: true gender: allOf: - $ref: '#/components/schemas/GenderEnum' description: |- Select the user's gender. * `male` - Male * `female` - Female * `other` - Other PostAuthorMini: type: object properties: id: type: integer readOnly: true email: type: string format: email readOnly: true nullable: true title: Email Address description: User primary email address. fullname: type: string readOnly: true nullable: true title: Full Name description: Full name of the user. avatar: type: string format: uri nullable: true readOnly: true required: - avatar - email - fullname - id PostCategory: type: object properties: id: type: integer readOnly: true name: type: string title: Category Name maxLength: 255 slug: type: string readOnly: true title: Slug / URL Identifier pattern: ^[-\w]+$ language: $ref: '#/components/schemas/PostCategoryLanguageEnum' description: type: string nullable: true title: Category Description created_at: type: string format: date-time readOnly: true posts_count: type: integer readOnly: true required: - created_at - id - name - posts_count - slug PostCategoryLanguageEnum: enum: - fa - en - ar - ur - ru type: string description: |- * `fa` - Persian * `en` - English * `ar` - Arabic * `ur` - Urdu * `ru` - Russian PostComment: type: object properties: id: type: integer readOnly: true post: type: integer readOnly: true user: allOf: - $ref: '#/components/schemas/PostAuthorMini' readOnly: true author_name: type: string nullable: true maxLength: 255 author_email: nullable: true oneOf: - type: string format: email maxLength: 254 - type: string maxLength: 0 content: type: string title: Comment Content status: allOf: - $ref: '#/components/schemas/CMSCommentStatusEnum' readOnly: true title: Moderation Status status_display: type: string readOnly: true created_at: type: string format: date-time readOnly: true required: - content - created_at - id - post - status - status_display - user PostCommentCreateRequest: type: object properties: content: type: string minLength: 1 author_name: type: string maxLength: 255 author_email: oneOf: - type: string format: email - type: string maxLength: 0 required: - content PostCreateUpdateRequest: type: object properties: title: type: string minLength: 1 title: Post Title maxLength: 255 post_type: $ref: '#/components/schemas/PostTypeEnum' category: type: integer nullable: true language: $ref: '#/components/schemas/CMSPostLanguageEnum' status: allOf: - $ref: '#/components/schemas/CMSPostStatusEnum' title: Publication Status institution: type: integer nullable: true title: Associated Institution author_role_label: type: string nullable: true description: e.g. Senior Researcher, Center Director, Diplomatic Envoy maxLength: 150 author_custom_avatar: type: string format: binary nullable: true title: Custom Author Avatar featured_image: type: string format: binary nullable: true title: Featured Cover Image excerpt: type: string nullable: true title: Excerpt / Summary description: Brief summary for search results and cards. content: type: string minLength: 1 title: Rich Text / Markdown Content tags: {} is_featured: type: boolean publish_date: type: string format: date-time required: - content - title PostDetail: type: object properties: id: type: integer readOnly: true title: type: string title: Post Title maxLength: 255 slug: type: string readOnly: true nullable: true title: Slug / URL Identifier pattern: ^[-\w]+$ post_type: $ref: '#/components/schemas/PostTypeEnum' post_type_display: type: string readOnly: true category: allOf: - $ref: '#/components/schemas/PostCategory' readOnly: true language: $ref: '#/components/schemas/CMSPostLanguageEnum' status: allOf: - $ref: '#/components/schemas/CMSPostStatusEnum' title: Publication Status author: allOf: - $ref: '#/components/schemas/PostAuthorMini' readOnly: true institution: allOf: - $ref: '#/components/schemas/PostInstitutionMini' readOnly: true author_role_label: type: string nullable: true description: e.g. Senior Researcher, Center Director, Diplomatic Envoy maxLength: 150 author_custom_avatar: type: string format: uri nullable: true title: Custom Author Avatar featured_image: type: string format: uri nullable: true title: Featured Cover Image excerpt: type: string nullable: true title: Excerpt / Summary description: Brief summary for search results and cards. content: type: string title: Rich Text / Markdown Content tags: {} reading_time_minutes: type: integer readOnly: true title: Reading Time (Minutes) views_count: type: integer readOnly: true likes_count: type: integer readOnly: true comments_count: type: integer readOnly: true is_featured: type: boolean publish_date: type: string format: date-time is_liked: type: boolean readOnly: true comments: type: array items: $ref: '#/components/schemas/PostComment' readOnly: true created_at: type: string format: date-time readOnly: true updated_at: type: string format: date-time readOnly: true required: - author - category - comments - comments_count - content - created_at - id - institution - is_liked - likes_count - post_type_display - reading_time_minutes - slug - title - updated_at - views_count PostInstitutionMini: type: object properties: id: type: integer readOnly: true name: type: string readOnly: true title: Institution Name description: Official name of the mosque, center, or institute. slug: type: string readOnly: true nullable: true title: Slug / URL Identifier pattern: ^[-\w]+$ type: allOf: - $ref: '#/components/schemas/TypeEnum' readOnly: true title: Institution Type type_display: type: string readOnly: true avatar: type: string format: uri nullable: true readOnly: true title: Logo / Avatar city: type: string readOnly: true country: type: string readOnly: true required: - avatar - city - country - id - name - slug - type - type_display PostLikeResponse: type: object properties: is_liked: type: boolean likes_count: type: integer message: type: string required: - is_liked - likes_count - message PostLikeResponseRequest: type: object properties: is_liked: type: boolean likes_count: type: integer message: type: string minLength: 1 required: - is_liked - likes_count - message PostList: type: object properties: id: type: integer readOnly: true title: type: string readOnly: true title: Post Title slug: type: string readOnly: true nullable: true title: Slug / URL Identifier pattern: ^[-\w]+$ post_type: allOf: - $ref: '#/components/schemas/PostTypeEnum' readOnly: true post_type_display: type: string readOnly: true category: type: integer readOnly: true nullable: true category_name: type: string readOnly: true nullable: true language: allOf: - $ref: '#/components/schemas/CMSPostLanguageEnum' readOnly: true status: allOf: - $ref: '#/components/schemas/CMSPostStatusEnum' readOnly: true title: Publication Status author: allOf: - $ref: '#/components/schemas/PostAuthorMini' readOnly: true institution: allOf: - $ref: '#/components/schemas/PostInstitutionMini' readOnly: true author_role_label: type: string readOnly: true nullable: true description: e.g. Senior Researcher, Center Director, Diplomatic Envoy author_custom_avatar: type: string format: uri nullable: true readOnly: true title: Custom Author Avatar featured_image: type: string format: uri nullable: true readOnly: true title: Featured Cover Image excerpt: type: string readOnly: true nullable: true title: Excerpt / Summary description: Brief summary for search results and cards. tags: readOnly: true reading_time_minutes: type: integer readOnly: true title: Reading Time (Minutes) views_count: type: integer readOnly: true likes_count: type: integer readOnly: true comments_count: type: integer readOnly: true is_featured: type: boolean readOnly: true publish_date: type: string format: date-time readOnly: true is_liked: type: boolean readOnly: true created_at: type: string format: date-time readOnly: true required: - author - author_custom_avatar - author_role_label - category - category_name - comments_count - created_at - excerpt - featured_image - id - institution - is_featured - is_liked - language - likes_count - post_type - post_type_display - publish_date - reading_time_minutes - slug - status - tags - title - views_count PostTag: type: object properties: id: type: integer readOnly: true name: type: string title: Tag Name maxLength: 100 slug: type: string readOnly: true pattern: ^[-\w]+$ required: - id - name - slug PostTypeEnum: enum: - news - article - report - interview type: string description: |- * `news` - News & Announcements * `article` - Analytical Article * `report` - Field & Diplomatic Report * `interview` - Expert Interview PriorityEnum: enum: - low - medium - high - urgent type: string description: |- * `low` - Low * `medium` - Medium * `high` - High * `urgent` - Urgent ProjectCreateUpdateRequest: type: object properties: title: type: string minLength: 1 title: Project Title maxLength: 255 description: type: string nullable: true title: Project Description & Objectives owner_institution: type: integer title: Lead / Owner Institution collaborating_institutions: type: array items: type: integer title: Collaborating Institutions category: type: string nullable: true title: Project Category description: e.g. Cultural Diplomacy, Educational Academy, Interfaith Dialogue, Humanitarian Relief maxLength: 100 status: allOf: - $ref: '#/components/schemas/ProjectStatusEnum' title: Project Status progress_percentage: type: integer title: Progress Percentage (0-100) budget: type: string nullable: true title: Estimated Budget description: e.g. $50,000 or €35,000 maxLength: 100 team_size: type: integer cover_image: type: string format: binary nullable: true start_date: type: string format: date nullable: true estimated_end_date: type: string format: date nullable: true actual_end_date: type: string format: date nullable: true title: Actual Completion Date required: - owner_institution - title ProjectDetail: type: object properties: id: type: integer readOnly: true title: type: string title: Project Title maxLength: 255 slug: type: string readOnly: true nullable: true title: Slug / URL Identifier pattern: ^[-\w]+$ description: type: string nullable: true title: Project Description & Objectives owner_institution: allOf: - $ref: '#/components/schemas/ProjectInstitutionMini' readOnly: true collaborating_institutions: type: array items: $ref: '#/components/schemas/ProjectInstitutionMini' readOnly: true category: type: string nullable: true title: Project Category description: e.g. Cultural Diplomacy, Educational Academy, Interfaith Dialogue, Humanitarian Relief maxLength: 100 status: allOf: - $ref: '#/components/schemas/ProjectStatusEnum' title: Project Status status_display: type: string readOnly: true progress_percentage: type: integer title: Progress Percentage (0-100) budget: type: string nullable: true title: Estimated Budget description: e.g. $50,000 or €35,000 maxLength: 100 team_size: type: integer cover_image: type: string format: uri nullable: true start_date: type: string format: date nullable: true estimated_end_date: type: string format: date nullable: true actual_end_date: type: string format: date nullable: true title: Actual Completion Date columns: type: array items: $ref: '#/components/schemas/KanbanColumn' readOnly: true documents: type: array items: $ref: '#/components/schemas/ProjectDocument' readOnly: true can_edit: type: boolean readOnly: true created_by_email: type: string format: email readOnly: true nullable: true created_at: type: string format: date-time readOnly: true updated_at: type: string format: date-time readOnly: true required: - can_edit - collaborating_institutions - columns - created_at - created_by_email - documents - id - owner_institution - slug - status_display - title - updated_at ProjectDocument: type: object properties: id: type: integer readOnly: true project: type: integer readOnly: true title: type: string title: Document Title maxLength: 255 file: type: string format: uri title: Document File doc_type: allOf: - $ref: '#/components/schemas/DocTypeEnum' title: Document Type doc_type_display: type: string readOnly: true uploaded_by_email: type: string format: email readOnly: true nullable: true uploaded_at: type: string format: date-time readOnly: true required: - doc_type_display - file - id - project - title - uploaded_at - uploaded_by_email ProjectDocumentRequest: type: object properties: title: type: string minLength: 1 title: Document Title maxLength: 255 file: type: string format: binary title: Document File doc_type: allOf: - $ref: '#/components/schemas/DocTypeEnum' title: Document Type required: - file - title ProjectInstitutionMini: type: object properties: id: type: integer readOnly: true name: type: string readOnly: true title: Institution Name description: Official name of the mosque, center, or institute. slug: type: string readOnly: true nullable: true title: Slug / URL Identifier pattern: ^[-\w]+$ type: allOf: - $ref: '#/components/schemas/TypeEnum' readOnly: true title: Institution Type type_display: type: string readOnly: true avatar: type: string format: uri nullable: true readOnly: true title: Logo / Avatar city: type: string readOnly: true country: type: string readOnly: true required: - avatar - city - country - id - name - slug - type - type_display ProjectList: type: object properties: id: type: integer readOnly: true title: type: string readOnly: true title: Project Title slug: type: string readOnly: true nullable: true title: Slug / URL Identifier pattern: ^[-\w]+$ owner_institution: allOf: - $ref: '#/components/schemas/ProjectInstitutionMini' readOnly: true collaborating_institutions_count: type: integer readOnly: true category: type: string readOnly: true nullable: true title: Project Category description: e.g. Cultural Diplomacy, Educational Academy, Interfaith Dialogue, Humanitarian Relief status: allOf: - $ref: '#/components/schemas/ProjectStatusEnum' readOnly: true title: Project Status status_display: type: string readOnly: true progress_percentage: type: integer readOnly: true title: Progress Percentage (0-100) budget: type: string readOnly: true nullable: true title: Estimated Budget description: e.g. $50,000 or €35,000 team_size: type: integer readOnly: true cover_image: type: string format: uri nullable: true readOnly: true start_date: type: string format: date readOnly: true nullable: true estimated_end_date: type: string format: date readOnly: true nullable: true tasks_count: type: integer readOnly: true completed_tasks_count: type: integer readOnly: true created_at: type: string format: date-time readOnly: true required: - budget - category - collaborating_institutions_count - completed_tasks_count - cover_image - created_at - estimated_end_date - id - owner_institution - progress_percentage - slug - start_date - status - status_display - tasks_count - team_size - title ProjectStatusEnum: enum: - planning - active - on_hold - completed type: string description: |- * `planning` - Planning * `active` - Active / In Progress * `on_hold` - On Hold * `completed` - Completed ProjectUserMini: type: object properties: id: type: integer readOnly: true email: type: string format: email readOnly: true nullable: true title: Email Address description: User primary email address. fullname: type: string readOnly: true nullable: true title: Full Name description: Full name of the user. avatar: type: string format: uri nullable: true readOnly: true required: - avatar - email - fullname - id RegionInfo: type: object properties: ip: type: string nullable: true browser: type: string nullable: true user_agent: type: string required: - browser - ip - user_agent RegionalDensity: type: object properties: country: type: string total_institutions: type: integer mosques_count: type: integer hussainiyas_count: type: integer cultural_centers_count: type: integer libraries_count: type: integer institutes_count: type: integer charities_count: type: integer total_followers: type: integer center_lat: type: number format: double nullable: true center_lng: type: number format: double nullable: true required: - center_lat - center_lng - charities_count - country - cultural_centers_count - hussainiyas_count - institutes_count - libraries_count - mosques_count - total_followers - total_institutions RegisterRequestRequest: type: object properties: email: type: string format: email minLength: 1 password: type: string writeOnly: true minLength: 6 fullname: type: string minLength: 1 maxLength: 255 phone_number: type: string nullable: true user_type: allOf: - $ref: '#/components/schemas/UserTypeEnum' default: client languages: type: array items: type: string minLength: 1 maxLength: 10 skills: type: array items: type: string minLength: 1 maxLength: 100 country: type: string maxLength: 255 city: type: string maxLength: 255 required: - email - fullname - password RegisterResponse: type: object properties: user: $ref: '#/components/schemas/UserMe' access: type: string refresh: type: string message: type: string required: - access - message - refresh - user RoleEnum: enum: - admin - editor - viewer type: string description: |- * `admin` - Administrator * `editor` - Content & Project Editor * `viewer` - Viewer / Member RoomTypeEnum: enum: - direct - group type: string description: |- * `direct` - Direct Message * `group` - Group Conversation SendNotificationRequest: type: object properties: user_id: type: integer description: Target User ID title: type: string minLength: 1 description: Notification title maxLength: 255 body: type: string minLength: 1 description: Notification body data: type: object additionalProperties: {} description: Extra payload data required: - body - title - user_id Support: type: object properties: telegram_number: type: string default: '' whatsapp_number: type: string default: '' office_hours: type: string default: '' SupportMessageCreate: type: object properties: id: type: integer readOnly: true sender_name: type: string maxLength: 255 sender_email: type: string format: email maxLength: 254 subject: type: string maxLength: 255 sender_phone: type: string nullable: true maxLength: 128 message: type: string created_at: type: string format: date-time readOnly: true required: - created_at - id - message - sender_email - sender_name - subject SupportMessageCreateRequest: type: object properties: sender_name: type: string minLength: 1 maxLength: 255 sender_email: type: string format: email minLength: 1 maxLength: 254 subject: type: string minLength: 1 maxLength: 255 sender_phone: type: string nullable: true maxLength: 128 message: type: string minLength: 1 required: - message - sender_email - sender_name - subject SupportRequest: type: object properties: telegram_number: type: string default: '' whatsapp_number: type: string default: '' office_hours: type: string default: '' TokenObtainPair: type: object properties: access: type: string readOnly: true refresh: type: string readOnly: true required: - access - refresh TokenObtainPairRequest: type: object properties: email: type: string writeOnly: true minLength: 1 password: type: string writeOnly: true minLength: 1 required: - email - password TokenRefresh: type: object properties: access: type: string readOnly: true refresh: type: string required: - access - refresh TokenRefreshRequest: type: object properties: refresh: type: string minLength: 1 required: - refresh TokenVerifyRequest: type: object properties: token: type: string writeOnly: true minLength: 1 required: - token TypeEnum: enum: - mosque - hussainiya - cultural_center - library - institute - charity - other type: string description: |- * `mosque` - Mosque * `hussainiya` - Hussainiya / Islamic Center * `cultural_center` - Cultural Center * `library` - Islamic Library * `institute` - Seminary & Institute * `charity` - Charity & Foundation * `other` - Other Organization UserFCM: type: object properties: fcm: type: string nullable: true title: FCM Token maxLength: 512 UserFCMRequest: type: object properties: fcm: type: string nullable: true title: FCM Token maxLength: 512 UserGuest: type: object properties: device_id: type: string fcm: type: string device_os: $ref: '#/components/schemas/DeviceOsEnum' lat: type: string nullable: true maxLength: 255 lon: type: string nullable: true maxLength: 255 timezone: type: string nullable: true UserGuestRequest: type: object properties: device_id: type: string minLength: 1 fcm: type: string minLength: 1 device_os: $ref: '#/components/schemas/DeviceOsEnum' lat: type: string nullable: true maxLength: 255 lon: type: string nullable: true maxLength: 255 timezone: type: string nullable: true UserLogin: type: object properties: token: type: string readOnly: true nullable: true fullname: type: string readOnly: true nullable: true avatar: type: string readOnly: true nullable: true password: type: string fcm: type: string device_id: type: string timezone: type: string nullable: true required: - avatar - fullname - password - token UserLoginRequest: type: object properties: email: type: string format: email writeOnly: true minLength: 1 password: type: string minLength: 1 fcm: type: string minLength: 1 device_id: type: string minLength: 1 timezone: type: string nullable: true required: - email - password UserMe: type: object properties: id: type: integer readOnly: true email: type: string format: email readOnly: true nullable: true title: Email Address description: User primary email address. username: type: string readOnly: true nullable: true fullname: type: string nullable: true title: Full Name description: Full name of the user. maxLength: 255 phone_number: type: string nullable: true description: e.g., +1 555 1234567 maxLength: 128 user_type: allOf: - $ref: '#/components/schemas/UserTypeEnum' readOnly: true avatar: type: string format: uri nullable: true bio: type: string nullable: true languages: {} skills: {} country: type: string nullable: true maxLength: 255 city: type: string nullable: true maxLength: 255 gender: nullable: true oneOf: - $ref: '#/components/schemas/GenderEnum' - $ref: '#/components/schemas/BlankEnum' - $ref: '#/components/schemas/NullEnum' birthdate: type: string format: date nullable: true date_joined: type: string format: date-time readOnly: true is_active: type: boolean readOnly: true title: Active description: Designates whether this user should be treated as active. is_staff: type: boolean readOnly: true roles: type: array items: {} readOnly: true permissions: type: array items: {} readOnly: true verification_status: type: string readOnly: true is_verified: type: boolean readOnly: true required: - date_joined - email - id - is_active - is_staff - is_verified - permissions - roles - user_type - username - verification_status UserProfile: type: object properties: id: type: integer readOnly: true device_id: type: string readOnly: true nullable: true fcm: type: string description: Firebase Cloud Messaging token. fullname: type: string slug: type: string readOnly: true nullable: true pattern: ^[-a-zA-Z0-9_]+$ avatar: type: string nullable: true email: type: string format: email readOnly: true nullable: true title: Email Address description: User primary email address. phone_number: type: string nullable: true description: e.g., +1 555 1234567 maxLength: 128 info: type: string readOnly: true nullable: true title: Bio / Info skill: type: string readOnly: true nullable: true title: Skill / Role city: type: string nullable: true maxLength: 255 country: type: string nullable: true maxLength: 255 birthdate: type: string format: date nullable: true gender: allOf: - $ref: '#/components/schemas/GenderEnum' description: |- Select the user's gender. * `male` - Male * `female` - Female * `other` - Other saved_location: type: object additionalProperties: {} readOnly: true required: - device_id - email - id - info - saved_location - skill - slug UserProfileRequest: type: object properties: fcm: type: string minLength: 1 description: Firebase Cloud Messaging token. fullname: type: string minLength: 1 avatar: type: string nullable: true minLength: 1 phone_number: type: string nullable: true description: e.g., +1 555 1234567 maxLength: 128 password: type: string writeOnly: true minLength: 1 city: type: string nullable: true maxLength: 255 country: type: string nullable: true maxLength: 255 birthdate: type: string format: date nullable: true gender: allOf: - $ref: '#/components/schemas/GenderEnum' description: |- Select the user's gender. * `male` - Male * `female` - Female * `other` - Other UserRecoverPassword: type: object description: |- Validates that an email is provided and is in a valid format without checking for database uniqueness. properties: email: type: string format: email required: - email UserRecoverPasswordRequest: type: object description: |- Validates that an email is provided and is in a valid format without checking for database uniqueness. properties: email: type: string format: email minLength: 1 required: - email UserRegister: type: object properties: id: type: integer readOnly: true fullname: type: string nullable: true title: Full Name description: Full name of the user. maxLength: 255 email: type: string format: email fcm: type: string nullable: true required: - email - fullname - id UserRegisterRequest: type: object properties: fullname: type: string nullable: true title: Full Name description: Full name of the user. maxLength: 255 email: type: string format: email minLength: 1 password: type: string writeOnly: true minLength: 1 fcm: type: string nullable: true device_id: type: string writeOnly: true nullable: true required: - email - fullname UserResetPasswordRequest: type: object properties: password: type: string writeOnly: true minLength: 1 required: - password UserTypeEnum: enum: - client - student - professor - consultant - admin - super_admin - regional_admin - institution_admin - editor - viewer type: string description: |- * `client` - Client / User * `student` - Student / Member * `professor` - Professor / Scholar * `consultant` - Consultant * `admin` - Admin * `super_admin` - Super Admin * `regional_admin` - Regional Admin * `institution_admin` - Institution Admin * `editor` - Editor * `viewer` - Viewer UserVerify: type: object properties: code: type: string maxLength: 6 email: type: string format: email device_id: type: string maxLength: 255 required: - code - email UserVerifyRequest: type: object properties: code: type: string minLength: 1 maxLength: 6 email: type: string format: email minLength: 1 device_id: type: string minLength: 1 maxLength: 255 required: - code - email VerificationDocument: type: object properties: id: type: integer readOnly: true user: type: integer readOnly: true document_type: $ref: '#/components/schemas/DocumentTypeEnum' document_type_display: type: string readOnly: true title: type: string nullable: true title: Document Title maxLength: 255 document_file: type: string format: uri status: allOf: - $ref: '#/components/schemas/VerificationDocumentStatusEnum' readOnly: true title: Verification Status status_display: type: string readOnly: true admin_notes: type: string readOnly: true nullable: true title: Admin Notes / Feedback reviewed_by_email: type: string format: email readOnly: true nullable: true uploaded_at: type: string format: date-time readOnly: true reviewed_at: type: string format: date-time readOnly: true nullable: true required: - admin_notes - document_file - document_type_display - id - reviewed_at - reviewed_by_email - status - status_display - uploaded_at - user VerificationDocumentStatusEnum: enum: - pending - verified - rejected type: string description: |- * `pending` - Pending Review * `verified` - Verified * `rejected` - Rejected VerificationDocumentUploadRequest: type: object properties: document_type: allOf: - $ref: '#/components/schemas/DocumentTypeEnum' default: national_id title: type: string maxLength: 255 document_file: type: string format: binary required: - document_file VerificationStatusEnum: enum: - pending - approved - rejected type: string description: |- * `pending` - Pending Review * `approved` - Approved & Verified * `rejected` - Rejected WebUserRegister: type: object properties: id: type: integer readOnly: true fullname: type: string nullable: true title: Full Name description: Full name of the user. maxLength: 255 email: type: string format: email fcm: type: string nullable: true required: - email - fullname - id WebUserRegisterRequest: type: object properties: fullname: type: string nullable: true title: Full Name description: Full name of the user. maxLength: 255 email: type: string format: email minLength: 1 password: type: string writeOnly: true minLength: 1 fcm: type: string nullable: true required: - email - fullname - password securitySchemes: cookieAuth: type: apiKey in: cookie name: sessionid jwtAuth: type: http scheme: bearer bearerFormat: JWT tokenAuth: type: apiKey in: header name: Authorization description: Token-based authentication with required prefix "Token"