API Endpoints


Here in this file the Api endpoints will Documented

<------------------- Format ----------------->
1. [Title — e.g., Landing page]
    URL: base_url/api/[endpoint, e.g., landing/]
    Accepted Request(s): [GET, POST, PUT, DELETE]
    GET:
        return:
            if status=200:
                {
                    "success": true,
                    "data": [
                        {
                            "field_name": "value",
                            "example": "sample_data"
                        }
                    ]
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Error message",
                    "message": "Detailed error description"
                }

    POST:
        take: 
            {
                "section_name": {
                    "field_name": "value",
                    "example": "sample_data"
                }
            }
        return:
            if status=201:
                {
                    "success": true,
                    "message": "Success message"
                }
            else if status=400:
                {
                    "success": false,
                    "error": "Error message",
                    "details": "Validation errors"
                }

<------------------ Content --------------->
0. Common:
    Input:


1. GetPlan (Any) ---> Landing page
    URL: base_url/subscriptions/GetPlan/
    Accepted Request(s): GET
    GET:
        return:
            if status=200:
                {
                    "success": true,
                    "data": {
                        "plans":[
                            {
                                "name": Str,
                                "short_description": Str,
                                "price": Decimal,
                                "key_features": [Str, Str, Str,...]
                            },.......
                        ]
                    }
                }

            else if status=500: {
                "success": False,
                "error": "Failed to retrieve plan data",
                "details": ""
            }

2. Create Meeting (Any)
    URL: base_url/meetings/CreateMeeting/
    Accepted Request(s): POST
    POST:
        take: {
            "title": Str,                   // Required
            "requester_name": Str,          // Required
            "phone": Str,                   // Optional
            "email": Str,                   // Required
            "description": Str,             // Required
            "start_time": Str,              // Required
            "end_time": Str,                // Optional
            "time_zone": Str                // Required
        }
        return:
            if status=201:
                {
                    "success": true,
                    "message": "Meeting created successfully",
                    "meeting": {
                        "id": Int,
                        "title": Str,
                        "requester_name": Str,
                        "phone": Str,
                        "email": Str,
                        "goal": Str,
                        "description": Str,
                        "start_time": Str,
                        "end_time": Str,
                        "time_zone": Str,
                        "status": Str,
                        "created_at": Str
                    }
                }
            else if status=400:
                {
                    "success": false,
                    "error": "Invalid data",
                    "details": "Validation errors"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Failed to create meeting",
                    "details": "Error message"
                }

3. Save Query (Any)
    URL: base_url/communication/SaveQuery/
    Accepted Request(s): POST
    POST:
        take: {
            "name": Str,                    // Required
            "email": Str,                   // Required
            "phone": Str,                   // Required
            "message": Str                  // Required
        }
        return:
            if status=201:
                {
                    "success": true,
                    "message": "Query submitted successfully"
                    "data":{
                        "name": Str,
                        "email": Str,
                        "phone": Str,
                        "message": Str
                    }
                }
            else if status=400:
                {
                    "success": false,
                    "error": "Invalid data",
                    "details": "Validation errors"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Failed to submit query",
                    "details": "Error message"
                }

4. Initialize Payment (Any)
    URL: base_url/payments/InitializePayment/
    Accepted Request(s): GET, POST

    GET:
        return:
            if status=200:
                {
                    "success": true,
                    "message": "Organization types retrieved successfully",
                    "data": {
                        "org_types": [
                            { "name": Str, "value": Str }, ...
                        ]
                    }
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Failed to retrieve organization types",
                    "details": Str
                }

    POST:
        take: {
            "organization": {
                "name": Str,            // Required
                "type": Str,            // Required (one of Organization.TYPE_CHOICES values)
                "email": Str,           // Required
                "location": Str         // Required
            },
            "admin": {
                "first_name": Str,      // Required
                "last_name": Str,       // Required
                "email": Str,           // Required
                "password": Str,        // Required
                "re_password": Str      // Required (must match password)
            },
            "subscription": {
                "plan_id": Int,         // Required (Subscription Plan ID)
                "promo_code": Str|null, // Optional (Promotion code)
            },
            "redirect_links":{
                "success": Str,
                "cancel": Str
            }
        }
        return:
            if status=200:
                {
                    "success": true,
                    "message": "Organization, Admin and Subscription created successfully",
                    "data": {
                        "organization": {
                            "name": Str,
                            "email": Str,
                            "type": Str,
                            "location": Str
                        },
                        "admin": {
                            "first_name": Str,
                            "last_name": Str,
                            "email": Str,
                            "username": Str
                        },
                        "subscription": {
                            "plan": Str,           // Plan ID as string
                            "promo_code": Str,     // Promo code ID as string (empty if none)
                            "payment": Str,        // Payment ID as string
                            "auto_renew": Str      // "true" or "false" as string
                        },
                        "payment": {
                            "amount": Decimal,     // Payment amount
                            "currency": Str,       // Currency code
                            "status": Str,         // Payment status
                            "session_id": Str,     // Stripe session ID
                            "url": Str            // Stripe checkout URL
                        }
                    }
                }
            else if status=400:
                {
                    "success": false,
                    "error": "Validation failed",
                    "details": Object
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Failed to create organization, admin, subscription and payment",
                    "details": Str
                }

5. Login (Any)
    URL: base_url/core/login/
    Accepted Request(s): GET, POST
    GET:
        return: {
            "success": True,
            "sys_role": ['user', 'admin', 'super_admin']
        }


    POST:
        take: {
            "email": Str,                   // Required
            "password": Str                 // Required
        }

        return:
            if status=200:
                {
                    'success': True,
                    'message': 'Login Successful',
                    'data': {
                        'refresh': Str,
                        'access': Str,
                        "sys_role": Str
                    }
                }

            else if status=400:{
                "success": false,
                "error": "Missing required fields" | "Validation failed",
                "details": "Email and password are required" | Validation errors object
            }

            else if status=401:
                {
                    "success": false,
                    "error": "Invalid credentials",
                    "message": "Email or password is incorrect"
                }

            else if status=500:
                {
                    "success": false,
                    "error": "Login failed",
                    "details": Str,
                    "error_type": Str
                }

6. Logout (User, Org Admin, Super admin)
    URL: base_url/core/logout/
    Headers: Authorization: Bearer <access_token>
    Accepted Request(s): POST
    POST:
        take: {
            "refresh": Str                  // Required
        }

        return:
            if status=200:
                {
                    "success": true,
                    "message": "Logged out successfully"
                }

            else if status=400:
                {
                    "success": false,
                    "error": "Refresh token required" | "Invalid or expired refresh token",
                    "details": Str
                }

            else if status=500:
                {
                    "success": false,
                    "error": "Logout failed",
                    "details": Str,
                    "error_type": Str
                }

7. Refresh Access Token (User, Org Admin, Super admin)
    URL: base_url/api/getNewAccessToken/
    Accepted Request(s): POST
    POST:
        take:
        {
            "refresh": Str
        }

        return:
            if status=200:
                {
                    "access": Str
                }

            else if status=401:
                {
                    "detail": Str,
                    "code": Str
                }

8. Send OTP (Any)
    URL: base_url/verification/sendOTP/
    Accepted Request(s): POST
    POST:
        take: {
            "email": Str,   // Required
            "verify_link"   // Optional (ex:"https://frontend-server.com/verify/". This is where the token will be submitted form user. For testing porous may use :"{base_url}/verification/VerifyEmailByLink/--> POST {"token":Str})
        }

        return:
            if status=201:
                {
                    "success": true,
                    "message": "OTP sent by email successful. It will be invalid after 5 minutes"
                    "data": {
                        "email": Str
                    }
                }

            else if status=400:
                {
                    "success": false,
                    "error": "Email is required" | "Invalid email format"
                }
            else if status=404:
                {
                    "success": false,
                    "error": "This email does not exist in our system!"
                }
            else if status=429:
                {
                    "success": false,
                    "error": "Too many requests for a day"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "OTP sending failed" | "OTP Creation failed",
                    "details": Str,
                    "error_type": Str
                }
 
9. Verify OTP (Any)
    URL: base_url/verification/verifyOTP/
    Accepted Request(s): POST
    POST:
        take: {
            "email": Str,                   // Required
            "otp": Str                      // Required
        }

        return:
            if status=200:
                {
                    "success": true,
                    "message": "Email verified successfully",
                    "data": {"email": Str}
                }

            else if status=400:
                {
                    "success": false,
                    "error": "Missing required fields" | "Invalid email format" | "OTP Expired. Please request for new one." | "Credentials are not valid",
                    "details": "Email and OTP are required" | Validation errors object
                }
            else if status=404:
                {
                    "success": false,
                    "error": "Incorrect OTP" | "User not found"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "OTP verification failed",
                    "details": Str,
                    "error_type": Str
                }

