{"info":{"_postman_id":"eaca26c0-1192-42db-87da-dcbf5cf4052d","name":"IdeaForge MERN SaaS API","description":"<html><head></head><body><h1 id=\"ideaforge-mern-saas-api\">IdeaForge MERN SaaS API</h1>\n<p><strong>IdeaForge</strong> is a full-stack MERN SaaS productivity platform that helps teams manage projects, tasks, meetings, notifications, and analytics — all in one place. The backend is built with <strong>Node.js</strong>, <strong>Express.js</strong>, <strong>MongoDB/Mongoose</strong>, <strong>JWT cookie-based authentication</strong>, and supports <strong>Google OAuth</strong> for third-party sign-in and productivity integrations (Gmail, Google Calendar).</p>\n<hr>\n<h2 id=\"base-url\">Base URL</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Environment</th>\n<th>URL</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Production</td>\n<td><code>https://crmideaforge.onrender.com</code></td>\n</tr>\n</tbody>\n</table>\n</div><p>All endpoints are prefixed with <code>/api</code>. Set the <code>baseUrl</code> collection variable to <code>https://crmideaforge.onrender.com</code> before running requests.</p>\n<hr>\n<h2 id=\"authentication\">Authentication</h2>\n<p>IdeaForge uses <strong>HTTP-only JWT cookies</strong> for session management.</p>\n<ul>\n<li><strong>Register</strong> (<code>POST /api/users</code>) or <strong>Login</strong> (<code>POST /api/users/login</code>) sets a cookie named <code>jwt</code> automatically in your browser or Postman cookie jar.</li>\n<li>All <strong>protected routes</strong> require this cookie to be present. Postman sends it automatically once set.</li>\n<li><strong>In Postman:</strong> Run <strong>Register User</strong> or <strong>Login User</strong> first. The <code>jwt</code> cookie will be stored and sent with all subsequent requests automatically.</li>\n<li>To end a session, call <strong>Logout User</strong> (<code>POST /api/users/logout</code>), which clears the cookie.</li>\n</ul>\n<blockquote>\n<p><strong>Note:</strong> Google Gmail and Google Calendar routes additionally require the user to have completed <strong>Google OAuth sign-in</strong> via <code>GET /api/auth/google</code> before use.</p>\n</blockquote>\n<hr>\n<h2 id=\"collection-variables\">Collection Variables</h2>\n<p>The following variables are defined at the collection level. Copy IDs from create/list responses and paste them into your Postman environment or collection variables:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Variable</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>baseUrl</code></td>\n<td>Base URL of the API (e.g. <code>https://crmideaforge.onrender.com</code>)</td>\n</tr>\n<tr>\n<td><code>projectId</code></td>\n<td>ID of a project — copy from Create Project or List Projects response</td>\n</tr>\n<tr>\n<td><code>taskId</code></td>\n<td>ID of a task — copy from Create Task or List Tasks response</td>\n</tr>\n<tr>\n<td><code>teamId</code></td>\n<td>ID of a team — copy from Create Team or List My Teams response</td>\n</tr>\n<tr>\n<td><code>meetingId</code></td>\n<td>ID of a meeting — copy from Create Meeting or List Meetings response</td>\n</tr>\n<tr>\n<td><code>notificationId</code></td>\n<td>ID of a notification — copy from List Notifications response</td>\n</tr>\n<tr>\n<td><code>memberUserId</code></td>\n<td>User ID of a team member — copy from team member list response</td>\n</tr>\n</tbody>\n</table>\n</div><hr>\n<h2 id=\"recommended-testing-order\">Recommended Testing Order</h2>\n<p>Follow this sequence for a smooth end-to-end test run:</p>\n<ol>\n<li><strong>Health Check</strong> — Verify the API is live</li>\n<li><strong>Register User</strong> or <strong>Login User</strong> — Establish your session (sets <code>jwt</code> cookie)</li>\n<li><strong>Create Project</strong> — Save the returned <code>_id</code> as <code>projectId</code></li>\n<li><strong>Create Task</strong> — Save the returned <code>_id</code> as <code>taskId</code></li>\n<li><strong>Create Meeting</strong> — Save the returned <code>_id</code> as <code>meetingId</code></li>\n<li><strong>Create Team</strong> — Save the returned <code>_id</code> as <code>teamId</code></li>\n<li><strong>Dashboard Stats / Reports</strong> — View aggregated analytics</li>\n<li><strong>Global Search</strong> — Test cross-entity search</li>\n<li><strong>Notifications</strong> — List and mark notifications as read</li>\n<li><strong>Google OAuth</strong> <em>(optional)</em> — Sign in with Google, then test Gmail and Calendar routes</li>\n</ol>\n<hr>\n<h2 id=\"feature-groups\">Feature Groups</h2>\n<p>This collection is organized into 11 folders:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Folder</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Health</strong></td>\n<td>API liveness check</td>\n</tr>\n<tr>\n<td><strong>Authentication</strong></td>\n<td>Register, login, profile, logout</td>\n</tr>\n<tr>\n<td><strong>Google OAuth</strong></td>\n<td>Google sign-in and OAuth debug</td>\n</tr>\n<tr>\n<td><strong>Projects</strong></td>\n<td>Full CRUD for projects</td>\n</tr>\n<tr>\n<td><strong>Tasks</strong></td>\n<td>Full CRUD for tasks with filters</td>\n</tr>\n<tr>\n<td><strong>Meetings</strong></td>\n<td>Full CRUD for meetings</td>\n</tr>\n<tr>\n<td><strong>Teams</strong></td>\n<td>Team management and member roles</td>\n</tr>\n<tr>\n<td><strong>Dashboard &amp; Reports</strong></td>\n<td>Aggregated stats and report data</td>\n</tr>\n<tr>\n<td><strong>Notifications</strong></td>\n<td>List and mark notifications</td>\n</tr>\n<tr>\n<td><strong>Search</strong></td>\n<td>Global cross-entity search</td>\n</tr>\n<tr>\n<td><strong>Google Productivity</strong></td>\n<td>Gmail and Google Calendar integration</td>\n</tr>\n</tbody>\n</table>\n</div><hr>\n<h2 id=\"evaluation-notes\">Evaluation Notes</h2>\n<p>This API collection demonstrates the following capabilities:</p>\n<ul>\n<li><strong>CRUD Operations</strong> — Full create, read, update, and delete across Projects, Tasks, Meetings, and Teams</li>\n<li><strong>Authentication</strong> — Secure HTTP-only JWT cookie-based login and registration</li>\n<li><strong>Protected Routes</strong> — All core endpoints require an active session cookie</li>\n<li><strong>MongoDB Relationships</strong> — Tasks reference Projects and Teams; Meetings reference Teams; Notifications reference Users</li>\n<li><strong>Team Role Access Control</strong> — Member roles can be updated per team, enabling role-aware collaboration</li>\n<li><strong>Third-Party OAuth Integration</strong> — Google OAuth 2.0 for sign-in, Gmail access, and Google Calendar integration</li>\n<li><strong>Deployment Readiness</strong> — Hosted on Render at <code>https://crmideaforge.onrender.com</code> with a production-ready configuration</li>\n</ul>\n<blockquote>\n<p>This collection is structured for evaluator review. Each folder groups related endpoints logically, and every request includes descriptive documentation, example payloads, and expected responses.</p>\n</blockquote>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[{"content":"IdeaForge MERN SaaS API","slug":"ideaforge-mern-saas-api"}],"owner":"50839203","collectionId":"eaca26c0-1192-42db-87da-dcbf5cf4052d","publishedId":"2sBXqKoKkY","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"publishDate":"2026-05-02T05:14:41.000Z"},"item":[{"name":"Health","item":[{"name":"API Health Check","id":"bd5ca60d-c3c8-475f-80a2-9f4ca6219caa","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://crmideaforge.onrender.com/api","description":"<h2 id=\"api-health-check\">API Health Check</h2>\n<p><strong>Purpose:</strong> Verify that the IdeaForge API server is running and reachable. Use this as the very first request in any test run.</p>\n<p><strong>Method &amp; Path:</strong> <code>GET /api</code></p>\n<p><strong>Authentication Required:</strong> No</p>\n<p><strong>Request Body:</strong> None</p>\n<hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET https://crmideaforge.onrender.com/api\n</code></pre><h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"IdeaForge API is running\"\n}\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>503 Service Unavailable</code></td>\n<td>Server is down or still starting up (Render cold start)</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api"],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"bd5ca60d-c3c8-475f-80a2-9f4ca6219caa"}],"id":"76ae6a3e-0cff-4538-8026-f3cd6b788798","description":"<h2 id=\"health\">Health</h2>\n<p>Contains a single endpoint to verify that the IdeaForge API server is running and reachable.</p>\n<p>Use this as the first request in any test run to confirm the backend is live before proceeding with authenticated routes.</p>\n<p><strong>Authentication required:</strong> No</p>\n<p><strong>Endpoints:</strong></p>\n<ul>\n<li><code>GET /api</code> — API Health Check</li>\n</ul>\n","_postman_id":"76ae6a3e-0cff-4538-8026-f3cd6b788798"},{"name":"Authentication","item":[{"name":"Register User","id":"bf21277e-e9e3-4406-94eb-afc2e1a8a9c3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"name\": \"Demo Evaluator\",\n  \"email\": \"demo@gmail.com\",\n  \"password\": \"Demo@123\"\n}"},"url":"https://crmideaforge.onrender.com/api/users","description":"<h2 id=\"register-user\">Register User</h2>\n<p><strong>Purpose:</strong> Create a new user account. On success, sets an HTTP-only <code>jwt</code> cookie that authenticates all subsequent requests.</p>\n<p><strong>Method &amp; Path:</strong> <code>POST /api/users</code></p>\n<p><strong>Authentication Required:</strong> No</p>\n<p><strong>Request Body:</strong> <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Full name of the user</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Unique email address</td>\n</tr>\n<tr>\n<td><code>password</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Password (min 6 characters)</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"name\": \"Alex Johnson\",\n  \"email\": \"alex@example.com\",\n  \"password\": \"securePass123\"\n}\n</code></pre>\n<h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"_id\": \"664a1b2c3d4e5f6789abcdef\",\n  \"name\": \"Alex Johnson\",\n  \"email\": \"alex@example.com\",\n  \"createdAt\": \"2026-05-02T04:00:00.000Z\"\n}\n</code></pre>\n<p><strong>Status:</strong> <code>201 Created</code></p>\n<p>The <code>jwt</code> cookie is set automatically.</p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td>Missing required fields or invalid email format</td>\n</tr>\n<tr>\n<td><code>409 Conflict</code></td>\n<td>Email already registered</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","users"],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"bf21277e-e9e3-4406-94eb-afc2e1a8a9c3"},{"name":"Login User","id":"ac0515e2-619c-42b7-8e6e-8a0005107a3d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"email\": \"demo@gmail.com\",\n  \"password\": \"Demo@123\"\n}"},"url":"https://crmideaforge.onrender.com/api/users/login","description":"<h2 id=\"login-user\">Login User</h2>\n<p><strong>Purpose:</strong> Authenticate an existing user with email and password. Sets an HTTP-only <code>jwt</code> cookie on success.</p>\n<p><strong>Method &amp; Path:</strong> <code>POST /api/users/login</code></p>\n<p><strong>Authentication Required:</strong> No</p>\n<p><strong>Request Body:</strong> <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Registered email address</td>\n</tr>\n<tr>\n<td><code>password</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Account password</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"email\": \"alex@example.com\",\n  \"password\": \"securePass123\"\n}\n</code></pre>\n<h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"_id\": \"664a1b2c3d4e5f6789abcdef\",\n  \"name\": \"Alex Johnson\",\n  \"email\": \"alex@example.com\"\n}\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td>Missing email or password</td>\n</tr>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>Invalid email or password</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","users","login"],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"ac0515e2-619c-42b7-8e6e-8a0005107a3d"},{"name":"Get Profile","id":"f4512d18-7821-4833-a258-d525c51ea6ef","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://crmideaforge.onrender.com/api/users/profile","description":"<h2 id=\"get-profile\">Get Profile</h2>\n<p><strong>Purpose:</strong> Retrieve the authenticated user's profile information.</p>\n<p><strong>Method &amp; Path:</strong> <code>GET /api/users/profile</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> None</p>\n<hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET https://crmideaforge.onrender.com/api/users/profile\n</code></pre><h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"_id\": \"664a1b2c3d4e5f6789abcdef\",\n  \"name\": \"Alex Johnson\",\n  \"email\": \"alex@example.com\",\n  \"avatar\": \"https://example.com/avatar.jpg\",\n  \"createdAt\": \"2026-05-02T04:00:00.000Z\"\n}\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie — run Login User first</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","users","profile"],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"f4512d18-7821-4833-a258-d525c51ea6ef"},{"name":"Update Profile","id":"4829d1d1-7e63-4dbd-841d-c2101025e810","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"name\": \"Demo Person\",\n  \"jobTitle\": \"Project Demo\"\n}"},"url":"https://crmideaforge.onrender.com/api/users/profile","description":"<h2 id=\"update-profile\">Update Profile</h2>\n<p><strong>Purpose:</strong> Update the authenticated user's profile details such as name, email, or password.</p>\n<p><strong>Method &amp; Path:</strong> <code>PUT /api/users/profile</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>No</td>\n<td>Updated display name</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>No</td>\n<td>Updated email address</td>\n</tr>\n<tr>\n<td><code>password</code></td>\n<td>string</td>\n<td>No</td>\n<td>New password (will be hashed)</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"name\": \"Alex J.\",\n  \"email\": \"alexj@example.com\",\n  \"password\": \"newSecurePass456\"\n}\n</code></pre>\n<h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"_id\": \"664a1b2c3d4e5f6789abcdef\",\n  \"name\": \"Alex J.\",\n  \"email\": \"alexj@example.com\"\n}\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td>Invalid or missing fields</td>\n</tr>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie — run Login User first</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","users","profile"],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"4829d1d1-7e63-4dbd-841d-c2101025e810"},{"name":"Logout User","id":"554e23ed-a6b3-4e1b-9519-54c9b7edd166","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"url":"https://crmideaforge.onrender.com/api/users/logout","description":"<h2 id=\"logout-user\">Logout User</h2>\n<p><strong>Purpose:</strong> End the current user session by clearing the <code>jwt</code> HTTP-only cookie.</p>\n<p><strong>Method &amp; Path:</strong> <code>POST /api/users/logout</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> None</p>\n<hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>POST https://crmideaforge.onrender.com/api/users/logout\n</code></pre><h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Logged out successfully\"\n}\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No active session to log out</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","users","logout"],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"554e23ed-a6b3-4e1b-9519-54c9b7edd166"}],"id":"9a1a0d74-263a-4a16-85f5-1ed44a5abf3a","description":"<h2 id=\"authentication\">Authentication</h2>\n<p>Handles user registration, login, profile management, and logout. IdeaForge uses <strong>HTTP-only JWT cookies</strong> for session management — no Bearer tokens are needed.</p>\n<h3 id=\"how-it-works\">How it works</h3>\n<ul>\n<li><strong>Register</strong> or <strong>Login</strong> sets a cookie named <code>jwt</code> in your Postman cookie jar automatically.</li>\n<li>All subsequent protected requests will include this cookie automatically.</li>\n<li><strong>Logout</strong> clears the cookie and ends the session.</li>\n</ul>\n<h3 id=\"testing-order\">Testing Order</h3>\n<ol>\n<li>Register User (new users) or Login User (existing users)</li>\n<li>Get Profile to verify session</li>\n<li>Update Profile as needed</li>\n<li>Logout when done</li>\n</ol>\n<p><strong>Authentication required:</strong> No for Register/Login; Yes for Profile, Update Profile, Logout</p>\n<p><strong>Endpoints:</strong></p>\n<ul>\n<li><code>POST /api/users</code> — Register User</li>\n<li><code>POST /api/users/login</code> — Login User</li>\n<li><code>GET /api/users/profile</code> — Get Profile</li>\n<li><code>PUT /api/users/profile</code> — Update Profile</li>\n<li><code>POST /api/users/logout</code> — Logout User</li>\n</ul>\n","_postman_id":"9a1a0d74-263a-4a16-85f5-1ed44a5abf3a"},{"name":"Google OAuth","item":[{"name":"Start Google OAuth","id":"8a338253-ca96-41d0-bab8-c0e2c442ffbd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://crmideaforge.onrender.com/api/auth/google","description":"<h2 id=\"start-google-oauth\">Start Google OAuth</h2>\n<p><strong>Purpose:</strong> Initiate the Google OAuth 2.0 sign-in flow. Redirects the user to Google's consent screen.</p>\n<p><strong>Method &amp; Path:</strong> <code>GET /api/auth/google</code></p>\n<p><strong>Authentication Required:</strong> No</p>\n<blockquote>\n<p><strong>Important:</strong> Open this URL directly in a browser to complete the OAuth consent flow. After authorization, Google redirects back to the app and sets the session cookie. You must complete this before using Gmail or Calendar endpoints.</p>\n</blockquote>\n<p><strong>Request Body:</strong> None</p>\n<hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET https://crmideaforge.onrender.com/api/auth/google\n</code></pre><h3 id=\"expected-behavior\">Expected Behavior</h3>\n<p>Redirects to Google's OAuth consent screen. After user grants permission, redirects back and establishes a session.</p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>500 Internal Server Error</code></td>\n<td>OAuth credentials not configured — use the debug endpoint</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","auth","google"],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"8a338253-ca96-41d0-bab8-c0e2c442ffbd"},{"name":"Google OAuth Debug","id":"bd45b7da-cea3-4b30-ae65-489a8c280fd6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://crmideaforge.onrender.com/api/auth/google/debug","description":"<h2 id=\"google-oauth-debug\">Google OAuth Debug</h2>\n<p><strong>Purpose:</strong> Verify the Google OAuth configuration on the server. Returns details about the current OAuth setup, useful for diagnosing sign-in issues.</p>\n<p><strong>Method &amp; Path:</strong> <code>GET /api/auth/google/debug</code></p>\n<p><strong>Authentication Required:</strong> No</p>\n<p><strong>Request Body:</strong> None</p>\n<hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET https://crmideaforge.onrender.com/api/auth/google/debug\n</code></pre><h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"clientId\": \"configured\",\n  \"callbackUrl\": \"https://crmideaforge.onrender.com/api/auth/google/callback\",\n  \"status\": \"OAuth credentials loaded\"\n}\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>500 Internal Server Error</code></td>\n<td>OAuth credentials missing or misconfigured</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","auth","google","debug"],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"bd45b7da-cea3-4b30-ae65-489a8c280fd6"}],"id":"8516641a-2599-4eec-9b12-86d27dc94da2","description":"<h2 id=\"google-oauth\">Google OAuth</h2>\n<p>Handles Google OAuth 2.0 sign-in flow. Users who sign in with Google gain access to Google Productivity features (Gmail and Google Calendar).</p>\n<h3 id=\"important\">Important</h3>\n<ul>\n<li>You must complete the Google OAuth flow <strong>before</strong> using any Google Productivity endpoints (Gmail, Calendar).</li>\n<li>The OAuth flow redirects through Google's consent screen and sets the session cookie upon return.</li>\n<li>The debug endpoint is useful for verifying OAuth configuration during development.</li>\n</ul>\n<p><strong>Authentication required:</strong> No (initiates the OAuth flow)</p>\n<p><strong>Endpoints:</strong></p>\n<ul>\n<li><code>GET /api/auth/google</code> — Start Google OAuth (redirects to Google consent screen)</li>\n<li><code>GET /api/auth/google/debug</code> — Google OAuth Debug (verify OAuth config)</li>\n</ul>\n","_postman_id":"8516641a-2599-4eec-9b12-86d27dc94da2"},{"name":"Projects","item":[{"name":"List Team Projects","id":"6fb32315-c8b6-47a7-84d7-5a8216084c79","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://crmideaforge.onrender.com/api/projects?team=","description":"<h2 id=\"list-team-projects\">List Team Projects</h2>\n<p><strong>Purpose:</strong> Retrieve all projects associated with a specific team.</p>\n<p><strong>Method &amp; Path:</strong> <code>GET /api/projects?team=</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> None</p>\n<p><strong>Query Parameters:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>team</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The team ID to filter projects by</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET https://crmideaforge.onrender.com/api/projects?team=664a1b2c3d4e5f6789abc000\n</code></pre><h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"_id\": \"664a1b2c3d4e5f6789abcdef\",\n    \"title\": \"IdeaForge MVP\",\n    \"team\": \"664a1b2c3d4e5f6789abc000\",\n    \"status\": \"in-progress\"\n  }\n]\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td>Invalid or missing team ID</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","projects"],"host":["https://crmideaforge.onrender.com"],"query":[{"key":"team","value":""}],"variable":[]}},"response":[],"_postman_id":"6fb32315-c8b6-47a7-84d7-5a8216084c79"},{"name":"Create Project","id":"837ce9cd-29a6-4218-b9ec-1eb709016ebd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"title\": \"Launch CRM Dashboard\",\n  \"description\": \"Build and review the SaaS project workspace.\",\n  \"status\": \"Planning\",\n  \"priority\": \"High\"\n}"},"url":"https://crmideaforge.onrender.com/api/projects","description":"<h2 id=\"create-project\">Create Project</h2>\n<p><strong>Purpose:</strong> Create a new project. After creation, copy the returned <code>_id</code> and set it as the <code>projectId</code> collection variable.</p>\n<p><strong>Method &amp; Path:</strong> <code>POST /api/projects</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>title</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Project title</td>\n</tr>\n<tr>\n<td><code>description</code></td>\n<td>string</td>\n<td>No</td>\n<td>Project description</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td>No</td>\n<td><code>planning</code>, <code>in-progress</code>, or <code>completed</code></td>\n</tr>\n<tr>\n<td><code>team</code></td>\n<td>string</td>\n<td>No</td>\n<td>Team ID to associate with this project</td>\n</tr>\n<tr>\n<td><code>dueDate</code></td>\n<td>string</td>\n<td>No</td>\n<td>ISO 8601 date string</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"example-request-body\">Example Request Body</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"title\": \"IdeaForge MVP\",\n  \"description\": \"Build the core SaaS platform features\",\n  \"status\": \"planning\",\n  \"dueDate\": \"2026-06-30T00:00:00.000Z\"\n}\n</code></pre>\n<h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"_id\": \"664a1b2c3d4e5f6789abcdef\",\n  \"title\": \"IdeaForge MVP\",\n  \"status\": \"planning\",\n  \"owner\": \"664a1b2c3d4e5f6789abc111\",\n  \"createdAt\": \"2026-05-02T04:00:00.000Z\"\n}\n</code></pre>\n<p><strong>Status:</strong> <code>201 Created</code></p>\n<p>Copy <code>_id</code> and set it as <code>projectId</code> in your collection variables.</p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td>Missing required fields</td>\n</tr>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","projects"],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"837ce9cd-29a6-4218-b9ec-1eb709016ebd"},{"name":"Get Project By ID","id":"2f12cd84-d7e4-4ae6-bd12-1413d1857d0e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://crmideaforge.onrender.com/api/projects/","description":"<h2 id=\"get-project-by-id\">Get Project By ID</h2>\n<p><strong>Purpose:</strong> Retrieve a single project by its ID, including associated tasks and team details.</p>\n<p><strong>Method &amp; Path:</strong> <code>GET /api/projects/</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> None</p>\n<p><strong>Path Parameters:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>projectId</code></td>\n<td>The <code>_id</code> of the project to retrieve</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET https://crmideaforge.onrender.com/api/projects/664a1b2c3d4e5f6789abcdef\n</code></pre><h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"_id\": \"664a1b2c3d4e5f6789abcdef\",\n  \"title\": \"IdeaForge MVP\",\n  \"description\": \"Build the core SaaS platform features\",\n  \"status\": \"in-progress\",\n  \"owner\": { \"_id\": \"664a1b2c3d4e5f6789abc111\", \"name\": \"Alex Johnson\" },\n  \"tasks\": [],\n  \"createdAt\": \"2026-05-02T04:00:00.000Z\"\n}\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie</td>\n</tr>\n<tr>\n<td><code>404 Not Found</code></td>\n<td>Project not found or not owned by user</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","projects",""],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"2f12cd84-d7e4-4ae6-bd12-1413d1857d0e"},{"name":"Update Project","id":"434b4197-2d23-427d-9968-cfa9ec1c00c4","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"title\": \"Demo Launch CRM Dashboard\",\n  \"description\": \"Updated project description.\",\n  \"status\": \"Active\",\n  \"priority\": \"Medium\"\n}"},"url":"https://crmideaforge.onrender.com/api/projects/","description":"<h2 id=\"update-project\">Update Project</h2>\n<p><strong>Purpose:</strong> Update an existing project's details. Only include the fields you want to change.</p>\n<p><strong>Method &amp; Path:</strong> <code>PUT /api/projects/</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> <code>application/json</code> — include only fields to update</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>title</code></td>\n<td>string</td>\n<td>Updated project title</td>\n</tr>\n<tr>\n<td><code>description</code></td>\n<td>string</td>\n<td>Updated description</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>string</td>\n<td><code>planning</code>, <code>in-progress</code>, or <code>completed</code></td>\n</tr>\n<tr>\n<td><code>dueDate</code></td>\n<td>string</td>\n<td>Updated due date (ISO 8601)</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Path Parameters:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>projectId</code></td>\n<td>The <code>_id</code> of the project to update</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"status\": \"in-progress\",\n  \"title\": \"IdeaForge MVP - Phase 1\"\n}\n</code></pre>\n<h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"_id\": \"664a1b2c3d4e5f6789abcdef\",\n  \"title\": \"IdeaForge MVP - Phase 1\",\n  \"status\": \"in-progress\"\n}\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie</td>\n</tr>\n<tr>\n<td><code>404 Not Found</code></td>\n<td>Project not found</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","projects",""],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"434b4197-2d23-427d-9968-cfa9ec1c00c4"},{"name":"Delete Project","id":"d84a2b8a-7690-4274-91b6-3e3c9f9a0605","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[],"url":"https://crmideaforge.onrender.com/api/projects/","description":"<h2 id=\"delete-project\">Delete Project</h2>\n<p><strong>Purpose:</strong> Permanently delete a project by ID. This action cannot be undone.</p>\n<p><strong>Method &amp; Path:</strong> <code>DELETE /api/projects/</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> None</p>\n<p><strong>Path Parameters:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>projectId</code></td>\n<td>The <code>_id</code> of the project to delete</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>DELETE https://crmideaforge.onrender.com/api/projects/664a1b2c3d4e5f6789abcdef\n</code></pre><h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Project deleted successfully\"\n}\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie</td>\n</tr>\n<tr>\n<td><code>404 Not Found</code></td>\n<td>Project not found or not owned by user</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","projects",""],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"d84a2b8a-7690-4274-91b6-3e3c9f9a0605"}],"id":"5a3e39f0-8653-4623-aa55-9fa43884230d","description":"<h2 id=\"projects\">Projects</h2>\n<p>Full CRUD operations for managing projects. Projects are the top-level organizational unit in IdeaForge — tasks and teams are associated with projects.</p>\n<h3 id=\"variable-setup\">Variable Setup</h3>\n<p>After creating a project, copy the <code>_id</code> from the response and set it as the <code>projectId</code> collection variable. This is required for Get, Update, Delete, and task/team filtering endpoints.</p>\n<p><strong>Authentication required:</strong> Yes (JWT cookie)</p>\n<p><strong>Endpoints:</strong></p>\n<ul>\n<li><code>GET /api/projects</code> — List all projects for the authenticated user</li>\n<li><code>GET /api/projects?team=</code> — List projects filtered by team</li>\n<li><code>POST /api/projects</code> — Create a new project</li>\n<li><code>GET /api/projects/</code> — Get a project by ID</li>\n<li><code>PUT /api/projects/</code> — Update a project</li>\n<li><code>DELETE /api/projects/</code> — Delete a project</li>\n</ul>\n","_postman_id":"5a3e39f0-8653-4623-aa55-9fa43884230d"},{"name":"Tasks","item":[{"name":"List Tasks","id":"223d9fe1-64bf-4ab3-a2eb-381b889be538","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://crmideaforge.onrender.com/api/tasks","description":"<h2 id=\"list-tasks\">List Tasks</h2>\n<p><strong>Purpose:</strong> Retrieve all tasks for the authenticated user across all projects.</p>\n<p><strong>Method &amp; Path:</strong> <code>GET /api/tasks</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> None</p>\n<p><strong>Query Parameters:</strong> None (use List Project Tasks or List Team Tasks for filtered views)</p>\n<hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET https://crmideaforge.onrender.com/api/tasks\n</code></pre><h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"_id\": \"664a1b2c3d4e5f6789abc222\",\n    \"title\": \"Design login page\",\n    \"isCompleted\": false,\n    \"priority\": \"high\",\n    \"project\": \"664a1b2c3d4e5f6789abcdef\",\n    \"assignedTo\": \"664a1b2c3d4e5f6789abc111\",\n    \"dueDate\": \"2026-05-15T00:00:00.000Z\"\n  }\n]\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","tasks"],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"223d9fe1-64bf-4ab3-a2eb-381b889be538"},{"name":"List Project Tasks","id":"dd016fa7-14f2-4465-8b27-3fcc946c3ba7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://crmideaforge.onrender.com/api/tasks?project=","description":"<h2 id=\"list-project-tasks\">List Project Tasks</h2>\n<p><strong>Purpose:</strong> Retrieve all tasks belonging to a specific project.</p>\n<p><strong>Method &amp; Path:</strong> <code>GET /api/tasks?project=</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> None</p>\n<p><strong>Query Parameters:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>project</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Project ID to filter tasks by</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET https://crmideaforge.onrender.com/api/tasks?project=664a1b2c3d4e5f6789abcdef\n</code></pre><h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"_id\": \"664a1b2c3d4e5f6789abc222\",\n    \"title\": \"Design login page\",\n    \"isCompleted\": false,\n    \"project\": \"664a1b2c3d4e5f6789abcdef\"\n  }\n]\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td>Invalid project ID</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","tasks"],"host":["https://crmideaforge.onrender.com"],"query":[{"key":"project","value":""}],"variable":[]}},"response":[],"_postman_id":"dd016fa7-14f2-4465-8b27-3fcc946c3ba7"},{"name":"List Team Tasks","id":"7a5f4060-b287-42aa-9e16-aaff4f2fc68f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://crmideaforge.onrender.com/api/tasks?team=&isCompleted=false","description":"<h2 id=\"list-team-tasks\">List Team Tasks</h2>\n<p><strong>Purpose:</strong> Retrieve incomplete tasks for a specific team. Useful for tracking outstanding work across a team.</p>\n<p><strong>Method &amp; Path:</strong> <code>GET /api/tasks?team=&amp;isCompleted=false</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> None</p>\n<p><strong>Query Parameters:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>team</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Team ID to filter tasks by</td>\n</tr>\n<tr>\n<td><code>isCompleted</code></td>\n<td>boolean</td>\n<td>No</td>\n<td>Filter by completion status (<code>true</code> or <code>false</code>)</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET https://crmideaforge.onrender.com/api/tasks?team=664a1b2c3d4e5f6789abc000&amp;isCompleted=false\n</code></pre><h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"_id\": \"664a1b2c3d4e5f6789abc222\",\n    \"title\": \"Design login page\",\n    \"isCompleted\": false,\n    \"team\": \"664a1b2c3d4e5f6789abc000\"\n  }\n]\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","tasks"],"host":["https://crmideaforge.onrender.com"],"query":[{"key":"team","value":""},{"key":"isCompleted","value":"false"}],"variable":[]}},"response":[],"_postman_id":"7a5f4060-b287-42aa-9e16-aaff4f2fc68f"},{"name":"Create Task","id":"37719bc5-5c2d-4824-a5c5-dfcce8b5d952","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"title\": \"Prepare evaluation demo\",\n  \"project\": \"\",\n  \"dueDate\": \"2026-05-10T10:00:00.000Z\"\n}"},"url":"https://crmideaforge.onrender.com/api/tasks","description":"<h2 id=\"create-task\">Create Task</h2>\n<p><strong>Purpose:</strong> Create a new task and associate it with a project and/or team. After creation, copy the returned <code>_id</code> and set it as the <code>taskId</code> collection variable.</p>\n<p><strong>Method &amp; Path:</strong> <code>POST /api/tasks</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>title</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Task title</td>\n</tr>\n<tr>\n<td><code>description</code></td>\n<td>string</td>\n<td>No</td>\n<td>Task description</td>\n</tr>\n<tr>\n<td><code>project</code></td>\n<td>string</td>\n<td>No</td>\n<td>Project ID to associate this task with</td>\n</tr>\n<tr>\n<td><code>team</code></td>\n<td>string</td>\n<td>No</td>\n<td>Team ID to associate this task with</td>\n</tr>\n<tr>\n<td><code>assignedTo</code></td>\n<td>string</td>\n<td>No</td>\n<td>User ID of the assignee</td>\n</tr>\n<tr>\n<td><code>priority</code></td>\n<td>string</td>\n<td>No</td>\n<td><code>low</code>, <code>medium</code>, or <code>high</code></td>\n</tr>\n<tr>\n<td><code>dueDate</code></td>\n<td>string</td>\n<td>No</td>\n<td>ISO 8601 due date</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"title\": \"Design login page\",\n  \"description\": \"Create wireframes and implement the login UI\",\n  \"project\": \"664a1b2c3d4e5f6789abcdef\",\n  \"priority\": \"high\",\n  \"dueDate\": \"2026-05-15T00:00:00.000Z\"\n}\n</code></pre>\n<h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"_id\": \"664a1b2c3d4e5f6789abc222\",\n  \"title\": \"Design login page\",\n  \"isCompleted\": false,\n  \"priority\": \"high\",\n  \"project\": \"664a1b2c3d4e5f6789abcdef\",\n  \"createdAt\": \"2026-05-02T04:00:00.000Z\"\n}\n</code></pre>\n<p><strong>Status:</strong> <code>201 Created</code></p>\n<blockquote>\n<p>Copy <code>_id</code> and set it as <code>taskId</code> in your collection variables.</p>\n</blockquote>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td>Missing required fields</td>\n</tr>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","tasks"],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"37719bc5-5c2d-4824-a5c5-dfcce8b5d952"},{"name":"Update Task","id":"190acace-1c78-4d11-9227-493bb65e67a8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"title\": \"Prepare final evaluation demo\",\n  \"isCompleted\": true,\n  \"dueDate\": \"2026-05-11T10:00:00.000Z\"\n}"},"url":"https://crmideaforge.onrender.com/api/tasks/","description":"<h2 id=\"update-task\">Update Task</h2>\n<p><strong>Purpose:</strong> Update an existing task's details such as title, status, priority, or assignee.</p>\n<p><strong>Method &amp; Path:</strong> <code>PUT /api/tasks/</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> <code>application/json</code> — include only fields to update</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>title</code></td>\n<td>string</td>\n<td>Updated task title</td>\n</tr>\n<tr>\n<td><code>description</code></td>\n<td>string</td>\n<td>Updated description</td>\n</tr>\n<tr>\n<td><code>isCompleted</code></td>\n<td>boolean</td>\n<td>Mark task as complete (<code>true</code>) or incomplete (<code>false</code>)</td>\n</tr>\n<tr>\n<td><code>priority</code></td>\n<td>string</td>\n<td><code>low</code>, <code>medium</code>, or <code>high</code></td>\n</tr>\n<tr>\n<td><code>assignedTo</code></td>\n<td>string</td>\n<td>User ID of the new assignee</td>\n</tr>\n<tr>\n<td><code>dueDate</code></td>\n<td>string</td>\n<td>Updated due date (ISO 8601)</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Path Parameters:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>taskId</code></td>\n<td>The <code>_id</code> of the task to update</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"isCompleted\": true,\n  \"priority\": \"medium\"\n}\n</code></pre>\n<h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"_id\": \"664a1b2c3d4e5f6789abc222\",\n  \"title\": \"Design login page\",\n  \"isCompleted\": true,\n  \"priority\": \"medium\"\n}\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie</td>\n</tr>\n<tr>\n<td><code>404 Not Found</code></td>\n<td>Task not found</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","tasks",""],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"190acace-1c78-4d11-9227-493bb65e67a8"},{"name":"Delete Task","id":"9f185397-bafc-4bd7-aca8-2aa96375afa7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[],"url":"https://crmideaforge.onrender.com/api/tasks/","description":"<h2 id=\"delete-task\">Delete Task</h2>\n<p><strong>Purpose:</strong> Permanently delete a task by ID. This action cannot be undone.</p>\n<p><strong>Method &amp; Path:</strong> <code>DELETE /api/tasks/</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> None</p>\n<p><strong>Path Parameters:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>taskId</code></td>\n<td>The <code>_id</code> of the task to delete</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>DELETE https://crmideaforge.onrender.com/api/tasks/664a1b2c3d4e5f6789abc222\n</code></pre><h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Task deleted successfully\"\n}\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie</td>\n</tr>\n<tr>\n<td><code>404 Not Found</code></td>\n<td>Task not found</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","tasks",""],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"9f185397-bafc-4bd7-aca8-2aa96375afa7"}],"id":"8dac6eda-dbbc-4825-a799-9028744af3f4","description":"<h2 id=\"tasks\">Tasks</h2>\n<p>Full CRUD operations for managing tasks. Tasks belong to projects and can be assigned to team members. Supports filtering by project, team, and completion status.</p>\n<h3 id=\"variable-setup\">Variable Setup</h3>\n<p>After creating a task, copy the <code>_id</code> from the response and set it as the <code>taskId</code> collection variable.</p>\n<h3 id=\"filtering\">Filtering</h3>\n<ul>\n<li>Filter by project: <code>GET /api/tasks?project=</code></li>\n<li>Filter by team and status: <code>GET /api/tasks?team=&amp;isCompleted=false</code></li>\n</ul>\n<p><strong>Authentication required:</strong> Yes (JWT cookie)</p>\n<p><strong>Endpoints:</strong></p>\n<ul>\n<li><code>GET /api/tasks</code> — List all tasks</li>\n<li><code>GET /api/tasks?project=</code> — List tasks by project</li>\n<li><code>GET /api/tasks?team=&amp;isCompleted=false</code> — List incomplete team tasks</li>\n<li><code>POST /api/tasks</code> — Create a new task</li>\n<li><code>PUT /api/tasks/</code> — Update a task</li>\n<li><code>DELETE /api/tasks/</code> — Delete a task</li>\n</ul>\n","_postman_id":"8dac6eda-dbbc-4825-a799-9028744af3f4"},{"name":"Meetings","item":[{"name":"List Meetings","id":"d272289e-026f-4a28-93a8-1998695f4a03","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://crmideaforge.onrender.com/api/meetings","description":"<h2 id=\"list-meetings\">List Meetings</h2>\n<p><strong>Purpose:</strong> Retrieve all meetings for the authenticated user.</p>\n<p><strong>Method &amp; Path:</strong> <code>GET /api/meetings</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> None</p>\n<p><strong>Query Parameters:</strong> None</p>\n<hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET https://crmideaforge.onrender.com/api/meetings\n</code></pre><h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"_id\": \"664a1b2c3d4e5f6789abc333\",\n    \"title\": \"Sprint Planning\",\n    \"date\": \"2026-05-10T09:00:00.000Z\",\n    \"agenda\": \"Plan tasks for Sprint 3\",\n    \"team\": \"664a1b2c3d4e5f6789abc000\",\n    \"attendees\": [\"664a1b2c3d4e5f6789abc111\"]\n  }\n]\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","meetings"],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"d272289e-026f-4a28-93a8-1998695f4a03"},{"name":"Create Meeting","id":"c6bb59ee-8e8f-47c9-b560-5a185e82998d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"title\": \"Sprint Planning\",\n  \"description\": \"Plan next project sprint.\",\n  \"startTime\": \"2026-05-10T09:00:00.000Z\",\n  \"endTime\": \"2026-05-10T10:00:00.000Z\",\n  \"type\": \"Internal Sync\",\n  \"meetingLink\": \"https://meet.google.com/demo-room\",\n  \"attendees\": [\"teammate@example.com\"]\n}"},"url":"https://crmideaforge.onrender.com/api/meetings","description":"<h2 id=\"create-meeting\">Create Meeting</h2>\n<p><strong>Purpose:</strong> Schedule a new meeting. After creation, copy the returned <code>_id</code> and set it as the <code>meetingId</code> collection variable.</p>\n<p><strong>Method &amp; Path:</strong> <code>POST /api/meetings</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>title</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Meeting title</td>\n</tr>\n<tr>\n<td><code>date</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>ISO 8601 date and time of the meeting</td>\n</tr>\n<tr>\n<td><code>agenda</code></td>\n<td>string</td>\n<td>No</td>\n<td>Meeting agenda or description</td>\n</tr>\n<tr>\n<td><code>team</code></td>\n<td>string</td>\n<td>No</td>\n<td>Team ID to associate with this meeting</td>\n</tr>\n<tr>\n<td><code>attendees</code></td>\n<td>array</td>\n<td>No</td>\n<td>Array of user IDs to invite</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"title\": \"Sprint Planning\",\n  \"date\": \"2026-05-10T09:00:00.000Z\",\n  \"agenda\": \"Plan tasks for Sprint 3\",\n  \"team\": \"664a1b2c3d4e5f6789abc000\"\n}\n</code></pre>\n<h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"_id\": \"664a1b2c3d4e5f6789abc333\",\n  \"title\": \"Sprint Planning\",\n  \"date\": \"2026-05-10T09:00:00.000Z\",\n  \"agenda\": \"Plan tasks for Sprint 3\",\n  \"team\": \"664a1b2c3d4e5f6789abc000\",\n  \"createdAt\": \"2026-05-02T04:00:00.000Z\"\n}\n</code></pre>\n<p><strong>Status:</strong> <code>201 Created</code></p>\n<blockquote>\n<p>Copy <code>_id</code> and set it as <code>meetingId</code> in your collection variables.</p>\n</blockquote>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td>Missing required fields</td>\n</tr>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","meetings"],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"c6bb59ee-8e8f-47c9-b560-5a185e82998d"},{"name":"Update Meeting","id":"57aee1ad-b599-4b9c-a661-33c859729aef","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"title\": \"Updated Sprint Planning\",\n  \"description\": \"Updated notes.\",\n  \"type\": \"Review\"\n}"},"url":"https://crmideaforge.onrender.com/api/meetings/","description":"<h2 id=\"update-meeting\">Update Meeting</h2>\n<p><strong>Purpose:</strong> Update an existing meeting's details such as title, date, or agenda.</p>\n<p><strong>Method &amp; Path:</strong> <code>PUT /api/meetings/</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> <code>application/json</code> — include only fields to update</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>title</code></td>\n<td>string</td>\n<td>Updated meeting title</td>\n</tr>\n<tr>\n<td><code>date</code></td>\n<td>string</td>\n<td>Updated date/time (ISO 8601)</td>\n</tr>\n<tr>\n<td><code>agenda</code></td>\n<td>string</td>\n<td>Updated agenda</td>\n</tr>\n<tr>\n<td><code>attendees</code></td>\n<td>array</td>\n<td>Updated list of attendee user IDs</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Path Parameters:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>meetingId</code></td>\n<td>The <code>_id</code> of the meeting to update</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"title\": \"Sprint Planning - Revised\",\n  \"date\": \"2026-05-11T10:00:00.000Z\"\n}\n</code></pre>\n<h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"_id\": \"664a1b2c3d4e5f6789abc333\",\n  \"title\": \"Sprint Planning - Revised\",\n  \"date\": \"2026-05-11T10:00:00.000Z\"\n}\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie</td>\n</tr>\n<tr>\n<td><code>404 Not Found</code></td>\n<td>Meeting not found</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","meetings",""],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"57aee1ad-b599-4b9c-a661-33c859729aef"},{"name":"Delete Meeting","id":"1f257a87-bc09-4c27-a651-5aaf654911e5","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[],"url":"https://crmideaforge.onrender.com/api/meetings/","description":"<h2 id=\"delete-meeting\">Delete Meeting</h2>\n<p><strong>Purpose:</strong> Permanently delete a meeting by its ID.</p>\n<p><strong>Method &amp; Path:</strong> <code>DELETE /api/meetings/</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> None</p>\n<p><strong>Path Parameters:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>meetingId</code></td>\n<td>The <code>_id</code> of the meeting to delete</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>DELETE https://crmideaforge.onrender.com/api/meetings/664a1b2c3d4e5f6789abc333\n</code></pre><h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Meeting deleted successfully\"\n}\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie</td>\n</tr>\n<tr>\n<td><code>404 Not Found</code></td>\n<td>Meeting not found</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","meetings",""],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"1f257a87-bc09-4c27-a651-5aaf654911e5"}],"id":"e37c6979-7b33-4ef1-abb2-e39927fada10","description":"<h2 id=\"meetings\">Meetings</h2>\n<p>Full CRUD operations for scheduling and managing meetings. Meetings can be associated with teams and include details such as title, date/time, agenda, and attendees.</p>\n<h3 id=\"variable-setup\">Variable Setup</h3>\n<p>After creating a meeting, copy the <code>_id</code> from the response and set it as the <code>meetingId</code> collection variable.</p>\n<p><strong>Authentication required:</strong> Yes (JWT cookie)</p>\n<p><strong>Endpoints:</strong></p>\n<ul>\n<li><code>GET /api/meetings</code> — List all meetings</li>\n<li><code>POST /api/meetings</code> — Create a new meeting</li>\n<li><code>PUT /api/meetings/</code> — Update a meeting</li>\n<li><code>DELETE /api/meetings/</code> — Delete a meeting</li>\n</ul>\n","_postman_id":"e37c6979-7b33-4ef1-abb2-e39927fada10"},{"name":"Teams","item":[{"name":"List My Teams","id":"fe1a331e-1af1-472e-a6bb-253e736ae3ea","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://crmideaforge.onrender.com/api/teams","description":"<h2 id=\"list-my-teams\">List My Teams</h2>\n<p><strong>Purpose:</strong> Retrieve all teams that the authenticated user belongs to.</p>\n<p><strong>Method &amp; Path:</strong> <code>GET /api/teams</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> None</p>\n<p><strong>Query Parameters:</strong> None</p>\n<hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET https://crmideaforge.onrender.com/api/teams\n</code></pre><h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"_id\": \"664a1b2c3d4e5f6789abc000\",\n    \"name\": \"Engineering\",\n    \"description\": \"Core engineering team\",\n    \"members\": [\n      { \"user\": \"664a1b2c3d4e5f6789abc111\", \"role\": \"admin\" }\n    ],\n    \"createdAt\": \"2026-04-01T00:00:00.000Z\"\n  }\n]\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","teams"],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"fe1a331e-1af1-472e-a6bb-253e736ae3ea"},{"name":"Create Team","id":"2c1a8490-58c2-43f8-9017-05c63ab3143a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"name\": \"IdeaForge Core Team\",\n  \"description\": \"Main project team for evaluation and delivery.\"\n}"},"url":"https://crmideaforge.onrender.com/api/teams","description":"<h2 id=\"create-team\">Create Team</h2>\n<p><strong>Purpose:</strong> Create a new team. After creation, copy the returned <code>_id</code> and set it as the <code>teamId</code> collection variable.</p>\n<p><strong>Method &amp; Path:</strong> <code>POST /api/teams</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Name of the team</td>\n</tr>\n<tr>\n<td><code>description</code></td>\n<td>string</td>\n<td>No</td>\n<td>Brief description of the team</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"name\": \"Engineering\",\n  \"description\": \"Core engineering team\"\n}\n</code></pre>\n<h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"_id\": \"664a1b2c3d4e5f6789abc000\",\n  \"name\": \"Engineering\",\n  \"description\": \"Core engineering team\",\n  \"members\": [\n    { \"user\": \"664a1b2c3d4e5f6789abc111\", \"role\": \"admin\" }\n  ],\n  \"createdAt\": \"2026-05-02T04:00:00.000Z\"\n}\n</code></pre>\n<p><strong>Status:</strong> <code>201 Created</code></p>\n<blockquote>\n<p>Copy <code>_id</code> and set it as <code>teamId</code> in your collection variables.</p>\n</blockquote>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td>Missing required fields</td>\n</tr>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","teams"],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"2c1a8490-58c2-43f8-9017-05c63ab3143a"},{"name":"Get Team By ID","id":"2f762dd1-e550-4e33-8dff-93a34d321bf3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://crmideaforge.onrender.com/api/teams/","description":"<h2 id=\"get-team-by-id\">Get Team By ID</h2>\n<p><strong>Purpose:</strong> Retrieve full details of a specific team, including its members and their roles.</p>\n<p><strong>Method &amp; Path:</strong> <code>GET /api/teams/</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> None</p>\n<p><strong>Path Parameters:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>teamId</code></td>\n<td>The <code>_id</code> of the team to retrieve</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET https://crmideaforge.onrender.com/api/teams/664a1b2c3d4e5f6789abc000\n</code></pre><h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"_id\": \"664a1b2c3d4e5f6789abc000\",\n  \"name\": \"Engineering\",\n  \"description\": \"Core engineering team\",\n  \"members\": [\n    { \"user\": { \"_id\": \"664a1b2c3d4e5f6789abc111\", \"name\": \"Alice\" }, \"role\": \"admin\" },\n    { \"user\": { \"_id\": \"664a1b2c3d4e5f6789abc222\", \"name\": \"Bob\" }, \"role\": \"member\" }\n  ],\n  \"createdAt\": \"2026-04-01T00:00:00.000Z\"\n}\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie</td>\n</tr>\n<tr>\n<td><code>404 Not Found</code></td>\n<td>Team not found</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","teams",""],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"2f762dd1-e550-4e33-8dff-93a34d321bf3"},{"name":"Add Team Member","id":"e036a05b-16d1-4f22-93b7-e9b964775c87","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"email\": \"member@example.com\",\n  \"role\": \"member\"\n}"},"url":"https://crmideaforge.onrender.com/api/teams//members","description":"<h2 id=\"add-team-member\">Add Team Member</h2>\n<p><strong>Purpose:</strong> Add a user to an existing team with a specified role.</p>\n<p><strong>Method &amp; Path:</strong> <code>POST /api/teams//members</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> <code>application/json</code></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>userId</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>The <code>_id</code> of the user to add</td>\n</tr>\n<tr>\n<td><code>role</code></td>\n<td>string</td>\n<td>No</td>\n<td>Role to assign: <code>\"admin\"</code> or <code>\"member\"</code> (default: <code>\"member\"</code>)</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Path Parameters:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>teamId</code></td>\n<td>The <code>_id</code> of the team to add the member to</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"userId\": \"664a1b2c3d4e5f6789abc222\",\n  \"role\": \"member\"\n}\n</code></pre>\n<h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"_id\": \"664a1b2c3d4e5f6789abc000\",\n  \"name\": \"Engineering\",\n  \"members\": [\n    { \"user\": \"664a1b2c3d4e5f6789abc111\", \"role\": \"admin\" },\n    { \"user\": \"664a1b2c3d4e5f6789abc222\", \"role\": \"member\" }\n  ]\n}\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td>Missing <code>userId</code> or user already a member</td>\n</tr>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie</td>\n</tr>\n<tr>\n<td><code>404 Not Found</code></td>\n<td>Team or user not found</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","teams","","members"],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"e036a05b-16d1-4f22-93b7-e9b964775c87"},{"name":"Update Member Role","id":"9e3cc740-819c-4a06-9a8f-dbb3e8256cad","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"role\": \"admin\"\n}"},"url":"https://crmideaforge.onrender.com/api/teams//members/","description":"<p>Update the role of an existing member within a team. Allows a team owner or admin to promote or demote a member. Method: PUT /api/teams//members/. Authentication required via JWT cookie. Send a JSON body with a role field set to either admin or member. Path variables: teamId is the team _id, memberUserId is the target user _id. Returns 200 OK with the updated team object on success. Returns 400 for invalid role, 401 if not authenticated, 403 if insufficient permissions, and 404 if team or member is not found.</p>\n","urlObject":{"path":["api","teams","","members",""],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"9e3cc740-819c-4a06-9a8f-dbb3e8256cad"},{"name":"Remove Team Member","id":"ed7810d4-90ed-4dce-b12b-3919836436b3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[],"url":"https://crmideaforge.onrender.com/api/teams//members/","description":"<h2 id=\"remove-team-member\">Remove Team Member</h2>\n<p><strong>Purpose:</strong> Remove a user from a team. The user will lose access to team projects and tasks.</p>\n<p><strong>Method &amp; Path:</strong> <code>DELETE /api/teams//members/</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> None</p>\n<p><strong>Path Parameters:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>teamId</code></td>\n<td>The <code>_id</code> of the team</td>\n</tr>\n<tr>\n<td><code>memberUserId</code></td>\n<td>The <code>_id</code> of the member to remove</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>DELETE https://crmideaforge.onrender.com/api/teams/664a1b2c3d4e5f6789abc000/members/664a1b2c3d4e5f6789abc444\n</code></pre><h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Member removed successfully\"\n}\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie</td>\n</tr>\n<tr>\n<td><code>403 Forbidden</code></td>\n<td>Only team admins can remove members</td>\n</tr>\n<tr>\n<td><code>404 Not Found</code></td>\n<td>Team or member not found</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","teams","","members",""],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"ed7810d4-90ed-4dce-b12b-3919836436b3"}],"id":"0347bb81-6d1b-4de7-9725-76e46085fe86","description":"<h2 id=\"teams\">Teams</h2>\n<p>Manage teams and team membership. Teams group users together for collaborative work on projects and tasks. Each team member can be assigned a role (e.g., admin, member, viewer) to control access.</p>\n<h3 id=\"variable-setup\">Variable Setup</h3>\n<ul>\n<li>After creating a team, copy the <code>_id</code> and set it as <code>teamId</code>.</li>\n<li>When adding or managing members, copy the target user's <code>_id</code> and set it as <code>memberUserId</code>.</li>\n</ul>\n<h3 id=\"role-access-control\">Role Access Control</h3>\n<p>The Update Member Role endpoint allows team admins to change a member's role, enabling fine-grained access control across the platform.</p>\n<p><strong>Authentication required:</strong> Yes (JWT cookie)</p>\n<p><strong>Endpoints:</strong></p>\n<ul>\n<li><code>GET /api/teams</code> — List all teams for the authenticated user</li>\n<li><code>POST /api/teams</code> — Create a new team</li>\n<li><code>GET /api/teams/</code> — Get a team by ID</li>\n<li><code>POST /api/teams//members</code> — Add a member to a team</li>\n<li><code>PUT /api/teams//members/</code> — Update a member's role</li>\n<li><code>DELETE /api/teams//members/</code> — Remove a member from a team</li>\n</ul>\n","_postman_id":"0347bb81-6d1b-4de7-9725-76e46085fe86"},{"name":"Dashboard & Reports","item":[{"name":"Dashboard Stats","id":"ef3b364b-802b-4e09-b1d3-08546cb05be0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://crmideaforge.onrender.com/api/dashboard/stats","description":"<h2 id=\"dashboard-stats\">Dashboard Stats</h2>\n<p><strong>Purpose:</strong> Retrieve aggregated statistics for the authenticated user's workspace. Returns summary counts and metrics for projects, tasks, meetings, and team activity.</p>\n<p><strong>Method &amp; Path:</strong> <code>GET /api/dashboard/stats</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> None</p>\n<p><strong>Query Parameters:</strong> None</p>\n<hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET https://crmideaforge.onrender.com/api/dashboard/stats\n</code></pre><h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"totalProjects\": 5,\n  \"totalTasks\": 23,\n  \"completedTasks\": 14,\n  \"pendingTasks\": 9,\n  \"totalMeetings\": 3,\n  \"totalTeams\": 2,\n  \"recentActivity\": []\n}\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","dashboard","stats"],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"ef3b364b-802b-4e09-b1d3-08546cb05be0"},{"name":"Reports Data","id":"76b5b747-e391-4dfc-82c3-722786501cd1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://crmideaforge.onrender.com/api/reports","description":"<h2 id=\"reports-data\">Reports Data</h2>\n<p><strong>Purpose:</strong> Retrieve detailed reporting data for the authenticated user's workspace. Useful for generating progress reports and productivity breakdowns.</p>\n<p><strong>Method &amp; Path:</strong> <code>GET /api/reports</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> None</p>\n<p><strong>Query Parameters:</strong> None</p>\n<hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET https://crmideaforge.onrender.com/api/reports\n</code></pre><h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"taskCompletionRate\": 60.87,\n  \"projectsByStatus\": {\n    \"planning\": 1,\n    \"in-progress\": 3,\n    \"completed\": 1\n  },\n  \"tasksByPriority\": {\n    \"high\": 8,\n    \"medium\": 10,\n    \"low\": 5\n  },\n  \"meetingsThisMonth\": 3\n}\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","reports"],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"76b5b747-e391-4dfc-82c3-722786501cd1"}],"id":"1babcb14-863b-49c8-8720-85695b0d8397","description":"<h2 id=\"dashboard--reports\">Dashboard &amp; Reports</h2>\n<p>Provides aggregated analytics and reporting data for the authenticated user's workspace. Use these endpoints to get a high-level overview of project progress, task completion rates, team activity, and more.</p>\n<h3 id=\"use-cases\">Use Cases</h3>\n<ul>\n<li>Display KPIs on a management dashboard</li>\n<li>Generate progress reports for stakeholders</li>\n<li>Monitor team productivity trends</li>\n</ul>\n<p><strong>Authentication required:</strong> Yes (JWT cookie)</p>\n<p><strong>Endpoints:</strong></p>\n<ul>\n<li><code>GET /api/dashboard/stats</code> — Dashboard Stats (summary counts and metrics)</li>\n<li><code>GET /api/reports</code> — Reports Data (detailed breakdown for reporting)</li>\n</ul>\n","_postman_id":"1babcb14-863b-49c8-8720-85695b0d8397"},{"name":"Notifications","item":[{"name":"List Notifications","id":"1390614b-f444-4253-939f-d15f43aecb06","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://crmideaforge.onrender.com/api/notifications","description":"<h2 id=\"list-notifications\">List Notifications</h2>\n<p><strong>Purpose:</strong> Retrieve all in-app notifications for the authenticated user. Notifications are generated by platform events such as task assignments, project updates, and team invitations.</p>\n<p><strong>Method &amp; Path:</strong> <code>GET /api/notifications</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> None</p>\n<p><strong>Query Parameters:</strong> None</p>\n<hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET https://crmideaforge.onrender.com/api/notifications\n</code></pre><h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"_id\": \"664a1b2c3d4e5f6789abc555\",\n    \"message\": \"You have been assigned a new task: Design login page\",\n    \"isRead\": false,\n    \"createdAt\": \"2026-05-02T03:00:00.000Z\"\n  }\n]\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<blockquote>\n<p>Copy a notification <code>_id</code> and set it as <code>notificationId</code> in your collection variables to use the Mark Notification Read endpoint.</p>\n</blockquote>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","notifications"],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"1390614b-f444-4253-939f-d15f43aecb06"},{"name":"Mark All Notifications Read","id":"a29743a3-89e1-416a-bc8a-394b483acd2d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[],"url":"https://crmideaforge.onrender.com/api/notifications/read-all","description":"<h2 id=\"mark-all-notifications-read\">Mark All Notifications Read</h2>\n<p><strong>Purpose:</strong> Mark all of the authenticated user's notifications as read in a single operation.</p>\n<p><strong>Method &amp; Path:</strong> <code>PUT /api/notifications/read-all</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> None</p>\n<hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>PUT https://crmideaforge.onrender.com/api/notifications/read-all\n</code></pre><h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"All notifications marked as read\"\n}\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","notifications","read-all"],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"a29743a3-89e1-416a-bc8a-394b483acd2d"},{"name":"Mark Notification Read","id":"35041e17-29a6-4655-8453-e6140f78af3b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[],"url":"https://crmideaforge.onrender.com/api/notifications//read","description":"<h2 id=\"mark-notification-read\">Mark Notification Read</h2>\n<p><strong>Purpose:</strong> Mark a single notification as read by its ID.</p>\n<p><strong>Method &amp; Path:</strong> <code>PUT /api/notifications//read</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> None</p>\n<p><strong>Path Parameters:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>notificationId</code></td>\n<td>The <code>_id</code> of the notification to mark as read</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>PUT https://crmideaforge.onrender.com/api/notifications/664a1b2c3d4e5f6789abc555/read\n</code></pre><h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"_id\": \"664a1b2c3d4e5f6789abc555\",\n  \"message\": \"You have been assigned a new task: Design login page\",\n  \"isRead\": true\n}\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie</td>\n</tr>\n<tr>\n<td><code>404 Not Found</code></td>\n<td>Notification not found</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","notifications","","read"],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"35041e17-29a6-4655-8453-e6140f78af3b"}],"id":"1fc2fe8d-b9a5-40a9-9a25-19304802dc65","description":"<h2 id=\"notifications\">Notifications</h2>\n<p>Manage in-app notifications for the authenticated user. Notifications are generated automatically by platform events (e.g., task assignments, project updates, team invitations).</p>\n<h3 id=\"variable-setup\">Variable Setup</h3>\n<p>Copy a notification <code>_id</code> from the List Notifications response and set it as <code>notificationId</code> to use the Mark Notification Read endpoint.</p>\n<p><strong>Authentication required:</strong> Yes (JWT cookie)</p>\n<p><strong>Endpoints:</strong></p>\n<ul>\n<li><code>GET /api/notifications</code> — List all notifications for the current user</li>\n<li><code>PUT /api/notifications/read-all</code> — Mark all notifications as read</li>\n<li><code>PUT /api/notifications//read</code> — Mark a specific notification as read</li>\n</ul>\n","_postman_id":"1fc2fe8d-b9a5-40a9-9a25-19304802dc65"},{"name":"Search","item":[{"name":"Global Search","id":"979a3886-b2e6-4cf7-804f-62d4431f8466","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://crmideaforge.onrender.com/api/search?q=project","description":"<h2 id=\"global-search\">Global Search</h2>\n<p><strong>Purpose:</strong> Search across all entities in the IdeaForge platform — projects, tasks, meetings, teams, and users — using a single keyword query.</p>\n<p><strong>Method &amp; Path:</strong> <code>GET /api/search?q=project</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> None</p>\n<p><strong>Query Parameters:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>q</code></td>\n<td>string</td>\n<td>Yes</td>\n<td>Search keyword or phrase</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET https://crmideaforge.onrender.com/api/search?q=sprint\n</code></pre><h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"projects\": [\n    { \"_id\": \"664a1b2c3d4e5f6789abcdef\", \"title\": \"IdeaForge MVP\" }\n  ],\n  \"tasks\": [\n    { \"_id\": \"664a1b2c3d4e5f6789abc222\", \"title\": \"Design login page\" }\n  ],\n  \"meetings\": [\n    { \"_id\": \"664a1b2c3d4e5f6789abc333\", \"title\": \"Sprint Planning\" }\n  ],\n  \"teams\": [],\n  \"users\": []\n}\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td>Missing <code>q</code> parameter</td>\n</tr>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","search"],"host":["https://crmideaforge.onrender.com"],"query":[{"key":"q","value":"project"}],"variable":[]}},"response":[],"_postman_id":"979a3886-b2e6-4cf7-804f-62d4431f8466"}],"id":"459d9a8f-da19-44f8-97f9-9e2e0683d47b","description":"<h2 id=\"search\">Search</h2>\n<p>Global cross-entity search across the IdeaForge platform. A single query can return matching results from projects, tasks, meetings, teams, and users simultaneously.</p>\n<h3 id=\"usage\">Usage</h3>\n<p>Pass a search term as the <code>q</code> query parameter. Example: <code>GET /api/search?q=project</code></p>\n<p>Replace <code>project</code> with any keyword relevant to your data.</p>\n<p><strong>Authentication required:</strong> Yes (JWT cookie)</p>\n<p><strong>Endpoints:</strong></p>\n<ul>\n<li><code>GET /api/search?q={{query}}</code> — Global Search</li>\n</ul>\n","_postman_id":"459d9a8f-da19-44f8-97f9-9e2e0683d47b"},{"name":"Google Productivity","item":[{"name":"Recent Gmail Emails","id":"b837ed29-c40c-4550-acfd-496f8e6f0ad0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://crmideaforge.onrender.com/api/gmail/recent","description":"<h2 id=\"recent-gmail-emails\">Recent Gmail Emails</h2>\n<p><strong>Purpose:</strong> Fetch the most recent emails from the authenticated user's Gmail inbox via Google's Gmail API.</p>\n<p><strong>Method &amp; Path:</strong> <code>GET /api/gmail/recent</code></p>\n<p><strong>Authentication Required:</strong> Yes — both IdeaForge JWT cookie AND Google OAuth session</p>\n<blockquote>\n<p><strong>Prerequisite:</strong> You must complete the Google OAuth sign-in flow (<code>GET /api/auth/google</code>) before using this endpoint. Without a valid Google OAuth session, this request will return a 401 or 403 error.</p>\n</blockquote>\n<p><strong>Request Body:</strong> None</p>\n<p><strong>Query Parameters:</strong> None</p>\n<hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET https://crmideaforge.onrender.com/api/gmail/recent\n</code></pre><h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"id\": \"18f3a2b1c4d5e6f7\",\n    \"subject\": \"Welcome to IdeaForge\",\n    \"from\": \"noreply@ideaforge.com\",\n    \"date\": \"2026-05-01T08:00:00.000Z\",\n    \"snippet\": \"Thank you for signing up...\"\n  }\n]\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie or Google OAuth session expired</td>\n</tr>\n<tr>\n<td><code>403 Forbidden</code></td>\n<td>Google OAuth scope not granted for Gmail access</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","gmail","recent"],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"b837ed29-c40c-4550-acfd-496f8e6f0ad0"},{"name":"Upcoming Calendar Events","id":"e770719c-c7de-43db-af1e-e90c86198e9c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://crmideaforge.onrender.com/api/calendar/upcoming","description":"<h2 id=\"upcoming-calendar-events\">Upcoming Calendar Events</h2>\n<p><strong>Purpose:</strong> Retrieve upcoming events from the authenticated user's Google Calendar.</p>\n<p><strong>Method &amp; Path:</strong> <code>GET /api/calendar/upcoming</code></p>\n<p><strong>Authentication Required:</strong> Yes — both IdeaForge JWT cookie AND Google OAuth session</p>\n<blockquote>\n<p><strong>Prerequisite:</strong> You must complete the Google OAuth sign-in flow (<code>GET /api/auth/google</code>) before using this endpoint.</p>\n</blockquote>\n<p><strong>Request Body:</strong> None</p>\n<p><strong>Query Parameters:</strong> None</p>\n<hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET https://crmideaforge.onrender.com/api/calendar/upcoming\n</code></pre><h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"id\": \"abc123xyz\",\n    \"summary\": \"Sprint Planning\",\n    \"start\": { \"dateTime\": \"2026-05-10T09:00:00+05:30\" },\n    \"end\": { \"dateTime\": \"2026-05-10T10:00:00+05:30\" },\n    \"location\": \"Google Meet\"\n  }\n]\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie or Google OAuth session expired</td>\n</tr>\n<tr>\n<td><code>403 Forbidden</code></td>\n<td>Google OAuth scope not granted for Calendar access</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","calendar","upcoming"],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"e770719c-c7de-43db-af1e-e90c86198e9c"},{"name":"Monthly Calendar Events","id":"b1728157-9535-41d0-9ba0-71bde60c7397","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://crmideaforge.onrender.com/api/calendar/month?year=2026&month=5","description":"<h2 id=\"monthly-calendar-events\">Monthly Calendar Events</h2>\n<p><strong>Purpose:</strong> Retrieve all Google Calendar events for a specific month and year.</p>\n<p><strong>Method &amp; Path:</strong> <code>GET /api/calendar/month?year=2026&amp;month=5</code></p>\n<p><strong>Authentication Required:</strong> Yes — both IdeaForge JWT cookie AND Google OAuth session</p>\n<blockquote>\n<p><strong>Prerequisite:</strong> You must complete the Google OAuth sign-in flow (<code>GET /api/auth/google</code>) before using this endpoint.</p>\n</blockquote>\n<p><strong>Request Body:</strong> None</p>\n<p><strong>Query Parameters:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>year</code></td>\n<td>number</td>\n<td>Yes</td>\n<td>The calendar year (e.g., <code>2026</code>)</td>\n</tr>\n<tr>\n<td><code>month</code></td>\n<td>number</td>\n<td>Yes</td>\n<td>The calendar month as a number (1–12)</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET https://crmideaforge.onrender.com/api/calendar/month?year=2026&amp;month=5\n</code></pre><h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"id\": \"abc123xyz\",\n    \"summary\": \"Sprint Planning\",\n    \"start\": { \"dateTime\": \"2026-05-10T09:00:00+05:30\" },\n    \"end\": { \"dateTime\": \"2026-05-10T10:00:00+05:30\" }\n  },\n  {\n    \"id\": \"def456uvw\",\n    \"summary\": \"Team Retrospective\",\n    \"start\": { \"dateTime\": \"2026-05-24T14:00:00+05:30\" },\n    \"end\": { \"dateTime\": \"2026-05-24T15:00:00+05:30\" }\n  }\n]\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td>Missing or invalid year/month parameters</td>\n</tr>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie or Google OAuth session expired</td>\n</tr>\n<tr>\n<td><code>403 Forbidden</code></td>\n<td>Google OAuth scope not granted for Calendar access</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","calendar","month"],"host":["https://crmideaforge.onrender.com"],"query":[{"key":"year","value":"2026"},{"key":"month","value":"5"}],"variable":[]}},"response":[],"_postman_id":"b1728157-9535-41d0-9ba0-71bde60c7397"}],"id":"b889da60-8566-4b02-8e83-7b3ecced022f","description":"<h2 id=\"google-productivity\">Google Productivity</h2>\n<p>Integrates with Google's APIs to surface Gmail messages and Google Calendar events directly within IdeaForge.</p>\n<h3 id=\"prerequisites\">Prerequisites</h3>\n<blockquote>\n<p><strong>You must complete Google OAuth sign-in first.</strong> Navigate to <code>GET /api/auth/google</code> in the Google OAuth folder and complete the consent flow before using any endpoints in this folder.</p>\n</blockquote>\n<h3 id=\"features\">Features</h3>\n<ul>\n<li><strong>Gmail:</strong> Fetch recent emails from the authenticated user's Gmail inbox</li>\n<li><strong>Google Calendar:</strong> View upcoming events or browse a full monthly calendar view</li>\n</ul>\n<p><strong>Authentication required:</strong> Yes — both IdeaForge JWT cookie AND Google OAuth session</p>\n<p><strong>Endpoints:</strong></p>\n<ul>\n<li><code>GET /api/gmail/recent</code> — Recent Gmail Emails</li>\n<li><code>GET /api/calendar/upcoming</code> — Upcoming Calendar Events</li>\n<li><code>GET /api/calendar/month?year=2026&amp;month=5</code> — Monthly Calendar Events (adjust year/month as needed)</li>\n</ul>\n","_postman_id":"b889da60-8566-4b02-8e83-7b3ecced022f"},{"name":"List Projects","id":"0e9c1033-7772-4a4a-93a9-6e3c736c6b03","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://crmideaforge.onrender.com/api/projects","description":"<h2 id=\"list-projects\">List Projects</h2>\n<p><strong>Purpose:</strong> Retrieve all projects belonging to the authenticated user.</p>\n<p><strong>Method &amp; Path:</strong> <code>GET /api/projects</code></p>\n<p><strong>Authentication Required:</strong> Yes (JWT cookie)</p>\n<p><strong>Request Body:</strong> None</p>\n<p><strong>Query Parameters:</strong> None (use List Team Projects to filter by team)</p>\n<hr />\n<h3 id=\"example-request\">Example Request</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET https://crmideaforge.onrender.com/api/projects\n</code></pre><h3 id=\"example-success-response\">Example Success Response</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"_id\": \"664a1b2c3d4e5f6789abcdef\",\n    \"title\": \"IdeaForge MVP\",\n    \"description\": \"Build the core SaaS platform\",\n    \"status\": \"in-progress\",\n    \"team\": \"664a1b2c3d4e5f6789abc000\",\n    \"createdAt\": \"2026-05-01T10:00:00.000Z\"\n  }\n]\n</code></pre>\n<p><strong>Status:</strong> <code>200 OK</code></p>\n<h3 id=\"common-error-responses\">Common Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401 Unauthorized</code></td>\n<td>No valid JWT cookie</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["api","projects"],"host":["https://crmideaforge.onrender.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"0e9c1033-7772-4a4a-93a9-6e3c736c6b03"}],"variable":[{"key":"baseUrl","value":"https://crmideaforge.onrender.com"},{"key":"projectId","value":""},{"key":"taskId","value":""},{"key":"teamId","value":""},{"key":"meetingId","value":""},{"key":"notificationId","value":""},{"key":"memberUserId","value":""}]}