{"info":{"_postman_id":"f44572ef-7ac8-415f-9fe0-3fcdd536aebb","name":"MyPets Store API","description":"<html><head></head><body><h1 id=\"mypets-store-api\">MyPets Store API</h1>\n<p>A full-featured <strong>e-commerce REST API</strong> for a pet food &amp; supplies store — built with real-world architecture decisions, security at every layer, and a complete shopping experience covering everything from authentication to order fulfillment.</p>\n<hr>\n<h2 id=\"🌐-base-url\">🌐 Base URL</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>https://my-pet-store-api.vercel.app\n</code></pre><hr>\n<h2 id=\"🔐-authentication\">🔐 Authentication</h2>\n<p>Protected endpoints require a JWT token in the request header:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>token</code></td>\n<td>JWT token from Sign In</td>\n<td>Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr>\n<h2 id=\"⚠️-rate-limiting\">⚠️ Rate Limiting</h2>\n<p>200 requests per 15 minutes per IP.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"message\": \"To Many Request Try After 15 Minutes\" }\n</code></pre>\n<hr>\n<h2 id=\"📦-response-format\">📦 Response Format</h2>\n<p><strong>Success:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"message\": \"done!\", \"data\": { ... } }\n</code></pre>\n<p><strong>Error:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"message\": \"Error description\" }\n</code></pre>\n<hr>\n<h2 id=\"reference-values\">Reference Values</h2>\n<p><strong>Product Categories:</strong> <code>cats</code> · <code>dogs</code> · <code>birds</code> · <code>fish</code></p>\n<p><strong>Gender:</strong> <code>male</code> · <code>female</code></p>\n<p><strong>Order Status:</strong> <code>pending</code> → <code>confirmed</code> → <code>shipped</code> → <code>delivered</code> · <code>cancelled</code></p>\n<p><strong>Payment Methods:</strong> <code>cash</code> · <code>card</code></p>\n<p><strong>Coupon Discount Types:</strong> <code>percentage</code> · <code>fixed</code></p>\n<p><strong>Available Coupons:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Code</th>\n<th>Type</th>\n<th>Discount</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>MYPETSSTORE</code></td>\n<td>percentage</td>\n<td>100%</td>\n</tr>\n<tr>\n<td><code>ENG.DIAA ELDEEN</code></td>\n<td>percentage</td>\n<td>100%</td>\n</tr>\n<tr>\n<td><code>SAVE10</code></td>\n<td>percentage</td>\n<td>10%</td>\n</tr>\n<tr>\n<td><code>SAVE20</code></td>\n<td>percentage</td>\n<td>20%</td>\n</tr>\n<tr>\n<td><code>SAVE30</code></td>\n<td>percentage</td>\n<td>30%</td>\n</tr>\n<tr>\n<td><code>SAVE50</code></td>\n<td>percentage</td>\n<td>50%</td>\n</tr>\n<tr>\n<td><code>WELCOME15</code></td>\n<td>percentage</td>\n<td>15%</td>\n</tr>\n<tr>\n<td><code>PETS25</code></td>\n<td>percentage</td>\n<td>25%</td>\n</tr>\n<tr>\n<td><code>OFF50</code></td>\n<td>fixed</td>\n<td>50 EGP</td>\n</tr>\n<tr>\n<td><code>OFF100</code></td>\n<td>fixed</td>\n<td>100 EGP</td>\n</tr>\n<tr>\n<td><code>OFF200</code></td>\n<td>fixed</td>\n<td>200 EGP</td>\n</tr>\n<tr>\n<td><code>OFF500</code></td>\n<td>fixed</td>\n<td>500 EGP</td>\n</tr>\n</tbody>\n</table>\n</div></body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[{"content":"MyPets Store API","slug":"mypets-store-api"}],"owner":"49715513","collectionId":"f44572ef-7ac8-415f-9fe0-3fcdd536aebb","publishedId":"2sBXqGqM2x","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"publishDate":"2026-04-24T12:43:47.000Z"},"item":[{"name":"Auth","item":[{"name":"Sign Up","id":"382cabaf-cc87-4c5b-8baf-ebc8d7344357","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","description":"<p>Required</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"userName\": \"Diaa Eldeen\",\n  \"email\": \"diaa.eldeen@gmail.com\",\n  \"password\": \"SecurePass123\",\n  \"rePassword\": \"SecurePass123\",\n  \"age\": 22,\n  \"gender\": \"male\",\n  \"phone\": \"01012345678\"\n}","options":{"raw":{"language":"json"}}},"url":"https://my-pet-store-api.vercel.app/users/signup","description":"<h2 id=\"sign-up\">Sign Up</h2>\n<p>Register a new user account.</p>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Content-Type</code></td>\n<td><code>application/json</code></td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"body-raw-json\">Body <code>raw (json)</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"userName\": \"Diaa Eldeen\",\n  \"email\": \"diaa.eldeen@gmail.com\",\n  \"password\": \"SecurePass123\",\n  \"rePassword\": \"SecurePass123\",\n  \"age\": 22,\n  \"gender\": \"male\",\n  \"phone\": \"01012345678\"\n}\n</code></pre>\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>Rules</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>userName</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>3–30 chars, letters/numbers/spaces/<code>-</code>/<code>_</code></td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>Valid email — TLDs: <code>.com</code> <code>.net</code> <code>.org</code> <code>.eg</code> <code>.co</code></td>\n</tr>\n<tr>\n<td><code>password</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>Min 8 characters</td>\n</tr>\n<tr>\n<td><code>rePassword</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>Must match <code>password</code></td>\n</tr>\n<tr>\n<td><code>age</code></td>\n<td>number</td>\n<td>✅ Yes</td>\n<td>Integer, min 18</td>\n</tr>\n<tr>\n<td><code>gender</code></td>\n<td>string</td>\n<td>⬜ No</td>\n<td><code>male</code> or <code>female</code></td>\n</tr>\n<tr>\n<td><code>phone</code></td>\n<td>string</td>\n<td>⬜ No</td>\n<td>Egyptian: <code>010</code>/<code>011</code>/<code>012</code>/<code>015</code> + 8 digits</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--201-created\">Success Response — <code>201 Created</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"done!\",\n  \"data\": {\n    \"_id\": \"64f1a2b3c4d5e6f7a8b9c0d1\",\n    \"userName\": \"Diaa Eldeen\",\n    \"email\": \"diaa.eldeen@gmail.com\",\n    \"age\": 22,\n    \"gender\": \"male\"\n  }\n}\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>409</code></td>\n<td><code>User Already Exist</code></td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Validation error with details array</td>\n</tr>\n<tr>\n<td><code>500</code></td>\n<td><code>Server Error!</code></td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["users","signup"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"382cabaf-cc87-4c5b-8baf-ebc8d7344357"},{"name":"Sign In","id":"a0586649-88b2-4e2a-91ff-56936d7bd286","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","description":"<p>Required</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"email\": \"diaa.eldeen@gmail.com\",\n  \"password\": \"SecurePass123\"\n}","options":{"raw":{"language":"json"}}},"url":"https://my-pet-store-api.vercel.app/users/signin","description":"<h2 id=\"sign-in\">Sign In</h2>\n<p>Authenticate and receive a JWT token.</p>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Content-Type</code></td>\n<td><code>application/json</code></td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"body-raw-json\">Body <code>raw (json)</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"email\": \"diaa.eldeen@gmail.com\",\n  \"password\": \"SecurePass123\"\n}\n</code></pre>\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>Rules</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>Valid email</td>\n</tr>\n<tr>\n<td><code>password</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>Min 8 characters</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--200-ok\">Success Response — <code>200 OK</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"LogIn Succefully\",\n  \"data\": {\n    \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"\n  }\n}\n</code></pre>\n<blockquote>\n<p>⚠️ Save this <code>token</code> — required in the <code>token</code> header for all protected endpoints.</p>\n</blockquote>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>409</code></td>\n<td><code>User Not Exist</code></td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td><code>Invalid Password</code></td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Validation error</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["users","signin"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"a0586649-88b2-4e2a-91ff-56936d7bd286"},{"name":"Forget Password — Send OTP","id":"4ae5efab-38e8-4fab-9d70-cbc48d2a2bac","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","description":"<p>Required</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"email\": \"diaa.eldeen@gmail.com\"\n}","options":{"raw":{"language":"json"}}},"url":"https://my-pet-store-api.vercel.app/users/forgetPassword","description":"<h2 id=\"forget-password--send-otp\">Forget Password — Send OTP</h2>\n<p>Send a 6-digit OTP to the email. Valid for <strong>2 minutes</strong>.</p>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Content-Type</code></td>\n<td><code>application/json</code></td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"body-raw-json\">Body <code>raw (json)</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"email\": \"diaa.eldeen@gmail.com\"\n}\n</code></pre>\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>Rules</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>Valid email of existing user</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"otp-rate-limiting\">OTP Rate Limiting</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Condition</th>\n<th>Result</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>OTP already sent &amp; not expired</td>\n<td><code>You Can Resend Otp After {ttl} Second</code></td>\n</tr>\n<tr>\n<td>3+ attempts</td>\n<td>Blocked 5 min: <code>You Have Exceeded The Max Number Of Tries</code></td>\n</tr>\n<tr>\n<td>Currently blocked</td>\n<td><code>Please Try Again After {seconds} Second</code></td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--200-ok\">Success Response — <code>200 OK</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"message\": \"Otp Send Succefully\" }\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>409</code></td>\n<td><code>User Not Exist</code></td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Validation error</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["users","forgetPassword"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"4ae5efab-38e8-4fab-9d70-cbc48d2a2bac"},{"name":"Confirm OTP","id":"8bc63ac8-2d3d-46db-abb2-56a91a2f688f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","description":"<p>Required</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"email\": \"diaa.eldeen@gmail.com\",\n  \"otp\": \"482931\"\n}","options":{"raw":{"language":"json"}}},"url":"https://my-pet-store-api.vercel.app/users/confirmPassword","description":"<h2 id=\"confirm-otp\">Confirm OTP</h2>\n<p>Verify the 6-digit OTP. On success, a verification token is stored in Redis for <strong>5 minutes</strong>.</p>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Content-Type</code></td>\n<td><code>application/json</code></td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"body-raw-json\">Body <code>raw (json)</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"email\": \"diaa.eldeen@gmail.com\",\n  \"otp\": \"482931\"\n}\n</code></pre>\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>Rules</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>Same email used in Forget Password</td>\n</tr>\n<tr>\n<td><code>otp</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>Exactly 6 characters</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--200-ok\">Success Response — <code>200 OK</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"message\": \"Otp Is Valid\" }\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>500</code></td>\n<td><code>Invalid or Expired OTP</code></td>\n</tr>\n<tr>\n<td><code>500</code></td>\n<td><code>Otp Is Invalid</code></td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Validation error</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"password-reset-flow\">Password Reset Flow</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>1. PATCH /users/forgetPassword   → Send OTP\n2. POST  /users/confirmPassword  → Verify OTP (valid 2 min)\n3. PATCH /users/resetPassword    → Set new password (within 5 min of step 2)\n</code></pre>","urlObject":{"path":["users","confirmPassword"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"8bc63ac8-2d3d-46db-abb2-56a91a2f688f"},{"name":"Reset Password","id":"a2ca2937-ea33-4a43-9755-9567865d2c15","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json","description":"<p>Required</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"email\": \"diaa.eldeen@gmail.com\",\n  \"newPassword\": \"NewSecurePass456\",\n  \"rePassword\": \"NewSecurePass456\"\n}","options":{"raw":{"language":"json"}}},"url":"https://my-pet-store-api.vercel.app/users/resetPassword","description":"<h2 id=\"reset-password\">Reset Password</h2>\n<p>Set a new password after OTP verification. New password must <strong>differ</strong> from the current one.</p>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Content-Type</code></td>\n<td><code>application/json</code></td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"body-raw-json\">Body <code>raw (json)</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"email\": \"diaa.eldeen@gmail.com\",\n  \"newPassword\": \"NewSecurePass456\",\n  \"rePassword\": \"NewSecurePass456\"\n}\n</code></pre>\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>Rules</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>Same email used throughout the flow</td>\n</tr>\n<tr>\n<td><code>newPassword</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>Min 8 chars, must differ from current password</td>\n</tr>\n<tr>\n<td><code>rePassword</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>Must match <code>newPassword</code></td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--200-ok\">Success Response — <code>200 OK</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"message\": \"Password Reset Successfully\" }\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>500</code></td>\n<td><code>Otp not verified</code></td>\n</tr>\n<tr>\n<td><code>409</code></td>\n<td><code>User Not Exist</code></td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td><code>New password must be different from old password</code></td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Validation error</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["users","resetPassword"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"a2ca2937-ea33-4a43-9755-9567865d2c15"},{"name":"Update Password","id":"08a2754b-59b2-48e2-b50f-bcbef6a45479","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[{"key":"token","value":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NGYxYTJiM2M0ZDVlNmY3YThiOWMwZDEiLCJpYXQiOjE3MDAwMDAwMDB9.abc123","description":"<p>Required — JWT token from Sign In</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>Required</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"oldPassword\": \"SecurePass123\",\n  \"newPassword\": \"NewSecurePass456\",\n  \"confirmPassword\": \"NewSecurePass456\"\n}","options":{"raw":{"language":"json"}}},"url":"https://my-pet-store-api.vercel.app/users/updatePassword","description":"<h2 id=\"update-password\">Update Password</h2>\n<p>Change the authenticated user's password. Updates <code>logOutTime</code> to invalidate previous tokens.</p>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>token</code></td>\n<td>JWT token from Sign In</td>\n<td>✅ Yes</td>\n</tr>\n<tr>\n<td><code>Content-Type</code></td>\n<td><code>application/json</code></td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"body-raw-json\">Body <code>raw (json)</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"oldPassword\": \"SecurePass123\",\n  \"newPassword\": \"NewSecurePass456\",\n  \"confirmPassword\": \"NewSecurePass456\"\n}\n</code></pre>\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>Rules</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>oldPassword</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>Current password</td>\n</tr>\n<tr>\n<td><code>newPassword</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>Min 8 characters</td>\n</tr>\n<tr>\n<td><code>confirmPassword</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>Must match <code>newPassword</code></td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--200-ok\">Success Response — <code>200 OK</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"message\": \"done!\" }\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td><code>Token Not Provide</code> / <code>Invalid Token</code> / <code>User Not Found</code></td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td><code>Invalid old Password</code></td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Validation error</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["users","updatePassword"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"08a2754b-59b2-48e2-b50f-bcbef6a45479"}],"id":"c549c437-47ef-429e-88a2-7932b8befaed","description":"<p>Endpoints for registration, login, and password management.</p>\n","_postman_id":"c549c437-47ef-429e-88a2-7932b8befaed"},{"name":"User","item":[{"name":"Get Profile","id":"621b9c24-d04b-47ce-833e-3d81851396e8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"token","value":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NGYxYTJiM2M0ZDVlNmY3YThiOWMwZDEiLCJpYXQiOjE3MDAwMDAwMDB9.abc123","description":"<p>Required — JWT token from Sign In</p>\n"}],"url":"https://my-pet-store-api.vercel.app/users/profile","description":"<h2 id=\"get-profile\">Get Profile</h2>\n<p>Fetch the authenticated user's profile. Phone is returned <strong>decrypted</strong>. Sensitive fields (<code>password</code>, <code>createdAt</code>, <code>updatedAt</code>, <code>__v</code>) are excluded.</p>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>token</code></td>\n<td>JWT token from Sign In</td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--200-ok\">Success Response — <code>200 OK</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"done!\",\n  \"data\": {\n    \"_id\": \"64f1a2b3c4d5e6f7a8b9c0d1\",\n    \"firstName\": \"Diaa\",\n    \"lastName\": \"Eldeen\",\n    \"userName\": \"Diaa Eldeen\",\n    \"email\": \"diaa.eldeen@gmail.com\",\n    \"age\": 22,\n    \"gender\": \"male\",\n    \"phone\": \"01012345678\",\n    \"addresses\": []\n  }\n}\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td><code>Token Not Provide</code> / <code>Invalid Token</code> / <code>User Not Found</code></td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["users","profile"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"621b9c24-d04b-47ce-833e-3d81851396e8"},{"name":"Update Profile","id":"17da6957-97ae-4444-8e58-70771154a2a6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[{"key":"token","value":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NGYxYTJiM2M0ZDVlNmY3YThiOWMwZDEiLCJpYXQiOjE3MDAwMDAwMDB9.abc123","description":"<p>Required — JWT token from Sign In</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>Required</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"firstName\": \"Diaa\",\n  \"lastName\": \"Eldeen\",\n  \"gender\": \"male\",\n  \"phone\": \"01098765432\",\n  \"age\": 23\n}","options":{"raw":{"language":"json"}}},"url":"https://my-pet-store-api.vercel.app/users/updateProfile","description":"<h2 id=\"update-profile\">Update Profile</h2>\n<p>Update profile info. All fields are optional — send only the fields you want to update. <code>phone</code> is encrypted before saving.</p>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>token</code></td>\n<td>JWT token from Sign In</td>\n<td>✅ Yes</td>\n</tr>\n<tr>\n<td><code>Content-Type</code></td>\n<td><code>application/json</code></td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"body-raw-json\">Body <code>raw (json)</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"firstName\": \"Diaa\",\n  \"lastName\": \"Eldeen\",\n  \"gender\": \"male\",\n  \"phone\": \"01098765432\",\n  \"age\": 23\n}\n</code></pre>\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>Rules</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>firstName</code></td>\n<td>string</td>\n<td>⬜ No</td>\n<td>3–30 chars</td>\n</tr>\n<tr>\n<td><code>lastName</code></td>\n<td>string</td>\n<td>⬜ No</td>\n<td>3–30 chars</td>\n</tr>\n<tr>\n<td><code>gender</code></td>\n<td>string</td>\n<td>⬜ No</td>\n<td><code>male</code> or <code>female</code></td>\n</tr>\n<tr>\n<td><code>phone</code></td>\n<td>string</td>\n<td>⬜ No</td>\n<td>Egyptian: <code>010</code>/<code>011</code>/<code>012</code>/<code>015</code> + 8 digits</td>\n</tr>\n<tr>\n<td><code>age</code></td>\n<td>number</td>\n<td>⬜ No</td>\n<td>Integer, min 18</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--200-ok\">Success Response — <code>200 OK</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"done!\",\n  \"data\": { \"_id\": \"64f1a2b3c4d5e6f7a8b9c0d1\", \"firstName\": \"Diaa\", ... }\n}\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td><code>Token Not Provide</code> / <code>Invalid Token</code> / <code>User Not Found</code></td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Validation error</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["users","updateProfile"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"17da6957-97ae-4444-8e58-70771154a2a6"},{"name":"Add Address","id":"19fe399c-b6bb-4e26-8576-2253d211634a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"token","value":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NGYxYTJiM2M0ZDVlNmY3YThiOWMwZDEiLCJpYXQiOjE3MDAwMDAwMDB9.abc123","description":"<p>Required — JWT token from Sign In</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>Required</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"city\": \"Cairo\",\n  \"details\": \"123 Tahrir Square, Downtown\",\n  \"isDefault\": true\n}","options":{"raw":{"language":"json"}}},"url":"https://my-pet-store-api.vercel.app/users/address","description":"<h2 id=\"add-address\">Add Address</h2>\n<p>Add a delivery address. Max <strong>10 addresses</strong> per user. First address is always set as default automatically.</p>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>token</code></td>\n<td>JWT token from Sign In</td>\n<td>✅ Yes</td>\n</tr>\n<tr>\n<td><code>Content-Type</code></td>\n<td><code>application/json</code></td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"body-raw-json\">Body <code>raw (json)</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"city\": \"Cairo\",\n  \"details\": \"123 Tahrir Square, Downtown\",\n  \"isDefault\": true\n}\n</code></pre>\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>Rules</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>city</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>Min 2 characters</td>\n</tr>\n<tr>\n<td><code>details</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>Min 5 characters</td>\n</tr>\n<tr>\n<td><code>isDefault</code></td>\n<td>boolean</td>\n<td>⬜ No</td>\n<td><code>true</code> sets this as default</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--201-created\">Success Response — <code>201 Created</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"done!\",\n  \"data\": [\n    { \"_id\": \"64f1a2b3c4d5e6f7a8b9c0b1\", \"city\": \"Cairo\", \"details\": \"123 Tahrir Square, Downtown\", \"isDefault\": true }\n  ]\n}\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td><code>Token Not Provide</code> / <code>Invalid Token</code> / <code>User Not Found</code></td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td><code>City and details are required</code></td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td><code>Maximum 10 addresses allowed</code></td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Validation error</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["users","address"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"19fe399c-b6bb-4e26-8576-2253d211634a"},{"name":"Get Addresses","id":"598bcaa7-ce65-4881-84b5-68d9a22a823f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"token","value":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NGYxYTJiM2M0ZDVlNmY3YThiOWMwZDEiLCJpYXQiOjE3MDAwMDAwMDB9.abc123","description":"<p>Required — JWT token from Sign In</p>\n"}],"url":"https://my-pet-store-api.vercel.app/users/address","description":"<h2 id=\"get-addresses\">Get Addresses</h2>\n<p>Fetch all delivery addresses of the authenticated user.</p>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>token</code></td>\n<td>JWT token from Sign In</td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--200-ok\">Success Response — <code>200 OK</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"done!\",\n  \"data\": [\n    { \"_id\": \"64f1a2b3c4d5e6f7a8b9c0b1\", \"city\": \"Cairo\", \"details\": \"123 Tahrir Square\", \"isDefault\": true },\n    { \"_id\": \"64f1a2b3c4d5e6f7a8b9c0b2\", \"city\": \"Alexandria\", \"details\": \"45 Corniche Road\", \"isDefault\": false }\n  ]\n}\n</code></pre>\n<blockquote>\n<p>If no addresses, <code>data</code> returns an empty array <code>[]</code>.</p>\n</blockquote>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td><code>Token Not Provide</code> / <code>Invalid Token</code> / <code>User Not Found</code></td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["users","address"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"598bcaa7-ce65-4881-84b5-68d9a22a823f"},{"name":"Update Address","id":"a1515609-2962-4ba7-9ed0-3f671aa6adae","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[{"key":"token","value":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NGYxYTJiM2M0ZDVlNmY3YThiOWMwZDEiLCJpYXQiOjE3MDAwMDAwMDB9.abc123","description":"<p>Required — JWT token from Sign In</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>Required</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"city\": \"Giza\",\n  \"details\": \"10 Pyramids Road, Haram\",\n  \"isDefault\": true\n}","options":{"raw":{"language":"json"}}},"url":"https://my-pet-store-api.vercel.app/users/address/64f1a2b3c4d5e6f7a8b9c0b1","description":"<h2 id=\"update-address\">Update Address</h2>\n<p>Update an existing address. At least one field required. Setting <code>isDefault: false</code> only allowed if another default exists.</p>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>token</code></td>\n<td>JWT token from Sign In</td>\n<td>✅ Yes</td>\n</tr>\n<tr>\n<td><code>Content-Type</code></td>\n<td><code>application/json</code></td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"url-params\">URL Params</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>addressId</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>The <code>_id</code> of the address to update</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"body-raw-json\">Body <code>raw (json)</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"city\": \"Giza\",\n  \"details\": \"10 Pyramids Road, Haram\",\n  \"isDefault\": true\n}\n</code></pre>\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>Rules</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>city</code></td>\n<td>string</td>\n<td>⬜ No</td>\n<td>Min 2 characters</td>\n</tr>\n<tr>\n<td><code>details</code></td>\n<td>string</td>\n<td>⬜ No</td>\n<td>Min 5 characters</td>\n</tr>\n<tr>\n<td><code>isDefault</code></td>\n<td>boolean</td>\n<td>⬜ No</td>\n<td><code>true</code> to set as default</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--200-ok\">Success Response — <code>200 OK</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"done!\",\n  \"data\": [ { \"_id\": \"64f1a2b3c4d5e6f7a8b9c0b1\", \"city\": \"Giza\", \"isDefault\": true } ]\n}\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td><code>Token Not Provide</code> / <code>Invalid Token</code> / <code>User Not Found</code></td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td><code>Address not found</code></td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td><code>You must have at least one default address</code></td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Validation error</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["users","address","64f1a2b3c4d5e6f7a8b9c0b1"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"a1515609-2962-4ba7-9ed0-3f671aa6adae"},{"name":"Remove Address","id":"42ff98fb-f6bc-4316-9a0c-13879986eddd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"token","value":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NGYxYTJiM2M0ZDVlNmY3YThiOWMwZDEiLCJpYXQiOjE3MDAwMDAwMDB9.abc123","description":"<p>Required — JWT token from Sign In</p>\n"}],"url":"https://my-pet-store-api.vercel.app/users/address/64f1a2b3c4d5e6f7a8b9c0b1","description":"<h2 id=\"remove-address\">Remove Address</h2>\n<p>Delete an address. If deleted address was default, the first remaining address becomes default automatically.</p>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>token</code></td>\n<td>JWT token from Sign In</td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"url-params\">URL Params</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>addressId</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>The <code>_id</code> of the address to delete</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--200-ok\">Success Response — <code>200 OK</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"message\": \"Address removed\" }\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td><code>Token Not Provide</code> / <code>Invalid Token</code> / <code>User Not Found</code></td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td><code>Address not found</code></td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["users","address","64f1a2b3c4d5e6f7a8b9c0b1"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"42ff98fb-f6bc-4316-9a0c-13879986eddd"}],"id":"5b0840e1-eba2-44e2-bd71-9c74ae25a849","description":"<p>Profile and address book management.</p>\n","_postman_id":"5b0840e1-eba2-44e2-bd71-9c74ae25a849"},{"name":"Products","item":[{"name":"Get All Products","id":"88d28d1b-1b73-4a85-ba4f-dc72193cdd96","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://my-pet-store-api.vercel.app/products","description":"<h2 id=\"get-all-products\">Get All Products</h2>\n<p>Fetch all products. Returned in shuffled order. No authentication required.</p>\n<p>Pagination is <strong>optional</strong> — omit both params to get all products at once.</p>\n<hr />\n<h3 id=\"query-params-optional\">Query Params (Optional)</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Type</th>\n<th>Required</th>\n<th>Rules</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>page</code></td>\n<td>number</td>\n<td>⬜ No</td>\n<td>Min 1, default 1</td>\n</tr>\n<tr>\n<td><code>limit</code></td>\n<td>number</td>\n<td>⬜ No</td>\n<td>Min 1, max 50, default 10</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--200-ok-without-pagination\">Success Response — <code>200 OK</code> (without pagination)</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"done!\",\n  \"data\": [\n    {\n      \"_id\": \"64f1a2b3c4d5e6f7a8b9c0d2\",\n      \"name\": \"Royal Canin Adult Cat Food\",\n      \"price\": 250,\n      \"category\": \"cats\",\n      \"rating\": 4.5\n    }\n  ]\n}\n</code></pre>\n<h3 id=\"success-response--200-ok-with-pagination\">Success Response — <code>200 OK</code> (with pagination)</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"done!\",\n  \"data\": {\n    \"products\": [ { ... } ],\n    \"pagination\": { \"total\": 40, \"page\": 1, \"limit\": 10, \"totalPages\": 4 }\n  }\n}\n</code></pre>\n","urlObject":{"path":["products"],"host":["https://my-pet-store-api.vercel.app"],"query":[{"disabled":true,"description":{"content":"<p>Page number (min 1)</p>\n","type":"text/plain"},"key":"page","value":"1"},{"disabled":true,"description":{"content":"<p>Results per page (min 1, max 50)</p>\n","type":"text/plain"},"key":"limit","value":"10"}],"variable":[]}},"response":[],"_postman_id":"88d28d1b-1b73-4a85-ba4f-dc72193cdd96"},{"name":"Get Specific Product","id":"f9bf50d7-a214-47e8-8e16-dbe59dfeebc3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://my-pet-store-api.vercel.app/products/64f1a2b3c4d5e6f7a8b9c0d2","description":"<h2 id=\"get-specific-product\">Get Specific Product</h2>\n<p>Fetch a single product by its <code>_id</code>. No authentication required.</p>\n<hr />\n<h3 id=\"url-params\">URL Params</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>productId</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>MongoDB <code>_id</code> of the product</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--200-ok\">Success Response — <code>200 OK</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"done!\",\n  \"data\": {\n    \"_id\": \"64f1a2b3c4d5e6f7a8b9c0d2\",\n    \"name\": \"Royal Canin Adult Cat Food\",\n    \"slug\": \"royal-canin-adult-cat-food\",\n    \"description\": \"Premium dry cat food for adult cats\",\n    \"price\": 250,\n    \"image\": { \"secure_url\": \"https://res.cloudinary.com/...\", \"public_id\": \"myPetStore/...\" },\n    \"category\": \"cats\",\n    \"weight\": { \"value\": 2, \"unit\": \"kg\" },\n    \"rating\": 4.5\n  }\n}\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>404</code></td>\n<td><code>Product Not Found</code></td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["products","64f1a2b3c4d5e6f7a8b9c0d2"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"f9bf50d7-a214-47e8-8e16-dbe59dfeebc3"},{"name":"Filter Products","id":"d48ab29f-4bee-42ef-8dd3-e93993965357","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://my-pet-store-api.vercel.app/products/filter?category=cats&name=royal&minPrice=100&maxPrice=500","description":"<h2 id=\"filter-products\">Filter Products</h2>\n<p>Search and filter products. All params optional and combinable. No authentication required.</p>\n<hr />\n<h3 id=\"query-params-all-optional\">Query Params (All Optional)</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>category</code></td>\n<td>string</td>\n<td>⬜ No</td>\n<td><code>cats</code> / <code>dogs</code> / <code>birds</code> / <code>fish</code></td>\n</tr>\n<tr>\n<td><code>name</code></td>\n<td>string</td>\n<td>⬜ No</td>\n<td>Case-insensitive partial match</td>\n</tr>\n<tr>\n<td><code>minPrice</code></td>\n<td>number</td>\n<td>⬜ No</td>\n<td>Price &gt;= this value</td>\n</tr>\n<tr>\n<td><code>maxPrice</code></td>\n<td>number</td>\n<td>⬜ No</td>\n<td>Price &lt;= this value</td>\n</tr>\n<tr>\n<td><code>page</code></td>\n<td>number</td>\n<td>⬜ No</td>\n<td>Min 1, default 1</td>\n</tr>\n<tr>\n<td><code>limit</code></td>\n<td>number</td>\n<td>⬜ No</td>\n<td>Min 1, max 50, default 10</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--200-ok\">Success Response — <code>200 OK</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"done!\",\n  \"data\": [\n    { \"_id\": \"64f1a2b3c4d5e6f7a8b9c0d2\", \"name\": \"Royal Canin Adult Cat Food\", \"price\": 250, \"category\": \"cats\" }\n  ]\n}\n</code></pre>\n<blockquote>\n<p>If no products match, <code>data</code> returns <code>[]</code>.</p>\n</blockquote>\n","urlObject":{"path":["products","filter"],"host":["https://my-pet-store-api.vercel.app"],"query":[{"description":{"content":"<p>cats / dogs / birds / fish</p>\n","type":"text/plain"},"key":"category","value":"cats"},{"description":{"content":"<p>Case-insensitive partial match</p>\n","type":"text/plain"},"key":"name","value":"royal"},{"description":{"content":"<p>Minimum price (inclusive)</p>\n","type":"text/plain"},"key":"minPrice","value":"100"},{"description":{"content":"<p>Maximum price (inclusive)</p>\n","type":"text/plain"},"key":"maxPrice","value":"500"},{"disabled":true,"description":{"content":"<p>Page number</p>\n","type":"text/plain"},"key":"page","value":"1"},{"disabled":true,"description":{"content":"<p>Results per page (max 50)</p>\n","type":"text/plain"},"key":"limit","value":"10"}],"variable":[]}},"response":[],"_postman_id":"d48ab29f-4bee-42ef-8dd3-e93993965357"}],"id":"92fa7e79-423c-4002-b144-12532b523e30","description":"<p>Browse and filter products.</p>\n","_postman_id":"92fa7e79-423c-4002-b144-12532b523e30"},{"name":"Reviews","item":[{"name":"Get Product Reviews","id":"cb09bd28-6eb9-4453-bbbd-500379ba9040","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"https://my-pet-store-api.vercel.app/products/64f1a2b3c4d5e6f7a8b9c0d2/reviews","description":"<h2 id=\"get-product-reviews\">Get Product Reviews</h2>\n<p>Fetch all reviews for a product. Sorted by newest first. No authentication required.</p>\n<hr />\n<h3 id=\"url-params\">URL Params</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>productId</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>MongoDB <code>_id</code> of the product</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--200-ok\">Success Response — <code>200 OK</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"done!\",\n  \"data\": [\n    {\n      \"_id\": \"64f1a2b3c4d5e6f7a8b9c0a1\",\n      \"user\": { \"_id\": \"64f1a2b3c4d5e6f7a8b9c0d1\", \"firstName\": \"Diaa\", \"lastName\": \"Eldeen\", \"gender\": \"male\" },\n      \"product\": \"64f1a2b3c4d5e6f7a8b9c0d2\",\n      \"rating\": 5,\n      \"comment\": \"Great product, my cat loves it!\",\n      \"createdAt\": \"2026-04-15T10:00:00.000Z\"\n    }\n  ]\n}\n</code></pre>\n<blockquote>\n<p>If no reviews, <code>data</code> returns <code>[]</code>.</p>\n</blockquote>\n","urlObject":{"path":["products","64f1a2b3c4d5e6f7a8b9c0d2","reviews"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"cb09bd28-6eb9-4453-bbbd-500379ba9040"},{"name":"Add Review","id":"5dc1bd52-c5fe-482a-bef5-6a1aa5b304e8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"token","value":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NGYxYTJiM2M0ZDVlNmY3YThiOWMwZDEiLCJpYXQiOjE3MDAwMDAwMDB9.abc123","description":"<p>Required — JWT token from Sign In</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>Required</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"rating\": 5,\n  \"comment\": \"Great product, my cat loves it!\"\n}","options":{"raw":{"language":"json"}}},"url":"https://my-pet-store-api.vercel.app/products/64f1a2b3c4d5e6f7a8b9c0d2/reviews","description":"<h2 id=\"add-review\">Add Review</h2>\n<p>Submit a review. One review per user per product. Product rating is auto-recalculated.</p>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>token</code></td>\n<td>JWT token from Sign In</td>\n<td>✅ Yes</td>\n</tr>\n<tr>\n<td><code>Content-Type</code></td>\n<td><code>application/json</code></td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"url-params\">URL Params</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>productId</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>MongoDB <code>_id</code> of the product</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"body-raw-json\">Body <code>raw (json)</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"rating\": 5,\n  \"comment\": \"Great product, my cat loves it!\"\n}\n</code></pre>\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>Rules</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>rating</code></td>\n<td>number</td>\n<td>✅ Yes</td>\n<td>Integer between 1 and 5</td>\n</tr>\n<tr>\n<td><code>comment</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>Min 3 characters</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--201-created\">Success Response — <code>201 Created</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"done!\",\n  \"data\": { \"_id\": \"64f1a2b3c4d5e6f7a8b9c0a1\", \"rating\": 5, \"comment\": \"Great product, my cat loves it!\" }\n}\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td><code>Token Not Provide</code> / <code>Invalid Token</code> / <code>User Not Found</code></td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td><code>Product not found</code></td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td><code>You already reviewed this product</code></td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Validation error</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["products","64f1a2b3c4d5e6f7a8b9c0d2","reviews"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"5dc1bd52-c5fe-482a-bef5-6a1aa5b304e8"},{"name":"Update Review","id":"a78c150f-3276-4a32-b7f6-9eede1981776","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[{"key":"token","value":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NGYxYTJiM2M0ZDVlNmY3YThiOWMwZDEiLCJpYXQiOjE3MDAwMDAwMDB9.abc123","description":"<p>Required — JWT token from Sign In</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>Required</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"rating\": 4,\n  \"comment\": \"Still good but arrived a bit late\"\n}","options":{"raw":{"language":"json"}}},"url":"https://my-pet-store-api.vercel.app/products/64f1a2b3c4d5e6f7a8b9c0d2/reviews/64f1a2b3c4d5e6f7a8b9c0a1","description":"<h2 id=\"update-review\">Update Review</h2>\n<p>Update own review only. At least one field required. Product rating is auto-recalculated.</p>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>token</code></td>\n<td>JWT token from Sign In</td>\n<td>✅ Yes</td>\n</tr>\n<tr>\n<td><code>Content-Type</code></td>\n<td><code>application/json</code></td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"url-params\">URL Params</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>productId</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>MongoDB <code>_id</code> of the product</td>\n</tr>\n<tr>\n<td><code>reviewId</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>MongoDB <code>_id</code> of the review</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"body-raw-json\">Body <code>raw (json)</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"rating\": 4,\n  \"comment\": \"Still good but arrived a bit late\"\n}\n</code></pre>\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>Rules</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>rating</code></td>\n<td>number</td>\n<td>⬜ No</td>\n<td>Integer between 1 and 5</td>\n</tr>\n<tr>\n<td><code>comment</code></td>\n<td>string</td>\n<td>⬜ No</td>\n<td>Min 3 characters</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>At least one of <code>rating</code> or <code>comment</code> must be provided.</p>\n</blockquote>\n<hr />\n<h3 id=\"success-response--200-ok\">Success Response — <code>200 OK</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"done!\",\n  \"data\": { \"_id\": \"64f1a2b3c4d5e6f7a8b9c0a1\", \"rating\": 4, \"comment\": \"Still good but arrived a bit late\" }\n}\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td><code>Token Not Provide</code> / <code>Invalid Token</code> / <code>User Not Found</code></td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td><code>Review not found or not authorized</code></td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td><code>You must provide at least rating or comment</code></td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["products","64f1a2b3c4d5e6f7a8b9c0d2","reviews","64f1a2b3c4d5e6f7a8b9c0a1"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"a78c150f-3276-4a32-b7f6-9eede1981776"},{"name":"Delete Review","id":"b920cf63-96c2-40f5-973a-8dbcf7f4644e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"token","value":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NGYxYTJiM2M0ZDVlNmY3YThiOWMwZDEiLCJpYXQiOjE3MDAwMDAwMDB9.abc123","description":"<p>Required — JWT token from Sign In</p>\n"}],"url":"https://my-pet-store-api.vercel.app/products/64f1a2b3c4d5e6f7a8b9c0d2/reviews/64f1a2b3c4d5e6f7a8b9c0a1","description":"<h2 id=\"delete-review\">Delete Review</h2>\n<p>Delete own review only. Product rating is auto-recalculated.</p>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>token</code></td>\n<td>JWT token from Sign In</td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"url-params\">URL Params</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>productId</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>MongoDB <code>_id</code> of the product</td>\n</tr>\n<tr>\n<td><code>reviewId</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>MongoDB <code>_id</code> of the review</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--200-ok\">Success Response — <code>200 OK</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"message\": \"Review deleted successfully\" }\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td><code>Token Not Provide</code> / <code>Invalid Token</code> / <code>User Not Found</code></td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td><code>Review not found or not authorized</code></td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["products","64f1a2b3c4d5e6f7a8b9c0d2","reviews","64f1a2b3c4d5e6f7a8b9c0a1"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"b920cf63-96c2-40f5-973a-8dbcf7f4644e"}],"id":"ef3b447d-72fd-45f1-a095-c0772d1a260b","description":"<p>Product reviews — nested under /products/:productId/reviews. Rating is auto-recalculated after every operation.</p>\n","_postman_id":"ef3b447d-72fd-45f1-a095-c0772d1a260b"},{"name":"Wishlist","item":[{"name":"Add to Wishlist","id":"0d14e0b9-526b-45c7-b17e-9db86b975227","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"token","value":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NGYxYTJiM2M0ZDVlNmY3YThiOWMwZDEiLCJpYXQiOjE3MDAwMDAwMDB9.abc123","description":"<p>Required — JWT token from Sign In</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>Required</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"productId\": \"64f1a2b3c4d5e6f7a8b9c0d2\"\n}","options":{"raw":{"language":"json"}}},"url":"https://my-pet-store-api.vercel.app/wishlist","description":"<h2 id=\"add-to-wishlist\">Add to Wishlist</h2>\n<p>Add a product to the wishlist. Same product cannot be added twice (unique index on user + product).</p>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>token</code></td>\n<td>JWT token from Sign In</td>\n<td>✅ Yes</td>\n</tr>\n<tr>\n<td><code>Content-Type</code></td>\n<td><code>application/json</code></td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"body-raw-json\">Body <code>raw (json)</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"productId\": \"64f1a2b3c4d5e6f7a8b9c0d2\"\n}\n</code></pre>\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>productId</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>MongoDB <code>_id</code> of the product</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--201-created\">Success Response — <code>201 Created</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Added to wishlist\",\n  \"data\": {\n    \"_id\": \"64f1a2b3c4d5e6f7a8b9c0d9\",\n    \"user\": \"64f1a2b3c4d5e6f7a8b9c0d1\",\n    \"product\": \"64f1a2b3c4d5e6f7a8b9c0d2\",\n    \"createdAt\": \"2026-04-15T10:00:00.000Z\"\n  }\n}\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td><code>Token Not Provide</code> / <code>Invalid Token</code> / <code>User Not Found</code></td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td><code>ProductId is required</code></td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td><code>Product not found</code></td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td><code>Product already in wishlist</code></td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["wishlist"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"0d14e0b9-526b-45c7-b17e-9db86b975227"},{"name":"Get Wishlist","id":"4feee2a8-3b99-4a73-b120-42e11e7383d6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"token","value":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NGYxYTJiM2M0ZDVlNmY3YThiOWMwZDEiLCJpYXQiOjE3MDAwMDAwMDB9.abc123","description":"<p>Required — JWT token from Sign In</p>\n"}],"url":"https://my-pet-store-api.vercel.app/wishlist","description":"<h2 id=\"get-wishlist\">Get Wishlist</h2>\n<p>Fetch all wishlist items. Sorted newest first. Each item includes full product data.</p>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>token</code></td>\n<td>JWT token from Sign In</td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--200-ok\">Success Response — <code>200 OK</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"done!\",\n  \"data\": {\n    \"count\": 1,\n    \"wishlist\": [\n      {\n        \"_id\": \"64f1a2b3c4d5e6f7a8b9c0d9\",\n        \"product\": {\n          \"_id\": \"64f1a2b3c4d5e6f7a8b9c0d2\",\n          \"name\": \"Royal Canin Adult Cat Food\",\n          \"price\": 250,\n          \"category\": \"cats\",\n          \"rating\": 4.5\n        },\n        \"createdAt\": \"2026-04-15T10:00:00.000Z\"\n      }\n    ]\n  }\n}\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td><code>Token Not Provide</code> / <code>Invalid Token</code> / <code>User Not Found</code></td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["wishlist"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"4feee2a8-3b99-4a73-b120-42e11e7383d6"},{"name":"Remove from Wishlist","id":"153aae0b-ec14-4f91-ac8d-696c46dacc5c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"token","value":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NGYxYTJiM2M0ZDVlNmY3YThiOWMwZDEiLCJpYXQiOjE3MDAwMDAwMDB9.abc123","description":"<p>Required — JWT token from Sign In</p>\n"}],"url":"https://my-pet-store-api.vercel.app/wishlist/64f1a2b3c4d5e6f7a8b9c0d2","description":"<h2 id=\"remove-from-wishlist\">Remove from Wishlist</h2>\n<p>Remove a specific product from the wishlist.</p>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>token</code></td>\n<td>JWT token from Sign In</td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"url-params\">URL Params</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>productId</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>MongoDB <code>_id</code> of the product to remove</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--200-ok\">Success Response — <code>200 OK</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"message\": \"Removed from wishlist\" }\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td><code>Token Not Provide</code> / <code>Invalid Token</code> / <code>User Not Found</code></td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td><code>Item not found in wishlist</code></td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["wishlist","64f1a2b3c4d5e6f7a8b9c0d2"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"153aae0b-ec14-4f91-ac8d-696c46dacc5c"},{"name":"Clear Wishlist","id":"8b50f2fb-6504-4106-8049-e787cc3566ac","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"token","value":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NGYxYTJiM2M0ZDVlNmY3YThiOWMwZDEiLCJpYXQiOjE3MDAwMDAwMDB9.abc123","description":"<p>Required — JWT token from Sign In</p>\n"}],"url":"https://my-pet-store-api.vercel.app/wishlist","description":"<h2 id=\"clear-wishlist\">Clear Wishlist</h2>\n<p>Delete all products from the wishlist in one operation.</p>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>token</code></td>\n<td>JWT token from Sign In</td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--200-ok\">Success Response — <code>200 OK</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Wishlist cleared successfully\",\n  \"data\": { \"deletedCount\": 3 }\n}\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td><code>Token Not Provide</code> / <code>Invalid Token</code> / <code>User Not Found</code></td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td><code>Wishlist is already empty</code></td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["wishlist"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"8b50f2fb-6504-4106-8049-e787cc3566ac"}],"id":"da77528c-50b1-4a6e-9079-99aa6073095f","description":"<p>User wishlist — all endpoints require authentication. Same product cannot be added twice.</p>\n","_postman_id":"da77528c-50b1-4a6e-9079-99aa6073095f"},{"name":"Cart","item":[{"name":"Add to Cart","id":"8153d3cd-d724-4163-a2be-f5a314fdfa48","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"token","value":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NGYxYTJiM2M0ZDVlNmY3YThiOWMwZDEiLCJpYXQiOjE3MDAwMDAwMDB9.abc123","description":"<p>Required — JWT token from Sign In</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>Required</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"productId\": \"64f1a2b3c4d5e6f7a8b9c0d2\",\n  \"quantity\": 2\n}","options":{"raw":{"language":"json"}}},"url":"https://my-pet-store-api.vercel.app/cart","description":"<h2 id=\"add-to-cart\">Add to Cart</h2>\n<p>Add a product. If no cart exists, one is created. If product already in cart, quantity is <strong>incremented</strong>. Price is locked at the time of adding.</p>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>token</code></td>\n<td>JWT token from Sign In</td>\n<td>✅ Yes</td>\n</tr>\n<tr>\n<td><code>Content-Type</code></td>\n<td><code>application/json</code></td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"body-raw-json\">Body <code>raw (json)</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"productId\": \"64f1a2b3c4d5e6f7a8b9c0d2\",\n  \"quantity\": 2\n}\n</code></pre>\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>Rules</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>productId</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>MongoDB <code>_id</code> of the product</td>\n</tr>\n<tr>\n<td><code>quantity</code></td>\n<td>number</td>\n<td>⬜ No</td>\n<td>Min 1, defaults to <code>1</code></td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--200-ok\">Success Response — <code>200 OK</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"done!\",\n  \"data\": {\n    \"_id\": \"64f1a2b3c4d5e6f7a8b9c0e1\",\n    \"user\": \"64f1a2b3c4d5e6f7a8b9c0d1\",\n    \"products\": [ { \"product\": \"64f1a2b3c4d5e6f7a8b9c0d2\", \"quantity\": 2, \"price\": 250 } ],\n    \"totalPrice\": 500,\n    \"couponCode\": null,\n    \"discountAmount\": 0,\n    \"discountedPrice\": 0\n  }\n}\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td><code>Token Not Provide</code> / <code>Invalid Token</code> / <code>User Not Found</code></td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td><code>ProductId is required</code></td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td><code>Product not found</code></td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Validation error</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["cart"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"8153d3cd-d724-4163-a2be-f5a314fdfa48"},{"name":"Get Cart","id":"268ea88c-01d7-4504-a195-c6e7f8abcbd1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"token","value":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NGYxYTJiM2M0ZDVlNmY3YThiOWMwZDEiLCJpYXQiOjE3MDAwMDAwMDB9.abc123","description":"<p>Required — JWT token from Sign In</p>\n"}],"url":"https://my-pet-store-api.vercel.app/cart","description":"<h2 id=\"get-cart\">Get Cart</h2>\n<p>Fetch the current cart. Products are populated with <code>name</code>, <code>price</code>, and <code>image</code>. If no cart exists, an empty structure is returned.</p>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>token</code></td>\n<td>JWT token from Sign In</td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--200-ok-cart-exists\">Success Response — <code>200 OK</code> (cart exists)</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"done!\",\n  \"data\": {\n    \"_id\": \"64f1a2b3c4d5e6f7a8b9c0e1\",\n    \"products\": [\n      {\n        \"product\": { \"_id\": \"64f1a2b3c4d5e6f7a8b9c0d2\", \"name\": \"Royal Canin Adult Cat Food\", \"price\": 250, \"image\": { \"secure_url\": \"...\" } },\n        \"quantity\": 2,\n        \"price\": 250\n      }\n    ],\n    \"totalPrice\": 500,\n    \"couponCode\": \"SAVE20\",\n    \"discountAmount\": 100,\n    \"discountedPrice\": 400\n  }\n}\n</code></pre>\n<h3 id=\"success-response--200-ok-empty-cart\">Success Response — <code>200 OK</code> (empty cart)</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Cart Is Empty !\",\n  \"data\": { \"products\": [], \"totalPrice\": 0 }\n}\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td><code>Token Not Provide</code> / <code>Invalid Token</code> / <code>User Not Found</code></td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["cart"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"268ea88c-01d7-4504-a195-c6e7f8abcbd1"},{"name":"Update Cart Quantity","id":"cef87304-0e68-4500-92f2-6594325ff53a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[{"key":"token","value":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NGYxYTJiM2M0ZDVlNmY3YThiOWMwZDEiLCJpYXQiOjE3MDAwMDAwMDB9.abc123","description":"<p>Required — JWT token from Sign In</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>Required</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"productId\": \"64f1a2b3c4d5e6f7a8b9c0d2\",\n  \"quantity\": 5\n}","options":{"raw":{"language":"json"}}},"url":"https://my-pet-store-api.vercel.app/cart","description":"<h2 id=\"update-cart-quantity\">Update Cart Quantity</h2>\n<p>Set a new quantity for a product in the cart. If quantity is <code>0</code> or less, the product is <strong>removed</strong> automatically.</p>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>token</code></td>\n<td>JWT token from Sign In</td>\n<td>✅ Yes</td>\n</tr>\n<tr>\n<td><code>Content-Type</code></td>\n<td><code>application/json</code></td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"body-raw-json\">Body <code>raw (json)</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"productId\": \"64f1a2b3c4d5e6f7a8b9c0d2\",\n  \"quantity\": 5\n}\n</code></pre>\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>Rules</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>productId</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>MongoDB <code>_id</code> of the product</td>\n</tr>\n<tr>\n<td><code>quantity</code></td>\n<td>number</td>\n<td>✅ Yes</td>\n<td>New quantity — <code>0</code> or less removes the product</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--200-ok\">Success Response — <code>200 OK</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"done!\",\n  \"data\": { \"totalPrice\": 1250, \"products\": [ { \"quantity\": 5, \"price\": 250 } ] }\n}\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td><code>Token Not Provide</code> / <code>Invalid Token</code> / <code>User Not Found</code></td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td><code>Cart not found</code></td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td><code>Product not in cart</code></td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Validation error</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["cart"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"cef87304-0e68-4500-92f2-6594325ff53a"},{"name":"Remove from Cart","id":"51ff3db1-e612-4e78-bc55-32ad889e9ec3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"token","value":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NGYxYTJiM2M0ZDVlNmY3YThiOWMwZDEiLCJpYXQiOjE3MDAwMDAwMDB9.abc123","description":"<p>Required — JWT token from Sign In</p>\n"}],"url":"https://my-pet-store-api.vercel.app/cart/64f1a2b3c4d5e6f7a8b9c0d2","description":"<h2 id=\"remove-from-cart\">Remove from Cart</h2>\n<p>Remove a specific product. <code>totalPrice</code> is recalculated automatically.</p>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>token</code></td>\n<td>JWT token from Sign In</td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"url-params\">URL Params</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>productId</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>MongoDB <code>_id</code> of the product to remove</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--200-ok\">Success Response — <code>200 OK</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"message\": \"Product removed\" }\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td><code>Token Not Provide</code> / <code>Invalid Token</code> / <code>User Not Found</code></td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td><code>Cart not found</code></td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td><code>Product not found in cart</code></td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["cart","64f1a2b3c4d5e6f7a8b9c0d2"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"51ff3db1-e612-4e78-bc55-32ad889e9ec3"},{"name":"Clear Cart","id":"8ad44a1b-d852-4571-b313-61fb3cbaa86f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"token","value":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NGYxYTJiM2M0ZDVlNmY3YThiOWMwZDEiLCJpYXQiOjE3MDAwMDAwMDB9.abc123","description":"<p>Required — JWT token from Sign In</p>\n"}],"url":"https://my-pet-store-api.vercel.app/cart","description":"<h2 id=\"clear-cart\">Clear Cart</h2>\n<p>Empty all products from the cart and reset <code>totalPrice</code>, <code>couponCode</code>, <code>discountAmount</code>, <code>discountedPrice</code> to defaults. Cart document is kept.</p>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>token</code></td>\n<td>JWT token from Sign In</td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--200-ok\">Success Response — <code>200 OK</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"message\": \"Cart cleared\" }\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td><code>Token Not Provide</code> / <code>Invalid Token</code> / <code>User Not Found</code></td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td><code>Cart not found</code></td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["cart"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"8ad44a1b-d852-4571-b313-61fb3cbaa86f"}],"id":"4e8f5cdd-9d0b-4c57-bc75-986642450a5a","description":"<p>Shopping cart — all endpoints require authentication. Each user has one cart. totalPrice is always recalculated automatically.</p>\n","_postman_id":"4e8f5cdd-9d0b-4c57-bc75-986642450a5a"},{"name":"Coupons","item":[{"name":"Apply Coupon","id":"bb474829-61a9-4efa-bf0e-32aef2bd1fe3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"token","value":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NGYxYTJiM2M0ZDVlNmY3YThiOWMwZDEiLCJpYXQiOjE3MDAwMDAwMDB9.abc123","description":"<p>Required — JWT token from Sign In</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>Required</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"code\": \"SAVE20\"\n}","options":{"raw":{"language":"json"}}},"url":"https://my-pet-store-api.vercel.app/coupons/apply","description":"<h2 id=\"apply-coupon\">Apply Coupon</h2>\n<p>Apply a coupon code to the cart. Updates <code>couponCode</code>, <code>discountAmount</code>, and <code>discountedPrice</code> on the cart directly. When the user places an order after this, the order will use <code>discountedPrice</code> automatically.</p>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>token</code></td>\n<td>JWT token from Sign In</td>\n<td>✅ Yes</td>\n</tr>\n<tr>\n<td><code>Content-Type</code></td>\n<td><code>application/json</code></td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"body-raw-json\">Body <code>raw (json)</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"code\": \"SAVE20\"\n}\n</code></pre>\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>Rules</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>code</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>Valid coupon code</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"coupon-validation-rules\">Coupon Validation Rules</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Check</th>\n<th>Error</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Code not found</td>\n<td><code>Coupon not found</code></td>\n</tr>\n<tr>\n<td>Coupon expired</td>\n<td><code>Coupon has expired</code></td>\n</tr>\n<tr>\n<td>Max usage reached</td>\n<td><code>Coupon has reached its maximum usage limit</code></td>\n</tr>\n<tr>\n<td>User already used it</td>\n<td><code>You have already used this coupon</code></td>\n</tr>\n<tr>\n<td>Cart is empty</td>\n<td><code>Cart is empty</code></td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--200-ok\">Success Response — <code>200 OK</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"Coupon applied successfully\",\n  \"data\": {\n    \"couponCode\": \"SAVE20\",\n    \"discountType\": \"percentage\",\n    \"discountValue\": 20,\n    \"originalPrice\": 500,\n    \"discountAmount\": 100,\n    \"discountedPrice\": 400\n  }\n}\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td><code>Token Not Provide</code> / <code>Invalid Token</code> / <code>User Not Found</code></td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td><code>Coupon not found</code></td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td><code>Coupon has expired</code></td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td><code>Coupon has reached its maximum usage limit</code></td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td><code>You have already used this coupon</code></td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td><code>Cart is empty</code></td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Validation error</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["coupons","apply"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"bb474829-61a9-4efa-bf0e-32aef2bd1fe3"},{"name":"Remove Coupon","id":"3e69d17d-6c97-4f97-b3fd-beabf599171a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"token","value":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NGYxYTJiM2M0ZDVlNmY3YThiOWMwZDEiLCJpYXQiOjE3MDAwMDAwMDB9.abc123","description":"<p>Required — JWT token from Sign In</p>\n"}],"url":"https://my-pet-store-api.vercel.app/coupons/remove","description":"<h2 id=\"remove-coupon\">Remove Coupon</h2>\n<p>Remove the applied coupon from the cart. Resets <code>couponCode</code>, <code>discountAmount</code>, and <code>discountedPrice</code> to defaults. Also removes the user from the coupon's <code>usedBy</code> list so the coupon becomes available again for this user.</p>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>token</code></td>\n<td>JWT token from Sign In</td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--200-ok\">Success Response — <code>200 OK</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"message\": \"Coupon removed successfully\" }\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td><code>Token Not Provide</code> / <code>Invalid Token</code> / <code>User Not Found</code></td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td><code>Cart not found</code></td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td><code>No coupon applied on this cart</code></td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["coupons","remove"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"3e69d17d-6c97-4f97-b3fd-beabf599171a"}],"id":"a79e071c-183d-472d-97d6-dc11ed460e6d","description":"<p>Coupon management. Apply a coupon to get a discount on totalPrice before placing an order.</p>\n<p><strong>Available Coupons:</strong> SAVE10 · SAVE20 · SAVE30 · SAVE50 · WELCOME15 · PETS25 · OFF50 · OFF100 · OFF200 · OFF500 · MYPETSSTORE · ENG.DIAA ELDEEN</p>\n<p><strong>Flow:</strong></p>\n<ol>\n<li>POST /coupons/apply → discount applied on cart (discountedPrice updated)</li>\n<li>POST /orders → order uses discountedPrice automatically</li>\n<li>DELETE /coupons/remove → remove coupon from cart if not needed</li>\n</ol>\n","_postman_id":"a79e071c-183d-472d-97d6-dc11ed460e6d"},{"name":"Orders","item":[{"name":"Create Order","id":"a224f933-20f9-489d-b951-9a712ee88278","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"token","value":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NGYxYTJiM2M0ZDVlNmY3YThiOWMwZDEiLCJpYXQiOjE3MDAwMDAwMDB9.abc123","description":"<p>Required — JWT token from Sign In</p>\n"},{"key":"Content-Type","value":"application/json","description":"<p>Required</p>\n"}],"body":{"mode":"raw","raw":"{\n  \"address\": \"123 Tahrir Square, Downtown, Cairo\",\n  \"phone\": \"01012345678\",\n  \"paymentMethod\": \"cash\"\n}","options":{"raw":{"language":"json"}}},"url":"https://my-pet-store-api.vercel.app/orders","description":"<h2 id=\"create-order\">Create Order</h2>\n<p>Place a new order using cart items. Cart is cleared after successful order.</p>\n<ul>\n<li>If a coupon was applied → order uses <code>discountedPrice</code></li>\n<li>If no coupon → order uses <code>totalPrice</code></li>\n<li><code>card</code> payment → returns a Stripe Checkout URL</li>\n</ul>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>token</code></td>\n<td>JWT token from Sign In</td>\n<td>✅ Yes</td>\n</tr>\n<tr>\n<td><code>Content-Type</code></td>\n<td><code>application/json</code></td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"body-raw-json\">Body <code>raw (json)</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"address\": \"123 Tahrir Square, Downtown, Cairo\",\n  \"phone\": \"01012345678\",\n  \"paymentMethod\": \"cash\"\n}\n</code></pre>\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>Rules</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>address</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>5–100 characters</td>\n</tr>\n<tr>\n<td><code>phone</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>Egyptian: <code>010</code>/<code>011</code>/<code>012</code>/<code>015</code> + 8 digits</td>\n</tr>\n<tr>\n<td><code>paymentMethod</code></td>\n<td>string</td>\n<td>⬜ No</td>\n<td><code>cash</code> or <code>card</code>, defaults to <code>cash</code></td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--201-created-cash\">Success Response — <code>201 Created</code> (cash)</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"done!\",\n  \"data\": {\n    \"_id\": \"64f1a2b3c4d5e6f7a8b9c0c1\",\n    \"orderNumber\": 1001,\n    \"user\": \"64f1a2b3c4d5e6f7a8b9c0d1\",\n    \"products\": [ { \"name\": \"Royal Canin Adult Cat Food\", \"quantity\": 2, \"price\": 250 } ],\n    \"totalPrice\": 400,\n    \"address\": \"123 Tahrir Square, Downtown, Cairo\",\n    \"phone\": \"01012345678\",\n    \"paymentMethod\": \"cash\",\n    \"couponCode\": \"SAVE20\",\n    \"status\": \"pending\",\n    \"isPaid\": false\n  }\n}\n</code></pre>\n<h3 id=\"success-response--200-ok-card\">Success Response — <code>200 OK</code> (card)</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"done!\",\n  \"data\": { \"url\": \"https://checkout.stripe.com/pay/cs_test_...\" }\n}\n</code></pre>\n<blockquote>\n<p>For card: redirect user to the returned <code>url</code> to complete payment on Stripe.</p>\n</blockquote>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td><code>Token Not Provide</code> / <code>Invalid Token</code> / <code>User Not Found</code></td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td><code>Address and phone required</code></td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td><code>Cart is empty</code></td>\n</tr>\n<tr>\n<td><code>422</code></td>\n<td>Validation error</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["orders"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"a224f933-20f9-489d-b951-9a712ee88278"},{"name":"Get My Orders","id":"a4ef39dc-2ae2-415d-9c5d-3189874a1ea0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"token","value":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NGYxYTJiM2M0ZDVlNmY3YThiOWMwZDEiLCJpYXQiOjE3MDAwMDAwMDB9.abc123","description":"<p>Required — JWT token from Sign In</p>\n"}],"url":"https://my-pet-store-api.vercel.app/orders","description":"<h2 id=\"get-my-orders\">Get My Orders</h2>\n<p>Fetch all orders placed by the authenticated user. Sorted newest first.</p>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>token</code></td>\n<td>JWT token from Sign In</td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--200-ok\">Success Response — <code>200 OK</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"message\": \"done!\",\n  \"data\": [\n    {\n      \"_id\": \"64f1a2b3c4d5e6f7a8b9c0c1\",\n      \"orderNumber\": 1001,\n      \"products\": [ { \"name\": \"Royal Canin Adult Cat Food\", \"quantity\": 2, \"price\": 250 } ],\n      \"totalPrice\": 400,\n      \"address\": \"123 Tahrir Square, Downtown, Cairo\",\n      \"phone\": \"01012345678\",\n      \"paymentMethod\": \"cash\",\n      \"couponCode\": \"SAVE20\",\n      \"status\": \"pending\",\n      \"isPaid\": false,\n      \"createdAt\": \"2026-04-15T10:00:00.000Z\"\n    }\n  ]\n}\n</code></pre>\n<blockquote>\n<p>If no orders, <code>data</code> returns <code>[]</code>.</p>\n</blockquote>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td><code>Token Not Provide</code> / <code>Invalid Token</code> / <code>User Not Found</code></td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["orders"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"a4ef39dc-2ae2-415d-9c5d-3189874a1ea0"},{"name":"Cancel Order","id":"fb484546-1051-4375-b140-e2d5b8b7a61b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[{"key":"token","value":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NGYxYTJiM2M0ZDVlNmY3YThiOWMwZDEiLCJpYXQiOjE3MDAwMDAwMDB9.abc123","description":"<p>Required — JWT token from Sign In</p>\n"}],"url":"https://my-pet-store-api.vercel.app/orders/64f1a2b3c4d5e6f7a8b9c0c1/cancel","description":"<h2 id=\"cancel-order\">Cancel Order</h2>\n<p>Cancel an order. Only allowed when status is <code>pending</code> or <code>confirmed</code>.</p>\n<hr />\n<h3 id=\"headers\">Headers</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Key</th>\n<th>Value</th>\n<th>Required</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>token</code></td>\n<td>JWT token from Sign In</td>\n<td>✅ Yes</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"url-params\">URL Params</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Param</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>orderId</code></td>\n<td>string</td>\n<td>✅ Yes</td>\n<td>MongoDB <code>_id</code> of the order</td>\n</tr>\n</tbody>\n</table>\n</div><hr />\n<h3 id=\"success-response--200-ok\">Success Response — <code>200 OK</code></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{ \"message\": \"Order cancelled\" }\n</code></pre>\n<h3 id=\"error-responses\">Error Responses</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Message</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>401</code></td>\n<td><code>Token Not Provide</code> / <code>Invalid Token</code> / <code>User Not Found</code></td>\n</tr>\n<tr>\n<td><code>404</code></td>\n<td><code>Order not found</code></td>\n</tr>\n<tr>\n<td><code>400</code></td>\n<td><code>Cannot cancel this order</code></td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["orders","64f1a2b3c4d5e6f7a8b9c0c1","cancel"],"host":["https://my-pet-store-api.vercel.app"],"query":[],"variable":[]}},"response":[],"_postman_id":"fb484546-1051-4375-b140-e2d5b8b7a61b"}],"id":"5b0c4078-724c-4682-b12e-62f1a054586a","description":"<p>Order management.</p>\n<p><strong>Payment Flow:</strong></p>\n<ul>\n<li><code>cash</code> → order created immediately, cart cleared</li>\n<li><code>card</code> → Stripe Checkout URL returned, order created via webhook after payment</li>\n</ul>\n<p><strong>Order Status Flow:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>pending → confirmed (auto after 6h) → shipped (auto 24h after confirmed) → delivered\n       ↘                           ↘\n        cancelled                   cancelled\n</code></pre><p>Cancellation only allowed at <code>pending</code> or <code>confirmed</code> status.</p>\n","_postman_id":"5b0c4078-724c-4682-b12e-62f1a054586a"}],"variable":[{"key":"baseUrl","value":"https://my-pet-store-api.vercel.app"}]}