10. Verify Email By Token  (Any)
    URL: base_url/verification/VerifyEmailByToken/
    Accepted Request(s): GET
    POST:
        take: {
            "token": Str                    // Required
        }

        return:
            if status=200:
                {
                    "success": true,
                    "message": "Email verified successfully",
                    "data": {"email": Str}
                }

            else if status=400:
                {
                    "success": false,
                    "error": "Token is required" | "Verification link has expired. Please request a new one." | "Invalid verification link."
                }
            else if status=404:
                {
                    "success": false,
                    "error": "Invalid token format"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Link verification failed",
                    "details": Str,
                    "error_type": Str
                }

11. User navbar (User) 
    URL: base_url/core/Nav/
    Note: role ∈ {User, Admin, SupAdmin}
    Headers: Authorization: Bearer <access_token>
    Accepted Request(s): GET
    GET:
        return:
            if status=200:
                {
                    "success": true,
                    "data": {
                        "first_name": Str | null,
                        "email": Str | null,
                        "photo": Str | null,
                        "sys_role"
                    }
                }
            else if status=401: {
                "success": false,
                "error": "Unauthorized",
                "message": "You are not authorized to access this resource"
            }
            else if status=500:
                {
                    "success": false,
                    "error": "Internal Server error",
                    "message": Str
                }

12. FAQs (All)
    URL: base_url/communication/Faqs/
    Headers: Authorization: Bearer <access_token>
    Accepted Request(s): GET, POST

    GET:
        params:
            - keyword: Str (optional)   // Filter FAQs by keyword in question or answer
        return:
            if status=200:
                {
                    "success": true,
                    "data": [
                        {
                            "id": Int,
                            "question": Str,
                            "answer": Str
                        }, ...
                    ]
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Internal Server error",
                    "message": Str
                }

    POST:
        take: {
            "question": Str,               // Required
            "answer": Str                  // Required
        }
        return:
            if status=201:
                {
                    "success": true,
                    "message": "FAQ submitted successfully",
                    "data": {
                        "id": Int,
                        "question": Str,
                        "answer": Str
                    }
                }
            else if status=400:
                {
                    "success": false,
                    "error": "Invalid data",
                    "details": Object
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Internal Server error",
                    "message": Str
                }

19.1. User Survey (Single) (User)
    URL: base_url/surveys/UserSurvey/<int:id>/
    Headers: Authorization: Bearer <access_token>
    Accepted Request(s): GET, POST

    GET:
        return:
            if status=200:
                {
                    "success": true,
                    "data": {
                        "name": Str,
                        "details": Str | null,
                        "type": Str,
                        "expires_at": Str | null,
                        // One of the following will be present based on user's previous response
                        "responses": [
                            {
                                "id": Int,
                                "question_text": Str,
                                "type": "text" | "singleChoice" | "multiChoice" | "boolean",
                                "answer": Str | Bool | [Str]
                            }, ...
                        ] |
                        "questions": [
                            {
                                "id": Int,
                                "question_text": Str,
                                "type": "text" | "singleChoice" | "multiChoice" | "boolean",
                                "options": [
                                    { "id": Int, "option_text": Str, "order_index": Int }, ...
                                ] // present only for singleChoice/multiChoice
                            }, ...
                        ]
                    }
                }
            else if status=403:
                {
                    "success": false,
                    "error": "Access denied",
                    "message": "You don't have access to this survey"
                }
            else if status=404:
                {
                    "success": false,
                    "error": "Not Found",
                    "message": "Survey not found"
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Internal Server error",
                    "message": Str
                }

    POST:
        take:
            {
                // Map of question_id to answer based on question type
                "<question_id>": Str,          // for text
                "<question_id>": Bool,         // for boolean
                "<question_id>": Int,          // for singleChoice (option_id)
                "<question_id>": [Int, Int]    // for multiChoice (list of option_ids)
            }
        return:
            if status=201:
                {
                    "success": true,
                    "message": "<n> failed to submit and <m> submitted successfully",
                    "data": {
                        "response_id": Int,
                        "invalid_response": [ { "question_id": Int, "answer": Any, "message": Str }, ... ],
                        "valid_response": [ { "question_id": Int, "answer": Any }, ... ]
                    }
                }
            else if status=400:
                {
                    "success": false,
                    "error": "Response already submitted" | "All Responses are required",
                    "message": "You have already submitted the survey" | "All Questions must be answered"
                }
            else if status=403:
                {
                    "success": false,
                    "error": "Access denied",
                    "message": "You don't have access to this survey"
                }
            else if status=404:
                {
                    "success": false,
                    "error": "Not Found",
                    "message": "Survey not found"
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Internal Server error",
                    "message": Str
                }

17. Document Read-count (User, Org Admin, Supper Admin)
    URL: base_url/documents/Count/
    Headers: Authorization: Bearer <access_token>
    Accepted Request(s): 
        - POST

    POST:
        takes:
            {
                "document_id": Read Count (Int),
                "document_id": Read Count (Int),....
            }
        returns:
            if status=201:
                {
                    "success": true,
                    "message": "Read count updated",
                    "data": {
                        "document_id": Read Count (Int),
                        "document_id": Read Count (Int),....
                    }
                }
            else if status=400:
                {
                    "success": false,
                    "error": "Invalid data",
                    "details": Object
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Internal Server Error",
                    "message": Str
                }
                
18. Token-count (User, Org Admin, Supper Admin)
    URL: base_url/ai/TokenCount/
    Headers: Authorization: Bearer <access_token>
    Accepted Request(s): 
        - GET
        - POST

    GET:
        returns:
            if status=201:
                {
                    "success": true,
                    "message": "Use case type retrieved",
                    "data": [{"name": "value"},.....]
                }

    POST:
        takes:
            {
                "type": Str  ------>  chatbot | summarization | policy_generation
                "token": Int
            }
        returns:
            if status=201:
                {
                    "success": true,
                    "message": "Token record added",
                    "data": {
                        "user_id": int,
                        "organization_id: int",
                        "used_token: int"
                    }
                }
            else if status=400:
                {
                    "success": false,
                    "error": "Invalid data",
                    "details": Object
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Internal Server Error",
                    "message": Str
                }
    

<------------------------- User --------------------->
12. User Quick Summary (User)
    URL: base_url/api/QuickSummary/
    Headers: Authorization: Bearer <access_token>
    Accepted Request(s): GET
    GET:
        return:
            if status=200:
                {
                    "success": true,
                    "data": {
                        "assigned_policies": Int,
                        "pending_induction": Int,
                        "pending_survey": Int,
                        "unseen_alerts": Int
                    }
                }

            else if status=401: {
                "success": false,
                "error": "Unauthorized",
                "message": "You are not authorized to access this resource"
            }

13. User Profile (User) 
    URL: base_url/core/Profile/
    Note: role ∈ {User, Admin, SupAdmin}
    Headers: Authorization: Bearer <access_token>
    Accepted Request(s): GET, PATCH
    GET:
        return:
            if status=200:
                {
                    "success": true,
                    "data": {
                        "first_name": Str | null,
                        "last_name": Str | null,
                        "email": Str | null,
                        "phone": Str | null,
                        "country": Str | null,
                        "language": Str | null,
                        "address": Str | null,
                        "organization_name": Str | null,
                        "role_name": Str | null,
                        "photo": Str | null
                    }
                }
            else if status=401: {
                "success": false,
                "error": "Unauthorized",
                "message": "You are not authorized to access this resource"
            }
            else if status=500:
                {
                    "success": false,
                    "error": "Internal Server error",
                    "message": Str
                }

    PATCH:
        take: {
            "profile": {                    // Object
                "first_name": Str,          // Optional
                "last_name": Str,           // Optional
                "email": Str,               // Optional
                "phone": Str,               // Optional
                "country": Str,             // Optional
                "language": Str,            // Optional
                "current_address": Str,     // Optional
                "permanent_address": Str,   // Optional
                "photo": File               // Optional
            }
        }
        return:
            if status=200:
                {
                    "success": true,
                    "message": "Profile updated successfully"
                }
                Note: If email is changed, is_email_verified will be automatically set to False
            else if status=400:
                {
                    "success": false,
                    "error": "Validation failed",
                    "details": Object
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Internal Server error",
                    "message": Str
                }

14. User Settings (User)
    URL: base_url/core/Settings/
    Note: role ∈ {User, Admin, SupAdmin}
    Headers: Authorization: Bearer <access_token>
    Accepted Request(s): GET, PATCH
    GET:
        return:
            if status=200:
                {
                    "success": true,
                    "data": {
                        "timezone": Str | null,
                        "date_format": Str,
                        "email_notification": Bool,
                        "in_app_alerts": Bool,
                        "policy_update_alerts": Bool,
                        "language": Str
                    }
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Internal Server error",
                    "message": Str
                }

    PATCH:
        take: {
            "settings": {                   // Object
                "timezone": Str,            // Optional
                "date_format": Str,         // Optional
                "email_notification": Bool, // Optional
                "in_app_alerts": Bool,      // Optional
                "policy_update_alerts": Bool,// Optional
                "language": Str             // Optional
            }
        }
        return:
            if status=200:
                {
                    "success": true,
                    "message": "Settings updated successfully"
                }
            else if status=400:
                {
                    "success": false,
                    "error": "Validation failed",
                    "details": Object
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Internal Server error",
                    "message": Str
                }

15. Organizational Documents (User, Org Admin)
    URL: base_url/documents/OrgDocuments/
    Note: role ∈ {User, Admin}
    Headers: Authorization: Bearer <access_token>
    Accepted Request(s): GET, POST
    
    GET:
        query parameters:
            category: Str (optional, filter by document category)
            key: Str (optional, search in name, tags, version description)
            type: Str (optional, filter by document type)
        returns:
            if status=200:
                {
                    "success": true,
                    "message": "Documents retrieved successfully",
                    "data": {
                        "filters": {
                            "types": [
                                {
                                    "name": Str,
                                    "value": Str
                                }, ...
                            ],
                            "categories": [
                                {
                                    "name": Str,
                                    "value": Str
                                }, ...
                            ]
                        },
                        "documents": [
                            {
                                "id": Int,
                                "name": Str,
                                "current_version": Str,
                                "type": Str,
                                "category": Str,
                                "updated_at": Str,
                                "versions": [
                                    {
                                        "id": Int,
                                        "version": Str
                                    }, ...
                                ]
                            }, ...
                        ],
                        "pagination": {
                            "count": Int,
                            "next": Str (URL or null),
                            "previous": Str (URL or null),
                            "page": Int,
                            "page_size": Int
                        }
                    }
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Internal Server error",
                    "message": Str
                }
    
    POST:
        request body:
            Multipart/Form-Data
            fields:
                name: Str (required)
                type: Str (required) // One of Document.TYPE_CHOICES
                category: Str (required) // One of Document.POLICY_CATEGORY_CHOICES
                tags: Str (optional)
                "description": Str (optional),
                "negativity_score": Str (optional),
                "negativity_reason": Str (optional),
                "url": Str (optional), // Either this or file Required
                "expire_at": Str (optional, ISO datetime)

        returns:
            if status=201:
                {
                    "success": true,
                    "message": "Document uploaded successfully",
                    "data": {
                        "id": Int,
                        "name": Str,
                        "type": Str,
                        "category": Str,
                        "tags": Str,
                        "current_version": Str,
                        "versions": {
                            "id": Int,
                            "version": Str,
                            "url": Str|null,
                            "expire_at": Str|null
                        }
                    }
                }
            else if status=400:
                {
                    "success": false,
                    "error": "Invalid data",
                    "message": {
                        "field_name": ["error_message"], ...
                    }
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Internal Server error",
                    "message": Str
                }

16. Chatbot History (User)
    URL: base_url/ai/ChatHistory/
    Headers: Authorization: Bearer <access_token>
    Accepted Request(s): 
        - GET
        - POST

    GET:
        returns:
            if status=200:
                {
                    "success": true,
                    "data": {
                        "user_id": Int,
                        "remaining_tokens": Int,
                        "histories": [
                            {
                                "id": Int,
                                "prompt": Str,
                                "response": Str,
                                "created_at": "2025-09-10T09:00:00Z"
                            },...
                        ]
                    }
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Internal Server Error",
                    "message": Str
                }

    POST:
        takes:
            {
                "prompt": Str,
                "response": Str,
                "used_tokens": int
            }
        returns:
            if status=201:
                {
                    "success": true,
                    "message": "Chat history created successfully",
                    "data": {
                        "id": Int,
                        "user": Int,
                        "prompt": Str,
                        "response": Str,
                        "used_tokens": Int,
                        "created_at": "2025-09-10T09:00:00Z"
                    }
                }
            else if status=400:
                {
                    "success": false,
                    "error": "Invalid data",
                    "details": Object
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Internal Server Error",
                    "message": Str
                }

17. User Induction (User)
    URL: base_url/induction/Induction/
    Headers: Authorization: Bearer <access_token>
    Accepted Request(s): GET
    GET:
        return:
            if status=200:
                {
                    "success": true,
                    "data": {
                        "overall_completion_rate": Float,
                        "inductions": {
                            "NotStarted": {
                                "id": Str,
                                "name": Str,
                                "description": Str | null,
                                "expires_at": Str | null,
                                "progress": Float
                            },
                            "InProgress": {
                                "id": Str,
                                "name": Str,
                                "description": Str | null,
                                "expires_at": Str | null,
                                "progress": Str
                            },
                            "Completed": {
                                "id": Str,
                                "name": Str,
                                "description": Str | null,
                                "expires_at": Str | null,
                                "progress": Str
                            }
                        }
                    }
                }
            else if status=400:
                {
                    "success": false,
                    "error": "No role found",
                    "message": "User is not associated with any role"
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Internal Server error",
                    "message": Str
                }

18. Emergency Access (User)
    URL: base_url/api/EmergencyAccess/
    Headers: Authorization: Bearer <access_token>
    Accepted Request(s): GET
    GET:
        return:
            if status=200:
                {
                    "success": true,
                    "data": {
                        "emergency_services": Str | null,
                        "after_hours_support": Str | null,
                        "on_duty_manager": {
                            "name": Str | null,
                            "phone": Str | null
                        }
                    }
                }
            else if status=400:
                {
                    "success": false,
                    "error": "No organization found",
                    "message": "User is not associated with any organization"
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Internal Server error",
                    "message": Str
                }

19. User Surveys (User)
    URL: base_url/surveys/AllUserSurvey/
    Headers: Authorization: Bearer <access_token>
    Accepted Request(s): GET
    GET:
        return:
            if status=200:
                {
                    "success": true,
                    "data": {
                        "not_responded": int
                        "surveys": {
                            "pending": [
                                {
                                    "id": Int
                                    "name": Str,
                                    "details": Str | null,
                                    "expires_at": Str | null,
                                    "status": "Pending" / "Complete"
                                }, ...
                            ],
                            "completed": [
                                {
                                    "id": Int
                                    "name": Str,
                                    "details": Str | null,
                                    "expires_at": Str | null,
                                    "status": "Pending" / "Complete"
                                }, ...
                            ]
                        }
                    }
                }
            else if status=400:
                {
                    "success": false,
                    "error": "No role found",
                    "message": "User is not associated with any role"
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Internal Server error",
                    "message": Str
                }

20. User Support Message (User)
    URL: base_url/communication/SaveSeaportMassage/
    Headers: Authorization: Bearer <access_token>
    Accepted Request(s): GET, POST
    
    GET:
        return:
            if status=200:
                {
                    "success": true,
                    "topic_choices": [
                        {
                            "value": Str,
                            "name": Str
                        }, ...
                    ]
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Failed to retrieve topic choices",
                    "details": "Error message"
                }
    
    POST:
        take: {
            "topic": Str,                   // Required
            "message": Str                 // Required
        }
        return:
            if status=201:
                {
                    "success": true,
                    "message": "Support message submitted successfully"
                }
            else if status=400:
                {
                    "success": false,
                    "error": "Invalid data",
                    "details": "Validation errors"
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Failed to submit support message",
                    "details": "Error message"
                }

21. Document Management (User, Org Admin)
    URL: base_url/documents/DocumentManage/<int:id>/
    Headers: Authorization: Bearer <access_token>
    Accepted Request(s): GET, PATCH, PUT, DELETE
    
    GET:
        query parameters:
            version: Int (optional, specific version number to retrieve)
        return:
            if status=200:
                {
                    "success": true,
                    "message": "Document retrieved successfully",
                    "data": {
                        "id": Int,
                        "name": Str,
                        "tags": Str,
                        "type": Str,
                        "category": Str,
                        "current_version": Int,
                        "updated_at": Str,
                        "version": {
                            "id": Int,
                            "version": Int,
                            "description": Str,
                            "negativity_score": Str,
                            "negativity_reason": Str,
                            "url": Str,
                            "expire_at": Str
                        },
                        // Additional fields for org_admin only:
                        "uploaded_by": Str,        // "First Last - username"
                        "access_counter": Int,
                        "search_counter": Int,
                        "version": {
                            "uploaded_by": Str     // "First Last - username"
                        }
                    }
                }
            else if status=400:
                {
                    "success": false,
                    "error": "Valid version not found",
                    "message": "The document has no matching active version"
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=404:
                {
                    "success": false,
                    "error": "Document not found",
                    "message": "The requested document not found"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Failed to retrieve document",
                    "details": Str
                }
    
    PATCH:
        take: {
            "document": {                    // Optional
                "name": Str,                 // Optional
                "tags": Str,                 // Optional
                "current_version": Int       // Optional (version ID)
            },
            "version": {                     // Optional
                "id": Int,                   // Required if version provided
                "description": Str,          // Optional
                "state": Str,                // Optional
                "expire_at": Str             // Optional
            }
        }
        return:
            if status=200:
                {
                    "success": true,
                    "message": "Document updated successfully",
                    "data": {
                        "document": Object,  // Updated document fields
                        "version": Object    // Updated version fields
                    }
                }
            else if status=400:
                {
                    "success": false,
                    "error": "Invalid current version" | "Invalid version",
                    "message": "The current version is not valid" | "The version is not valid"
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=404:
                {
                    "success": false,
                    "error": "Document not found",
                    "message": "The requested document not found"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Failed to update document",
                    "details": Str
                }
    
    PUT:
        take: {
            "tags": Str,                    // Optional
            "description": Str,              // Optional
            "negativity_score": Str,         // Optional
            "negativity_reason": Str,        // Optional
            "url": Str,                      // Optional
            "expire_at": Str                 // Optional
        }
        return:
            if status=201:
                {
                    "success": true,
                    "message": "New version created successfully",
                    "data": {
                        "document_id": Int,
                        "new_version_id": Int,
                        "version": Int
                    }
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=404:
                {
                    "success": false,
                    "error": "Document not found",
                    "message": "The requested document not found"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Failed to create document version",
                    "details": Str
                }
    
    DELETE:
        takes:
            {
                "versions": [Int,...] (optional, specific version IDs to delete else full document will be deleted)
            }
        return:
            if status=200:
                {
                    "success": true,
                    "message": "Document deleted successfully" | "Version deleted successfully",
                    "data": {
                        "document_id": Int,
                        "deleted_version": Int  // Only present when deleting specific version
                    }
                }
            else if status=400:
                {
                    "success": false,
                    "error": "Invalid version",
                    "message": "The version is not valid"
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=404:
                {
                    "success": false,
                    "error": "Document not found",
                    "message": "The requested document not found"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Failed to delete document/version",
                    "details": Str
                }



<----------------------- Organizational Admin ----------------------->
20.Org-Admin Dash (Admin)
    URL: base_url/api/OrgDash/
    Headers: Authorization: Bearer <access_token>
    Accepted Request(s): GET
    GET:
        return:
            if status=200:
                {
                    "success": true,
                    "data": {
                        "user": {
                            "total": Integer, // Total users in organization
                            "active": Integer  // Active users in organization
                        },
                        "current_month": String, // Current month abbreviation (e.g., "Sep")
                        "survey_engagement_rate": Float, // Percentage of survey responses (0-100)
                        "compliance_health": {
                                "total_compliance_health": Float,
                                "policy_health": Float,
                                "induction_completion": Float,
                                "policy_regulatory_alignment": Float
                            },
                        "indiction_completion_rate_monthly": {
                            // Monthly induction completion rates for last 6 months
                            // Keys are month abbreviations (e.g., "Apr", "May", "Jun", "Jul", "Aug", "Sep")
                            // Values are completion percentages (Float)
                            "Apr": 75.5,
                            "May": 82.3,
                            "Jun": 68.9,
                            "Jul": 91.2,
                            "Aug": 85.7,
                            "Sep": 78.4
                        },
                        "top_5_accessed_policy": {
                            // Policy categories with their access counts
                            // Keys are category names, values are access counts
                            "Safety Policy": 245,
                            "HR Policy": 189,
                            "IT Policy": 156,
                            "Finance Policy": 134,
                            "Compliance Policy": 98
                        },
                        "policy_health": {
                            "up_to_date": Integer, // Count of up-to-date policies
                            "expiring_soon": Integer, // Count of policies expiring within 30 days
                            "expired": Integer // Count of expired policies
                        },
                        "top_10_searched_documents": {
                            "Document name 1": Int,
                            "Document name 2": Int,.......
                        },
                        "announcements": {
                            "unseen_announcements_count": 1,
                            "announcements": [
                                {
                                    "id": int,
                                    "title": str,
                                    "message": str,
                                    "severity": str,
                                    "created_at": "2025-09-30T04:27:34.266796Z" --> time date
                                }
                            ]
                        }
                    }
                }
            else if status=400:
                {
                    "success": false,
                    "error": "No organization found",
                    "message": "User is not associated with any organization"
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Internal Server error",
                    "message": Str
                } 

21. Get All Org Documents (Admin)
    URL: base_url/documents/OrgDocuments/
    Headers: Authorization: Bearer <access_token>
    Accepted Request(s): GET
    
    GET:
        query parameters:
            type: Str (optional, filter by document type)
            category: Str (optional, filter by document category)
            status: Str (optional, filter by document status)
            state: Str (optional, filter by document state, defaults to "active")
            keyword: Str (optional, search in name, details, keyword)
        return:
            if status=200:
                {
                    "success": true,
                    "filters": {
                        "types": [
                            {
                                "name": Str,
                                "value": Str
                            }, ...
                        ],
                        "categories": [
                            {
                                "name": Str,
                                "value": Str
                            }, ...
                        ],
                        "states": [
                            {
                                "name": Str,
                                "value": Str
                            }, ...
                        ],
                        "statuses": [
                            {
                                "name": Str,
                                "value": Str
                            }, ...
                        ]
                    },
                    "documents": [
                        {
                            "id": Int,
                            "name": Str,
                            "type": Str,
                            "category": Str,
                            "state": Str,
                            "status": Str,
                            "version": Str,
                            "expire_at": Str | null
                        }, ...
                    ]
                }
            else if status=400:
                {
                    "success": false,
                    "error": "No organization found",
                    "message": "User is not associated with any organization"
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Internal Server error",
                    "message": Str
                }

23. Upload Org Documents (Admin)
    URL: base_url/documents/OrgDocumentUpload/
    Headers: Authorization: Bearer <access_token>
    Accepted Request(s): GET, POST

    GET:
        Returns:
            {
                "types":[
                    {"name": Str, "value": Str},
                    {"name": Str, "value": Str},
                    {"name": Str, "value": Str}...
                ],

                "categories":[
                    {"name": Str, "value": Str},
                    {"name": Str, "value": Str},
                    {"name": Str, "value": Str}...
                ],
            }

    POST:   
        takes:{
            "name": Str,                // required, unique
            "link": Str                 // required, unique
            "details": Str,             // optional, default "No Details"
            "category": Str,            // required, one of Document.POLICY_CATEGORY_CHOICES values
            "type": Str,                // required, one of Document.TYPE_CHOICES values
            "keywords": Str,            // optional, comma-separated tags
            "expire_at": Str|null       // optional, ISO 8601 datetime string or null
        }
        
        Response:
            if status=201:
            {
                "success": true,
                "message": "Document uploaded secsessfully"
            }

            else if status=400:
            {
                "success": false,
                "error": "Validation Error",
                "message": Str,
                "fields": { ... } // field-specific errors
            }

            else if status=401:
            {
                "success": false,
                "error": "Unauthorized",
                "message": "You are not authorized to perform this action"
            }

            else if status=500:
            {
                "success": false,
                "error": "Internal Server error",
                "message": Str
            }
 
33. Document Request Management (Org Admin)
    URL: base_url/documents/DocumentRequest/
    Headers: Authorization: Bearer <access_token>
    Accepted Request(s): GET, PATCH
    
    GET:
        return:
            if status=200:
                {
                    "success": true,
                    "message": "Document requests retrieved successfully",
                    "data": {
                        "documents": [
                            {
                                "id": Int,
                                "name": Str,
                                "type": Str,
                                "category": Str,
                                "versions": [
                                    {
                                        "id": Int,
                                        "version": Str,
                                        "description": Str,
                                        "negativity_score": Str,
                                        "negativity_reason": Str,
                                        "url": Str,
                                        "expire_at": Str,
                                        "uploaded_by": Str,  // "First Last - username"
                                        "created_at": Str,
                                        "updated_at": Str
                                    }, ...
                                ]
                            }, ...
                        ]
                    }
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Failed to retrieve document requests",
                    "details": Str,
                    "error_type": Str
                }
    
    PATCH:
        take: {
            "document_id": Int,           // Required
            "version_id": Int,            // Required
            "action": Str                 // Required ("publish")
        }
        return:
            if status=200:
                {
                    "success": true,
                    "message": "Published successfully. Awaiting approval.",
                    "data": {
                        "document_id": Int,
                        "version_id": Int
                    }
                }
            else if status=400:
                {
                    "success": false,
                    "error": "Invalid Action" | "Missing Required Fields",
                    "message": "Only 'publish' action is supported." | "document_id, version_id, and action are required."
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=404:
                {
                    "success": false,
                    "error": "Not Found",
                    "message": "The document version was not found or is not in draft state."
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Failed to update document request",
                    "details": Str,
                    "error_type": Str
                }

34. Policy Request Management (Org Admin)
    URL: base_url/documents/PolicyRequest/
    Headers: Authorization: Bearer <access_token>
    Accepted Request(s): GET, PATCH
    
    GET:
        return:
            if status=200:
                {
                    "success": true,
                    "message": "Policy requests retrieved successfully",
                    "data": {
                        "policy_requests": [
                            {
                                "document_id": Int,
                                "version_id": Int,
                                "name": Str,
                                "version": Str,
                                "description": Str,
                                "state": Str,
                                "negativity_score": Str,
                                "negativity_reason": Str,
                                "url": Str,
                                "uploaded_by": Str,  // "First Last - email"
                                "expire_at": Str,
                                "created_at": Str,
                                "updated_at": Str
                            }, ...
                        ]
                    }
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Policy request retrieval failed",
                    "details": Str
                }
    
    PATCH:
        query parameters:
            id: Int (required) // Policy request version ID
        return:
            if status=200:
                {
                    "success": true,
                    "message": "Policy request updated successfully",
                    "data": {
                        "id": Int,
                        "name": Str,
                        "version": Str,
                        "description": Str,
                        "state": Str,  // "active" for non-policy documents, "waiting_approval" for policy documents
                        "negativity_score": Str,
                        "negativity_reason": Str,
                        "url": Str
                    }
                }
            else if status=400:
                {
                    "success": false,
                    "error": "Invalid request",
                    "message": "Policy request ID is required"
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=404:
                {
                    "success": false,
                    "error": "Not Found",
                    "message": "Policy request not found or not in draft state"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Policy request update failed",
                    "details": Str
                }
                
24. Get All Organization Inductions (Admin)
    URL: base_url/induction/OrgInduction/
    Headers: Authorization: Bearer <access_token>
    Method: GET

    GET: 
    if (status=200):
    returns: {
        "success": true,
        "total_flows": Int,                // Total number of induction flows
        "active_flows": Int,               // Number of active flows (status="active")
        "draft_flows": Int,                // Number of draft flows (status="draft")
        "inductions": [
            {
                "id": Int,                     // Induction module ID
                "name": Str,                   // Flow name
                "description": Str,            // Description
                "status": Str,                 // Status ("active", "draft", etc.)
                "assigned_roles": [Str],       // List of assigned role names
                "step_count": Int,             // Number of steps in the flow
                "completion_percentage": Str   // Completion percentage as string, e.g. "75.00"
            },
            ...
        ]
    }

    Unauthorized Response (status=401):
    {
        "success": false,
        "error": "Unauthorized",
        "message": "You are not authorized to view induction flows"
    }

    Error Response (status=500):
    {
        "success": false,
        "error": "Internal Server Error",
        "message": Str
    }

25. Induction Flow Builder (Admin)
    URL: base_url/induction/CreateInduction/
    Headers: Authorization: Bearer <access_token>
    Methods: GET, POST

    GET:
        - Returns the available roles and induction status options for the organization.
        - Response (status=200):
            {
                "success": true,
                "roles": [
                    {
                        "name": Str,    // Role name
                        "value": Int    // Role ID
                    },
                    ...
                ],
                "induction_status": [
                    {
                        "name": Str,    // Status display name
                        "value": Str    // Status value (e.g., "active", "draft")
                    },
                    ...
                ]
            }
        - Error Response (status=500):
            {
                "success": false,
                "error": "Internal Server Error",
                "message": Str
            }

    POST:
        - Creates a new induction flow for the organization.
        - Request body:
            {
                "name": Str,             
                "description": Str,             // Induction description
                "expires_at": DateTimeField,    // Induction expiry date (optional)
                "status": Str,                  // Induction status (e.g., "active", "draft")
                "roles": [Int, ...],            // List of role IDs to assign induction to

                "steps": [
                    {
                        "order_index": Int,     // Step order (e.g., 1, 2, ...)
                        "title": Str,           // Step title
                        "description": Str,     // Step description
                        "link": Str,            // Resource link (optional)
                        "image_file": Str,      // Image file (optional)
                        "document_id": Int      // Document assigned to the step (optional)
                    },
                    ...
                ]
            }
        - Success Response (status=201):
            {
                "success": true,
                "message": "Induction created successfully"
            }
        - Validation Error Response (status=400):
            {
                "success": false,
                "error": "Invalid data",
                "details": { ... } // Validation errors
            }
        - Role Not Found Error (status=400):
            {
                "success": false,
                "error": "Role not found",
                "details": "Role not found"
            }
        - Error Response (status=500):
            {
                "success": false,
                "error": "Internal Server Error",
                "message": Str
            }
                 
26. Get All Organization Surveys (Admin)
    URL: base_url/surveys/OrgSurveys/
    Headers: Authorization: Bearer <access_token>
    Method: GET

    GET: 
    if (status=200):
    returns: {
        "success": true,
        "total_surveys": Int,
        "response_rate": float,
        "total_response": Int,
        "surveys": [
            {
                "id": Int,  
                "name": Str,
                "details": Str,         
                "status": Str,           
                "types": Str,
                "total_assign": int,
                "total_response": int,
                "response_rate": float,
            },
            ...
        ]
    }

    Unauthorized Response (status=401):
    {
        "success": false,
        "error": "Unauthorized",
        "message": "You are not authorized to view organization surveys"
    }

    Error Response (status=500):
    {
        "success": false,
        "error": "Internal Server Error",
        "message": Str
    }
                 
27. New Survey Creation (Admin)
    URL: base_url/surveys/CreateSurvey/
    Headers: Authorization: Bearer <access_token>
    Methods: GET, POST

    GET:
        - Returns available survey config for the organization.
        - Response (status=200):
            {
                "success": true,
                "survey_types": [
                    {
                        "name": Str,
                        "value": Str
                    },
                    ...
                ],
                "survey_status": [
                    {
                        "name": Str,
                        "value": Str
                    },
                    ...
                ],
                "question_type": [
                    {
                        "name": Str,    // Status display name
                        "value": Str    // Status value (e.g., "active", "draft")
                    },
                    ...
                ],
                "survey_status": [
                    { "name": Str, "value": Str }, ...
                ],
                "question_type": [
                    { "name": Str, "value": Str }, ...
                ]
            }
        - Error Response (status=500):
            {
                "success": false,
                "error": "Internal Server Error",
                "message": Str
            }

    POST:
        - Creates a new survey with nested questions (and options for choice questions).
        - Request body:
            {
                "name": Str,
                "details": Str,
                "type": Str,                    // One of Survey.TYPE_CHOICES
                "status": Str,                  // One of Survey.STATUS_CHOICES
                "expires_at": DateTime | null,

                "questions": [
                    {
                        "order_index": Int,
                        "question_text": Str,
                        "type": Str,            // One of QUESTION_TYPE_CHOICES
                        "options": [            // Required only for SingleChoice/MultiChoice
                            { "order_index": Int, "option_text": Str },
                            ...
                        ]
                    },
                    ...
                ]
            }
        - Success Response (status=201):
            {
                "success": true,
                "message": "Survey created successfully"
            }
        - Validation Error Response (status=400):
            {
                "success": false,
                "error": "Invalid data",
                "details": { ... } // Validation errors
            }
        - Error Response (status=500):
            {
                "success": false,
                "error": "Internal Server Error",
                "message": Str
            }
    
28. User Management (Admin)
    URL: base_url/core/UserManagement/
    Headers: Authorization: Bearer <access_token>
    Methods: GET, POST

    GET:
        query parameters:
            role = Str          // Optional - filter by role name
            is_active = Bool    // Optional - filter by active status
            keyword = Str       // Optional - search in name/email

        returns: 
            if status=200:
                {
                    "success": true,
                    "filters": {
                        "roles": [
                            {
                                "name": Str,
                                "value": Str
                            }, ...
                        ],
                        "is_active": [
                            {
                                "name": "Active",
                                "value": true
                            },
                            {
                                "name": "Inactive", 
                                "value": false
                            }
                        ]
                    },
                    "total_users": Int,
                    "active_users": Int,
                    "users": [
                        {
                            "id": Int,
                            "first_name": Str,
                            "last_name": Str,
                            "email": Str,
                            "role_name": Str,
                            "last_login": Str,
                            "is_active": Bool
                        }, ...
                    ]
                }
            else if status=400:
                {
                    "success": false,
                    "error": "No organization found",
                    "message": "User is not associated with any organization"
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Internal Server error",
                    "message": Str
                }
    
    
    POST:
        take: {
            "first_name": Str,
            "last_name": Str,
            "email": Str,
            "role": Int  // Role ID
        }
        return:
            if status=201:
                {
                    "success": true,
                    "message": "User created successfully",
                    "email": Str,
                    "password": Str
                }
            else if status=400:
                {
                    "success": false,
                    "error": "Validation failed",
                    "details": {
                        "field_name": ["error_message"]
                    }
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Internal Server error",
                    "message": Str
                }

29. Role Management (Admin)
    URL: base_url/core/RoleManagement/
    Headers: Authorization: Bearer <access_token>
    Methods: GET, POST

    GET:
        return:
            if status=200:
                {
                    "success": true,
                    "total_roles": Int,
                    "roles": [
                        {
                            "id": Int,
                            "name": Str,
                            "description": Str,
                            "assigned_users": Int
                        }, ...
                    ]
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Internal Server error",
                    "message": Str
                }

    POST:
        take: {
            "name": Str,
            "description": Str
        }
        return:
            if status=201:
                {
                    "success": true,
                    "message": "Role created successfully",
                    "name": Str
                }
            else if status=400:
                {
                    "success": false,
                    "error": "Validation failed",
                    "details": {
                        "field_name": ["error_message"]
                    }
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Internal Server error",
                    "message": Str
                }

30. Assign Role (Admin)
    URL: base_url/core/AssignRole/
    Headers: Authorization: Bearer <access_token>
    Methods: POST

    POST:
        take: {
            "users": [Int, Int, ...],  // Array of user IDs
            "role": Int  // Role ID
        }
        return:
            if status=200:
                {
                    "success": true,
                    "message": "Roles assigned successfully",
                    "role": {
                        "id": Int,
                        "name": Str
                    },
                    "assigned_users": [
                        {
                            "id": Int,
                            "first_name": Str,
                            "last_name": Str,
                            "email": Str
                        }, ...
                    ]
                }
            else if status=400:
                {
                    "success": false,
                    "error": "Invalid Request",
                    "message": "'users' and 'role' are required."
                }
            else if status=404:
                {
                    "success": false,
                    "error": "Not Found",
                    "message": "No valid users found in your organization."
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Internal Server error",
                    "message": Str
                }

31. Organization Profile (Admin)
    URL: base_url/organizations/OrgProfile/
    Headers: Authorization: Bearer <access_token>
    Methods: GET, PATCH

    GET:
        return:
            if status=200:
                {
                    "success": true,
                    "data": {
                        "name": Str,
                        "type": Str,
                        "contact_name": Str,
                        "contact_email": Str,
                        "contact_phone": Str,
                        "time_zone": Str,
                        "location": Str,
                        "language": Str,
                        "logo": Str,
                        "primary_color": Str,
                        "secondary_color": Str,
                        "policy_expiry_alerts": Bool,
                        "new_compliance_alerts": Bool,
                        "new_survey_responses": Bool,
                        "user_onboarding_progress": Bool,
                        "policy_updates_and_new_documents": Bool,
                        "training_reminders": Bool
                    }
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Internal Server Error",
                    "message": Str
                }

    PATCH:
        take: {
            "name": Str,
            "type": Str,
            "contact_name": Str,
            "contact_email": Str,
            "contact_phone": Str,
            "time_zone": Str,
            "location": Str,
            "language": Str,
            "logo": Str,
            "primary_color": Str,
            "secondary_color": Str,
            "policy_expiry_alerts": Bool,
            "new_compliance_alerts": Bool,
            "new_survey_responses": Bool,
            "user_onboarding_progress": Bool,
            "policy_updates_and_new_documents": Bool,
            "training_reminders": Bool
        }
        return:
            if status=200:
                {
                    "success": true,
                    "message": "Organization profile updated successfully"
                }
            else if status=400:
                {
                    "success": false,
                    "error": "Validation failed",
                    "details": { /* validation errors object */ }
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Internal Server Error",
                    "message": Str
                }

32. Organization Logs (Admin)
    URL: base_url/api/OrganizationLogs/
    Headers: Authorization: Bearer <access_token>
    Methods: GET

    GET:
        query:
            from: Str (DateTime ISO format)
            to: Str (DateTime ISO format)
            action: Str (optional) // Log action type (e.g., "CREATE", "ERROR")
            sys_only: Bool (optional) // If true, only system logs
            keyword: Str (optional) // Search in message, actor name, email, related fields, or IP address
        return:
            if status=200:
                {
                    "success": true,
                    "data": [
                        {
                            "id": Int,
                            "date_time": Str,
                            "action": Str,
                            "actor_name": Str,
                            "email": Str,
                            "message": Str,
                            "ip_address": Str
                        },
                        // ...
                    ]
                }
            else if status=500:
                {
                    "success": false,
                    "error": Str
                }

33. Admin Compliance (Admin)
    URL: base_url/api/AdminCompliance/
    Headers: Authorization: Bearer <access_token>
    Methods: GET

    GET:
        return:
            if status=200:
                {
                    "success": true,
                    "message": "Admin compliance retrieved successfully",
                    "data": {
                        "induction_completion_rate": Float,  // Overall induction completion percentage
                        "documents_health": {
                            "by_category": {
                                "category_name": {
                                    "up_to_date": Int,      // Count of up-to-date documents
                                    "expiring_soon": Int,   // Count of documents expiring within 30 days
                                    "expired": Int          // Count of expired documents
                                }, ...
                            },
                            "average": {
                                "up_to_date": Float,       // Average up-to-date count across categories
                                "expiring_soon": Float,    // Average expiring soon count across categories
                                "expired": Float           // Average expired count across categories
                            }
                        },
                        "policy_regulatory_alignment": {
                            "by_category": {
                                "category_name": Float,    // Regulatory alignment score (0-100)
                                ...
                            },
                            "average": Float               // Average regulatory alignment across all categories
                        },
                        "unresolved_messages": Int,        // Count of unresolved seaport messages
                        "user_seaport_messages": [
                            {
                                "id": Int,
                                "topic": Str,              // Message topic (technical_issue, policy_clarification, etc.)
                                "message": Str,            // Message content
                                "created_at": Str,         // ISO datetime
                                "responded_by": Int|null,  // User ID who responded (null if unresolved)
                                "responded_at": Str|null   // Response datetime (null if unresolved)
                            }, ...
                        ]
                    }
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Admin compliance retrieval failed",
                    "details": Str
                }



<--------------------- Supper Admin ---------------->
34. Get All Meetings (Super admin)
    URL: base_url/meetings/AllMeetings/
    Headers: Authorization: Bearer <access_token>
    Accepted Request(s): GET, POST, DELETE
    GET:
        query parameters:
            from: Str (optional, filter by start date)
            to: Str (optional, filter by end date)
            goal: Str (optional, filter by goal)
            status: Str (optional, filter by status)
            assigned_to: Int (optional, filter by assigned user)
            keyword: Str (optional, search in title, email, phone)
        return:
            if status=200:
                {
                    "success": true,
                    "message": "Meetings fetched successfully",
                    "data": {
                        "filters": {
                            "goal": [
                                {
                                    "name": Str,
                                    "value": Str
                                },.....
                            ],
                            
                            "status": [
                                {
                                    "name": Str,
                                    "value": Str
                                },.....
                            ]
                        },

                        "meetings": [
                            {
                                "id": Int,
                                "title": Str,
                                "goal": Str,
                                "start_time": Str,
                                "end_time": Str,
                                "status": Str
                            }, ...
                        ]

                    }
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Failed to fetch meetings",
                    "details": "Error message"
                }

    POST:
        take: {
            "title": Str,                   // Optional
            "description": Str,             // Optional
            "goal": Str,                    // Optional
            "status": Str,                  // Optional
            "requester_name": Str,          // Optional
            "phone": Str,                   // Optional
            "email": Str,                   // Optional
            "start_time": Str,              // Optional
            "end_time": Str,                // Optional
            "time_zone": Str,               // Optional
            "assigned_to": Int,             // Optional
            "meeting_link": Str,            // Optional
        }
        return:
            if status=200:
                {
                    "success": true,
                    "message": "Meeting created successfully",
                    "data": {
                        "id": Int,
                        "title": Str,
                        "description": Str,
                        "goal": Str,
                        "status": Str,
                        "requester_name": Str,
                        "phone": Str,
                        "email": Str,
                        "start_time": Str,
                        "end_time": Str,
                        "time_zone": Str,
                        "assigned_to": Int,
                        "meeting_link": Str,
                        "created_by": Int,
                        "organization": Int,
                        "created_at": Str,
                        "updated_at": Str
                    }
                }
            else if status=400:
                {
                    "success": false,
                    "error": "Invalid data",
                    "details": "Validation errors"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Failed to create meeting",
                    "details": "Error message"
                }
    
    DELETE:
        take: {
            "ids": [Int, Int, ...]
        }
        return:
            if status=200:
                {
                    "success": true,
                    "message": "Meeting deleted successfully",
                    "data": "[Int, Int, ...] deleted"
                }
            else if status=400:
                {
                    "success": false,
                    "error": "Invalid data",
                    "details": "Provide a non-empty list of ids"
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Failed to delete meeting",
                    "details": "Error message"
                }
        
35. Meeting --> Single (Super admin)
    URL: base_url/meetings/Meeting/<int:id>
    Headers: Authorization: Bearer <access_token>
    Accepted Request(s): GET, PATCH
    GET:
        return:
            if status=200:
                {
                    "success": true,
                    "message": "Meeting fetched successfully",
                    "data": {
                        "title": Str,
                        "description": Str,
                        "status": Str,
                        "goal": Str,
                        "requester_name": Str,
                        "phone": Str,
                        "email": Str,
                        "start_time": Str,
                        "end_time": Str,
                        "time_zone": Str,
                        "assigned_to": {
                            "id": Int,
                            "name": Str,
                            "email": Str
                        } or null,
                        "meeting_link": Str,
                        "created_at": Str,
                        "updated_at": Str,
                        "created_by": {
                            "id": Int,
                            "name": Str,
                            "email": Str
                        } or null,
                        "organization": {
                            "id": Int,
                            "name": Str,
                            "email": Str
                        } or null
                    }
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=404:
                {
                    "success": false,
                    "error": "Meeting not found",
                    "details": "Meeting with id {id} does not exist"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Failed to fetch meeting",
                    "details": "Error message"
                }
    
    PATCH:
        take: {
            "start_time": Str,              // Optional
            "status": Str,                  // Optional
            "assigned_to": Int,             // Optional
            "meeting_link": Str             // Optional
        }
        return:
            if status=200:
                {
                    "success": true,
                    "message": "Meeting updated successfully",
                    "data": {
                        "id": Int,
                        "title": Str,
                        "description": Str,
                        "status": Str,
                        "goal": Str,
                        "requester_name": Str,
                        "phone": Str,
                        "email": Str,
                        "start_time": Str,
                        "end_time": Str,
                        "time_zone": Str,
                        "assigned_to": Int,
                        "meeting_link": Str,
                        "created_at": Str,
                        "created_by": Int,
                        "organization": Int,
                        "updated_at": Str
                    }
                }
            else if status=400:
                {
                    "success": false,
                    "error": "Invalid data",
                    "details": "Validation errors"
                }
            else if status=401:
                {
                    "success": false,
                    "error": "Unauthorized",
                    "message": "You are not authorized to access this resource"
                }
            else if status=404:
                {
                    "success": false,
                    "error": "Meeting not found",
                    "details": "Meeting with id {id} does not exist"
                }
            else if status=500:
                {
                    "success": false,
                    "error": "Failed to update meeting",
                    "details": "Error message"
                }

// ========================================
// MISSING ENDPOINTS - ADDED FROM VIEWS.PY ANALYSIS
// ========================================

25. User Registration
    URL: base_url/core/register/
    Method: POST
    Request: {
        "username": "abdul",
        "email": "abdul@softvence.com", 
        "password": "password123",
        "first_name": "Abdul",
        "last_name": "Hafeez"
    }
    Response: {
        "success": true,
        "message": "User registered successfully",
        "user_id": Int
    }

26. Change Password
    URL: base_url/core/ChangePassword/
    Headers: Authorization: Bearer <access_token>
    Method: POST
    Request: {
        "old_password": "oldpass",
        "new_password": "newpass"
    }
    Response: {
        "success": true,
        "message": "Password changed successfully"
    }

27. Document Version Download
    URL: base_url/documents/OrgDocuments/<int:doc_id>/
    Headers: Authorization: Bearer <access_token>
    Method: GET
    Response: File download (PDF/DOC)

28. Document Version Download (Specific Version)
    URL: base_url/documents/OrgDocuments/<int:doc_id>/<int:version_id>/
    Headers: Authorization: Bearer <access_token>
    Method: GET
    Response: File download (PDF/DOC)

29. Document Category and Type Choices
    URL: base_url/documents/categoryType/
    Method: GET
    Response: {
        "categories": [...],
        "types": [...]
    }

30. Most Used Document
    URL: base_url/documents/most-used-document/
    Headers: Authorization: Bearer <access_token>
    Method: GET
    Response: {
        "documents": [...]
    }

31. Document Management (Single Document)
    URL: base_url/documents/DocumentManage/<int:id>/
    Headers: Authorization: Bearer <access_token>
    Method: GET/PATCH/PUT/DELETE
    GET Response: Document details
    PATCH/PUT Request: Document updates
    DELETE Response: {"success": true, "message": "Document deleted"}

32. Document Request Management
    URL: base_url/documents/DocumentRequest/
    Headers: Authorization: Bearer <access_token>
    Method: GET/PATCH
    GET Response: Document requests list
    PATCH Request: Request updates

33. Policy Statistics
    URL: base_url/documents/PolicyStats/
    Headers: Authorization: Bearer <access_token>
    Method: GET
    Response: {
        "total_policies": Int,
        "read_policies": Int,
        "unread_policies": Int
    }

34. Document Ratings
    URL: base_url/documents/Ratings/
    Headers: Authorization: Bearer <access_token>
    Method: GET/POST/PATCH/DELETE
    POST Request: {"document_id": Int, "rating": Int, "comment": "..."}
    Response: {"success": true, "rating_id": Int}

35. Version Management
    URL: base_url/documents/Version/
    Headers: Authorization: Bearer <access_token>
    Method: GET/DELETE/PATCH
    GET Response: Document versions list
    DELETE/PATCH: Version management

36. Organization Documents (List/Create)
    URL: base_url/documents/OrgDocuments/
    Headers: Authorization: Bearer <access_token>
    Method: GET/POST
    GET Response: Organization documents list
    POST Request: Document creation data

37. JWT Token Obtain
    URL: base_url/api/token/
    Method: POST
    Request: {"username": "user", "password": "pass"}
    Response: {
        "access": "jwt_access_token",
        "refresh": "jwt_refresh_token"
    }

38. JWT Token Refresh
    URL: base_url/api/getNewAccessToken/
    Method: POST
    Request: {"refresh": "jwt_refresh_token"}
    Response: {
        "access": "new_jwt_access_token"
    }

39. User Support Message
    URL: base_url/communication/SaveSeaportMassage/
    Headers: Authorization: Bearer <access_token>
    Method: GET/POST
    GET Response: Topic choices
    POST Request: {"topic": "topic_id", "message": "..."}

40. Most Token Used
    URL: base_url/ai/most-token-used/
    Headers: Authorization: Bearer <access_token>
    Method: GET
    Response: Most used token types

41. Token Used (List/Record)
    URL: base_url/ai/TokenCount/
    Headers: Authorization: Bearer <access_token>
    Method: GET/POST
    GET Response: Token types list
    POST Request: Token usage data

42. User Chat History
    URL: base_url/ai/ChatHistory/
    Headers: Authorization: Bearer <access_token>
    Method: GET
    Response: {
        "chat_history": [...],
        "remaining_tokens": Int
    }

43. Key Feature Management
    URL: base_url/subscriptions/feature/
    Headers: Authorization: Bearer <access_token>
    Method: GET/POST
    GET Response: Key features list
    POST Request: Feature creation data

44. Key Feature Detail
    URL: base_url/subscriptions/feature/<int:pk>/
    Headers: Authorization: Bearer <access_token>
    Method: GET/PUT/DELETE
    GET Response: Feature details
    PUT Request: Feature updates
    DELETE Response: {"success": true}

45. Plan Detail
    URL: base_url/subscriptions/plan/<int:pk>/
    Headers: Authorization: Bearer <access_token>
    Method: GET/DELETE/PUT
    GET Response: Plan details
    PUT Request: Plan updates
    DELETE Response: {"success": true}

46. Plan Management (CRUD)
    URL: base_url/subscriptions/plan/
    Headers: Authorization: Bearer <access_token>
    Method: GET/POST
    GET Response: Plans list
    POST Request: Plan creation data

47. Cancel Subscription
    URL: base_url/subscriptions/cancel/
    Headers: Authorization: Bearer <access_token>
    Method: POST
    Request: {"subscription_id": Int}
    Response: {"success": true, "message": "Subscription cancelled"}

48. Subscription Management
    URL: base_url/subscriptions/subscription/
    Headers: Authorization: Bearer <access_token>
    Method: GET/POST
    GET Response: Subscriptions list
    POST Request: Subscription creation data

49. Subscription Update
    URL: base_url/subscriptions/subscription/<int:pk>/update/
    Headers: Authorization: Bearer <access_token>
    Method: PUT
    Request: Subscription updates
    Response: Updated subscription data

50. Plans API View (Super Admin)
    URL: base_url/subscriptions/plans-api-view/
    Headers: Authorization: Bearer <access_token>
    Method: GET/POST
    GET Response: All plans
    POST Request: Plan creation

51. Plans API View Detail (Super Admin)
    URL: base_url/subscriptions/plans-api-view/<int:pk>/
    Headers: Authorization: Bearer <access_token>
    Method: GET/PUT/DELETE
    GET Response: Plan details
    PUT Request: Plan updates
    DELETE Response: {"success": true}

52. Promo Codes Management
    URL: base_url/subscriptions/promocodes/
    Headers: Authorization: Bearer <access_token>
    Method: GET/POST
    GET Response: Promo codes list
    POST Request: Promo code creation

53. Promo Code Detail
    URL: base_url/subscriptions/promocodes/<int:pk>/
    Headers: Authorization: Bearer <access_token>
    Method: GET/PUT/DELETE
    GET Response: Promo code details
    PUT Request: Promo code updates
    DELETE Response: {"success": true}

54. Manage Survey (Admin)
    URL: base_url/surveys/ManageSurvey/<int:id>/
    Headers: Authorization: Bearer <access_token>
    Method: GET
    Response: Survey management details

55. Payment Success
    URL: base_url/payment/success/
    Method: GET
    Response: Payment success page

56. Payment View
    URL: base_url/payment/
    Method: GET/POST
    Response: Payment interface

57. Stripe Webhook
    URL: base_url/payment/StripeResponse/
    Method: POST
    Request: Stripe webhook data
    Response: {"success": true}

58. Organization List (Super Admin)
    URL: base_url/organizations/
    Headers: Authorization: Bearer <access_token>
    Method: GET
    Response: Organizations list

59. Organization Update (Super Admin)
    URL: base_url/organizations/update/<int:pk>/
    Headers: Authorization: Bearer <access_token>
    Method: PUT
    Request: Organization updates
    Response: Updated organization

60. Organization Delete (Super Admin)
    URL: base_url/organizations/delete/<int:pk>/
    Headers: Authorization: Bearer <access_token>
    Method: DELETE
    Response: {"success": true}

61. Organization Dashboard (Super Admin)
    URL: base_url/organizations/organization-dashboard/
    Headers: Authorization: Bearer <access_token>
    Method: GET
    Response: Organization statistics

62. Organizations Overview (Super Admin)
    URL: base_url/organizations/organizations-overview/
    Headers: Authorization: Bearer <access_token>
    Method: GET
    Response: Organizations overview data

63. Organization Detail (Super Admin)
    URL: base_url/organizations/organizations-overview/<int:pk>/
    Headers: Authorization: Bearer <access_token>
    Method: GET
    Response: Specific organization details

64. Log Dashboard
    URL: base_url/logs/dashboard/
    Headers: Authorization: Bearer <access_token>
    Method: GET
    Response: Log dashboard HTML

65. Log API
    URL: base_url/logs/api/logs/
    Headers: Authorization: Bearer <access_token>
    Method: GET
    Response: Logs list with filtering

66. Log Statistics
    URL: base_url/logs/api/stats/
    Headers: Authorization: Bearer <access_token>
    Method: GET
    Response: Log statistics

67. Organization Logs
    URL: base_url/logs/OrganizationLogs/
    Headers: Authorization: Bearer <access_token>
    Method: GET
    Response: Organization-specific logs

68. Log Management
    URL: base_url/logs/OrganizationLogs/<int:id>/
    Headers: Authorization: Bearer <access_token>
    Method: GET
    Response: Specific log entry details

69. Platform Notifications (Super Admin)
    URL: base_url/notifications/
    Headers: Authorization: Bearer <access_token>
    Method: GET/POST
    GET Response: Notifications list
    POST Request: Notification creation

70. Platform Notification Detail (Super Admin)
    URL: base_url/notifications/<int:pk>/
    Headers: Authorization: Bearer <access_token>
    Method: GET/PUT/PATCH/DELETE
    GET Response: Notification details
    PUT/PATCH Request: Notification updates
    DELETE Response: {"success": true}

71. Maintenance Announcements (Super Admin)
    URL: base_url/notifications/maintenance/
    Headers: Authorization: Bearer <access_token>
    Method: GET/POST
    GET Response: Maintenance announcements list
    POST Request: Maintenance announcement creation

72. Maintenance Announcement Detail (Super Admin)
    URL: base_url/notifications/maintenance/<int:pk>/
    Headers: Authorization: Bearer <access_token>
    Method: GET/PUT/PATCH/DELETE
    GET Response: Maintenance announcement details
    PUT/PATCH Request: Maintenance announcement updates
    DELETE Response: {"success": true}

73. Forget Password (Any)
    URL: base_url/core/ForgetPassword/
    Method: POST
    Request: {
        "email": "user@example.com",
        "otp": "123456",
        "new_password": "newpassword123"
    }
    Response: {
        "success": true,
        "message": "Password changed successfully"
    }

74. Role-User Assignment (Admin and User)
    URL: base_url/core/RoleUserAssignment/
    Headers: Authorization: Bearer <access_token>
    Method: PATCH
    Request: {
        "roles": [Int, Int, ...],           // Optional - Array of role IDs
        "users": [Int, Int, ...],           // Optional - Array of user IDs
        "inductions": [Int, Int, ...],      // Optional - Array of induction IDs
        "surveys": [Int, Int, ...],         // Optional - Array of survey IDs
        "permissions": [Int, Int, ...]      // Optional - Array of permission IDs
    }
    Response: {
        "success": true,
        "message": "Assignment successful"
    }
    Error Responses:
        - 400: "Users not found" | "Role not found" | "Only one role can be assigned to users" | "Permissions not found or not accessible" | "What to assign to users?" | "What to assign to roles?" | "Missing assignment target"
        - 401: "Unauthorized"
        - 500: "Role assignment failed"
    
    Note: This endpoint supports multiple assignment scenarios:
    1. Assign users to a single role
    2. Assign permissions to users
    3. Assign inductions to roles
    4. Assign surveys to roles
    5. Assign permissions to roles

// ========================================
// END OF MISSING ENDPOINTS
// ========================================