{
  "info": {
    "_postman_id": "d6b2e45c-866b-40a8-895a-6347ecda1c11",
    "name": "ESNTLS API - Latest",
    "description": "Complete collection generated from the current OpenAPI contract. Includes all Admin, mobile, expert, CMS, rescheduling and trip tracking APIs. Set your own token and ID variables. Optional query/form fields are disabled until needed. No credentials are included.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [
    {
      "key": "base_url",
      "value": "https://esntlsapi.aquaninjas.in/api",
      "type": "string"
    },
    {
      "key": "auth_token",
      "value": "",
      "type": "string"
    },
    {
      "key": "mobile_token",
      "value": "",
      "type": "string"
    },
    {
      "key": "expert_token",
      "value": "",
      "type": "string"
    },
    {
      "key": "trip_id",
      "value": "",
      "type": "string"
    },
    {
      "key": "registration_token",
      "value": "",
      "type": "string"
    },
    {
      "key": "razorpay_webhook_signature",
      "value": "",
      "type": "string"
    },
    {
      "key": "razorpay_signature",
      "value": "",
      "type": "string"
    },
    {
      "key": "work_photo_base64",
      "value": "",
      "type": "string"
    },
    {
      "key": "fcm_token",
      "value": "",
      "type": "string"
    },
    {
      "key": "installation_id",
      "value": "",
      "type": "string"
    },
    {
      "key": "job_id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "notification_id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "customer_id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "expert_id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "tip_id",
      "value": "90cbdaf7-6258-491f-99e8-0cc12fa688f8",
      "type": "string"
    },
    {
      "key": "role_id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "configuration_id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "document_type",
      "value": "profile-photo",
      "type": "string"
    },
    {
      "key": "document_index",
      "value": "0",
      "type": "string"
    },
    {
      "key": "id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "slug",
      "value": "terms-and-conditions",
      "type": "string"
    },
    {
      "key": "department_id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "staff_id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "pause_id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "category_id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "addon_id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "service_id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "state_id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "city_id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "variant_id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "skill_id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "note_id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "question_id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "audit_log_id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "faq_id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "address_id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "checkout_session_id",
      "value": "",
      "type": "string"
    },
    {
      "key": "attachment_id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "place_id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "subcategory_id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "order_id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "coupon_id",
      "value": "1",
      "type": "string"
    },
    {
      "key": "stage",
      "value": "before",
      "type": "string"
    },
    {
      "key": "request_id",
      "value": "1",
      "type": "string"
    }
  ],
  "item": [
    {
      "name": "Mobile Orders",
      "item": [
        {
          "name": "PATCH /mobile/jobs/{job_id}/address",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/jobs/{{job_id}}/address",
            "description": "Change only this owned upcoming job service address to another owned saved address. Same city/state only; active location/service coverage and emergency pauses are checked. Cross-postcode changes on discounted bookings require support review. Existing receiver contact, expert, schedule, charges, coupon, wallet and payment remain unchanged. Reject past/started/terminal/OTP-verified jobs and Sharing/Arrived trips. Updates x.job.address and job history; parent order address and sibling jobs remain unchanged. Use each jobs[].address for its current service location, not the original order address. Customer push/inbox uses the existing notification worker when enabled. Read fresh job details in each client after a change.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"address_id\": 37\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "PATCH /mobile/jobs/{job_id}/receiver-contact",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/jobs/{{job_id}}/receiver-contact",
            "description": "Update receiver name and 10-digit Indian mobile number for only this owned upcoming job. No +91 prefix in receiver_phone. Does not change the customer profile or saved address. Same pre-start/time/trip guards as address update. x.job.address contains updated receiver_name and receiver_phone; changed=false means no duplicate history or push. Existing customer field is the booking owner, not the receiver. Clients must display the receiver fields in job.address and fetch fresh details.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"receiver_name\": \"Service receiver\",\n  \"receiver_phone\": \"9876543210\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /mobile/checkout-settings",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/checkout-settings",
            "description": "Read current Admin-configured customer checkout GST rate and fixed platform fee. Customer token required. No request body. Fetch whenever opening the cart; do not hard-code or persist rates. x.gst.rate is a percentage, tax-exclusive on service subtotal including add-ons; x.platform_fee.amount is INR per order and excluded from the current GST base. Wallet is payment, not a tax discount. This is configuration, not a cart quote: coupon rules may affect totals. Always use POST /mobile/orders returned amounts for payment. Does not expose commission, withholding, secrets or internal settings. Returns 503 rather than fallback charges if configuration is unavailable. No new invoice tax policy is introduced."
          },
          "response": []
        },
        {
          "name": "POST /mobile/jobs/{job_id}/reschedule",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/jobs/{{job_id}}/reschedule",
            "description": "Reschedule one upcoming customer-owned job in Asia/Kolkata. Preserve slot duration, assigned expert, price and payment. Conflicts return 422 without changes; identical retries are a no-op. Started/terminal jobs and unpaid checkout sessions cannot be rescheduled.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"scheduled_date\": \"2026-11-05\",\n  \"slot_start\": \"10:00\",\n  \"slot_end\": \"11:00\",\n  \"note\": \"Please move my booking to this slot\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /mobile/orders",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/mobile/orders",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "mobile",
                "orders"
              ],
              "query": [
                {
                  "key": "booking_time",
                  "value": "last_30_days",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "5",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "List the signed-in customer’s confirmed orders plus every unpaid Admin-created Razorpay payment-link booking. Optional booking_time filters both groups by booking creation time: last_7_days, last_30_days, a four-digit year such as 2026, or older for records before the previous India calendar year. Omitting it returns every booking. An unpaid Admin booking remains in the Upcoming screen until payment succeeds. It is returned as an is_pending_payment entry with a usable payment_link, scheduled service details, and service image URLs; an expired hosted URL is refreshed automatically without removing the booking. Confirmed jobs include their four-digit start_otp, catalog_service.image_urls and primary_image_url as absolute service image URLs, and expert.profile_image_url when an assigned expert photo is available."
          },
          "response": []
        },
        {
          "name": "GET /mobile/orders/{order_id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/orders/{{order_id}}",
            "description": "Get one customer-owned order with job history, start OTPs and media. x.order.payment_breakdown shows saved base service, add-ons, coupon discount, GST, platform fee, checkout adjustment, total and wallet split. Credited tips are separate and excluded from the booking total."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Customer Notifications",
      "item": [
        {
          "name": "POST /mobile/push-devices",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/push-devices",
            "description": "Register or refresh the signed-in customer device after Firebase token refresh/login. Use a stable installation UUID. Up to 20 active devices; do not send customer_id. Token ownership moves atomically on account switch. Never returns raw tokens.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"fcm_token\": \"{{fcm_token}}\",\n  \"platform\": \"android\",\n  \"installation_id\": \"{{installation_id}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "DELETE /mobile/push-devices",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/push-devices",
            "description": "Before logout, unregister this device while the customer JWT is still available. Do not unregister all customer devices. Also delete the local Firebase token on account switch when supported.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"fcm_token\": \"{{fcm_token}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /mobile/notifications",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/mobile/notifications",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "mobile",
                "notifications"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "20",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "unread_only",
                  "value": "false",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "Bell inbox for authenticated customer, newest first. Returns x.notifications, x.unread_count, x.pagination. Persistent independently of push permission or FCM delivery. Never returns device tokens, internal notes or OTPs."
          },
          "response": []
        },
        {
          "name": "GET /mobile/notifications/unread-count",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/notifications/unread-count",
            "description": "Return x.unread_count for the current customer bell badge. Opening the list does not automatically mark notifications read."
          },
          "response": []
        },
        {
          "name": "PATCH /mobile/notifications/read-all",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/notifications/read-all",
            "description": "Mark current customer notifications read through an optional ISO before cutoff. Omit before to use server current time. Newer notifications remain unread.",
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /mobile/notifications/{notification_id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/notifications/{{notification_id}}",
            "description": "Read one owned notification. Other customers receive 404. data.screen and IDs describe the destination; fetch fresh authorized order/job details instead of trusting a push snapshot."
          },
          "response": []
        },
        {
          "name": "PATCH /mobile/notifications/{notification_id}/read",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/notifications/{{notification_id}}/read",
            "description": "Idempotently mark one owned notification read. Does not change another account or send a push.",
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        }
      ]
    },
    {
      "name": "Customer Wallet",
      "item": [
        {
          "name": "GET /mobile/wallet",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/mobile/wallet",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "mobile",
                "wallet"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "20",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "transaction_type",
                  "value": "",
                  "disabled": true,
                  "description": "Optional exact wallet transaction type filter."
                }
              ]
            },
            "description": "Return the signed-in customer wallet balance and immutable ledger, newest first. Credits never expire. The app must use this API as the source of truth before displaying wallet funds or starting checkout."
          },
          "response": []
        },
        {
          "name": "GET /customers/{customer_id}/wallet",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/customers/{{customer_id}}/wallet",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "customers",
                "{{customer_id}}",
                "wallet"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "20",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "transaction_type",
                  "value": "",
                  "disabled": true,
                  "description": "Optional exact wallet transaction type filter."
                }
              ]
            },
            "description": "Admin Customer 360 wallet balance and immutable ledger for one customer."
          },
          "response": []
        },
        {
          "name": "POST /customers/{customer_id}/wallet/adjustments",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/customers/{{customer_id}}/wallet/adjustments",
            "description": "Admin-only manual wallet credit or debit. reason and reference are mandatory and every successful change is permanently auditable.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"direction\": \"Credit\",\n  \"amount\": 250,\n  \"reason\": \"Approved service recovery credit\",\n  \"reference\": \"CASE-2026-001\",\n  \"note\": \"Customer support approval recorded.\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /wallet-ledger",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/wallet-ledger",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "wallet-ledger"
              ],
              "query": [
                {
                  "key": "customer_id",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "direction",
                  "value": "All",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "transaction_type",
                  "value": "",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "from",
                  "value": "",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "to",
                  "value": "",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "25",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "Admin-only global wallet ledger with optional customer, direction, transaction type, and date filters. Use page and limit for exports or review."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Super Admin Authentication",
      "item": [
        {
          "name": "POST /verify-login-2fa-sa",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/verify-login-2fa-sa",
            "description": "Verify the emailed four-digit login OTP after a two_factor_required response.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"email\": \"admin@example.com\",\n  \"otp\": \"1234\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /login-sa",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/login-sa",
            "description": "Sign in as a super admin",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"email\": \"admin@example.com\",\n  \"password\": \"Your password\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /forgot-password-sa",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/forgot-password-sa",
            "description": "Send a password reset OTP",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"email\": \"admin@example.com\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /verify-forgot-password-otp-sa",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/verify-forgot-password-otp-sa",
            "description": "Verify password reset OTP",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"email\": \"admin@example.com\",\n  \"otp\": \"123456\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /reset-password-sa",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/reset-password-sa",
            "description": "Reset super admin password",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"email\": \"admin@example.com\",\n  \"otp\": \"123456\",\n  \"password\": \"New password\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        }
      ]
    },
    {
      "name": "Finance",
      "item": [
        {
          "name": "POST /webhooks/razorpay",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "x-razorpay-signature",
                "value": "{{razorpay_webhook_signature}}",
                "disabled": false
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/webhooks/razorpay",
            "description": "Razorpay webhook receiver. Hosted bookings use payment_link.paid; expert tips use payment.captured or order.paid. Requires the provider HMAC of the exact raw request body. Do not replay real paid events or use a customer/admin token as a substitute.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"event\": \"payment_link.paid\",\n  \"payload\": {}\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /finance/dashboard",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/finance/dashboard",
            "description": "Get live payment, transaction, finance-ledger, GST, and current payout analytics for the Admin Payments page."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Expert Wallet",
      "item": [
        {
          "name": "GET /expert/wallet",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{expert_token}}",
                  "type": "string"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/expert/wallet",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "expert",
                "wallet"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "20",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "Get the signed-in expert wallet and newest-first paginated transaction history, including tip source and booking reference."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "auth": {
                  "type": "bearer",
                  "bearer": [
                    {
                      "key": "token",
                      "value": "{{expert_token}}",
                      "type": "string"
                    }
                  ]
                },
                "url": {
                  "raw": "{{base_url}}/expert/wallet",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "expert",
                    "wallet"
                  ],
                  "query": [
                    {
                      "key": "page",
                      "value": "1",
                      "disabled": true,
                      "description": ""
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "disabled": true,
                      "description": ""
                    }
                  ]
                },
                "description": "Get the signed-in expert wallet and newest-first paginated transaction history, including tip source and booking reference."
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": true,\n  \"message\": \"Expert wallet fetched\",\n  \"x\": {\n    \"wallet\": {\n      \"expert_id\": 5,\n      \"available_balance\": 20,\n      \"available_balance_paise\": 2000,\n      \"currency\": \"INR\"\n    },\n    \"transactions\": [\n      {\n        \"id\": \"1\",\n        \"type\": \"tip_credit\",\n        \"amount\": 20,\n        \"amount_paise\": 2000,\n        \"currency\": \"INR\",\n        \"source\": \"Customer tip via Razorpay\",\n        \"customer_name\": \"Example Customer\",\n        \"job_id\": 54,\n        \"job_code\": \"ESJ-000054\",\n        \"tip_id\": \"90cbdaf7-6258-491f-99e8-0cc12fa688f8\",\n        \"payment_reference\": \"pay_XXXXXXXXXXXXXX\",\n        \"created_at\": \"2026-11-09T10:00:00.000Z\"\n      }\n    ],\n    \"pagination\": {\n      \"page\": 1,\n      \"limit\": 20,\n      \"total\": 1,\n      \"total_pages\": 1,\n      \"has_next\": false\n    }\n  },\n  \"errors\": null\n}"
            }
          ]
        },
        {
          "name": "GET /experts/{expert_id}/wallet",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/experts/{{expert_id}}/wallet",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "experts",
                "{{expert_id}}",
                "wallet"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "20",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "Read an expert wallet and transaction history in Expert Management. Super Admin only."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "auth": {
                  "type": "bearer",
                  "bearer": [
                    {
                      "key": "token",
                      "value": "{{auth_token}}",
                      "type": "string"
                    }
                  ]
                },
                "url": {
                  "raw": "{{base_url}}/experts/{{expert_id}}/wallet",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "experts",
                    "{{expert_id}}",
                    "wallet"
                  ],
                  "query": [
                    {
                      "key": "page",
                      "value": "1",
                      "disabled": true,
                      "description": ""
                    },
                    {
                      "key": "limit",
                      "value": "20",
                      "disabled": true,
                      "description": ""
                    }
                  ]
                },
                "description": "Read an expert wallet and transaction history in Expert Management. Super Admin only."
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": true,\n  \"message\": \"Expert wallet fetched\",\n  \"x\": {\n    \"wallet\": {\n      \"expert_id\": 5,\n      \"available_balance\": 20,\n      \"available_balance_paise\": 2000,\n      \"currency\": \"INR\"\n    },\n    \"transactions\": [\n      {\n        \"id\": \"1\",\n        \"type\": \"tip_credit\",\n        \"amount\": 20,\n        \"amount_paise\": 2000,\n        \"currency\": \"INR\",\n        \"source\": \"Customer tip via Razorpay\",\n        \"customer_name\": \"Example Customer\",\n        \"job_id\": 54,\n        \"job_code\": \"ESJ-000054\",\n        \"tip_id\": \"90cbdaf7-6258-491f-99e8-0cc12fa688f8\",\n        \"payment_reference\": \"pay_XXXXXXXXXXXXXX\",\n        \"created_at\": \"2026-11-09T10:00:00.000Z\"\n      }\n    ],\n    \"pagination\": {\n      \"page\": 1,\n      \"limit\": 20,\n      \"total\": 1,\n      \"total_pages\": 1,\n      \"has_next\": false\n    }\n  },\n  \"errors\": null\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Expert Tips",
      "item": [
        {
          "name": "POST /mobile/jobs/{job_id}/tips",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/jobs/{{job_id}}/tips",
            "description": "Create a separate Razorpay checkout in the configured mode for an owned job and its assigned expert. Amount is INR 1 to 10000. Reuse the same UUID v4 idempotency key for retries. Optional expected_expert_id checks the displayed recipient. The app decides when to display tipping.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": 20,\n  \"idempotency_key\": \"a73a712c-9109-4c4a-b5e4-eb9de230ba1e\",\n  \"expected_expert_id\": 5\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "auth": {
                  "type": "bearer",
                  "bearer": [
                    {
                      "key": "token",
                      "value": "{{mobile_token}}",
                      "type": "string"
                    }
                  ]
                },
                "url": "{{base_url}}/mobile/jobs/{{job_id}}/tips",
                "description": "Create a separate Razorpay checkout in the configured mode for an owned job and its assigned expert. Amount is INR 1 to 10000. Reuse the same UUID v4 idempotency key for retries. Optional expected_expert_id checks the displayed recipient. The app decides when to display tipping.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": 20,\n  \"idempotency_key\": \"a73a712c-9109-4c4a-b5e4-eb9de230ba1e\",\n  \"expected_expert_id\": 5\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": true,\n  \"message\": \"Tip checkout ready\",\n  \"x\": {\n    \"tip\": {\n      \"id\": \"90cbdaf7-6258-491f-99e8-0cc12fa688f8\",\n      \"job_id\": 54,\n      \"job_code\": \"ESJ-000054\",\n      \"expert\": {\n        \"id\": 5,\n        \"name\": \"Example Expert\"\n      },\n      \"amount\": 20,\n      \"amount_paise\": 2000,\n      \"currency\": \"INR\",\n      \"payment_mode\": \"live\",\n      \"status\": \"pending\",\n      \"credited_at\": null\n    },\n    \"checkout\": {\n      \"key_id\": \"rzp_live_EXAMPLE\",\n      \"razorpay_order_id\": \"order_XXXXXXXXXXXXXX\",\n      \"amount\": 2000,\n      \"currency\": \"INR\"\n    }\n  },\n  \"errors\": null\n}"
            }
          ]
        },
        {
          "name": "GET /mobile/jobs/{job_id}/tips/{tip_id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/jobs/{{job_id}}/tips/{{tip_id}}",
            "description": "Read an owned tip: pending, credited (real wallet credit), or test_paid (sandbox only; no wallet credit). payment_mode identifies the original gateway mode."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "auth": {
                  "type": "bearer",
                  "bearer": [
                    {
                      "key": "token",
                      "value": "{{mobile_token}}",
                      "type": "string"
                    }
                  ]
                },
                "url": "{{base_url}}/mobile/jobs/{{job_id}}/tips/{{tip_id}}",
                "description": "Read an owned tip: pending, credited (real wallet credit), or test_paid (sandbox only; no wallet credit). payment_mode identifies the original gateway mode."
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": true,\n  \"message\": \"Tip status fetched\",\n  \"x\": {\n    \"tip\": {\n      \"id\": \"90cbdaf7-6258-491f-99e8-0cc12fa688f8\",\n      \"job_id\": 54,\n      \"job_code\": \"ESJ-000054\",\n      \"expert\": {\n        \"id\": 5,\n        \"name\": \"Example Expert\"\n      },\n      \"amount\": 20,\n      \"amount_paise\": 2000,\n      \"currency\": \"INR\",\n      \"payment_mode\": \"live\",\n      \"status\": \"pending\",\n      \"credited_at\": null\n    }\n  },\n  \"errors\": null\n}"
            }
          ]
        },
        {
          "name": "POST /mobile/jobs/{job_id}/tips/{tip_id}/verify-payment",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/jobs/{{job_id}}/tips/{{tip_id}}/verify-payment",
            "description": "Verify the Razorpay callback and captured payment using the original checkout mode. Live tips credit the wallet once; test tips return test_paid without wallet credit. Retry verification if capture is pending; do not start another checkout.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"razorpay_order_id\": \"order_XXXXXXXXXXXXXX\",\n  \"razorpay_payment_id\": \"pay_XXXXXXXXXXXXXX\",\n  \"razorpay_signature\": \"{{razorpay_signature}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "auth": {
                  "type": "bearer",
                  "bearer": [
                    {
                      "key": "token",
                      "value": "{{mobile_token}}",
                      "type": "string"
                    }
                  ]
                },
                "url": "{{base_url}}/mobile/jobs/{{job_id}}/tips/{{tip_id}}/verify-payment",
                "description": "Verify the Razorpay callback and captured payment using the original checkout mode. Live tips credit the wallet once; test tips return test_paid without wallet credit. Retry verification if capture is pending; do not start another checkout.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"razorpay_order_id\": \"order_XXXXXXXXXXXXXX\",\n  \"razorpay_payment_id\": \"pay_XXXXXXXXXXXXXX\",\n  \"razorpay_signature\": \"{{razorpay_signature}}\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": true,\n  \"message\": \"Tip credited to the expert wallet\",\n  \"x\": {\n    \"tip\": {\n      \"id\": \"90cbdaf7-6258-491f-99e8-0cc12fa688f8\",\n      \"job_id\": 54,\n      \"job_code\": \"ESJ-000054\",\n      \"expert\": {\n        \"id\": 5,\n        \"name\": \"Example Expert\"\n      },\n      \"amount\": 20,\n      \"amount_paise\": 2000,\n      \"currency\": \"INR\",\n      \"payment_mode\": \"live\",\n      \"status\": \"credited\",\n      \"credited_at\": \"2026-11-09T10:00:00.000Z\"\n    }\n  },\n  \"errors\": null\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Expert Mobile App",
      "item": [
        {
          "name": "POST /expert/auth/validate-registration-profile",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/expert/auth/validate-registration-profile",
            "description": "Validate onboarding profile with its temporary registration token, before verification.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"registration_token\": \"{{registration_token}}\",\n  \"name\": \"Example Expert\",\n  \"email\": \"expert@example.com\",\n  \"address\": \"Example address\",\n  \"city_name\": \"Kolkata\",\n  \"pincode\": \"700001\",\n  \"date_of_birth\": \"1995-01-01\",\n  \"gender\": \"Male\",\n  \"is_business_user\": false\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /expert/verification/bank/verify",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/expert/verification/bank/verify",
            "description": "Verify bank information using a temporary registration token after Aadhaar/PAN verification. Supply consented test details only in provider sandbox.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"registration_token\": \"{{registration_token}}\",\n  \"bank_name\": \"\",\n  \"bank_account_holder_name\": \"\",\n  \"account_number\": \"\",\n  \"bank_ifsc_code\": \"\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "PATCH /expert/jobs/{job_id}/status",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{expert_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/expert/jobs/{{job_id}}/status",
            "description": "Alias for the expert PUT status endpoint. In Progress requires the customer start OTP; professional cancellations require an active cancellation_reason_id.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"status\": \"In Progress\",\n  \"start_otp\": \"1234\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "PUT /expert/jobs/{job_id}/status",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{expert_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/expert/jobs/{{job_id}}/status",
            "description": "Update an assigned job to an Expert-permitted lifecycle status. Moving to In Progress requires the four-digit start_otp shown in the customer booking. Cancellation requires an active cancellation reason.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"status\": \"In Progress\",\n  \"start_otp\": \"2452\",\n  \"note\": \"Work started on site\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /expert/auth/request-otp",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/expert/auth/request-otp",
            "description": "Request an Expert sign-in or registration OTP.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"phone\": \"9876543210\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /expert/auth/verify-otp",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/expert/auth/verify-otp",
            "description": "Verify Expert OTP. A new Expert receives a registration token. An existing Expert receives a token only after Admin approval plus verified Cashfree Aadhaar and PAN.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"challenge_token\": \"Challenge token from request OTP\",\n  \"otp\": \"123456\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /expert/verification/aadhaar/request-otp",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/expert/verification/aadhaar/request-otp",
            "description": "Request Cashfree Aadhaar OTP during registration.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"registration_token\": \"Registration token\",\n  \"aadhaar_number\": \"123412341234\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /expert/verification/aadhaar/verify-otp",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/expert/verification/aadhaar/verify-otp",
            "description": "Verify Cashfree Aadhaar OTP. PAN is allowed only after success.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"registration_token\": \"Registration token\",\n  \"otp\": \"111000\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /expert/verification/pan/verify",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/expert/verification/pan/verify",
            "description": "Verify Cashfree PAN after Aadhaar succeeds.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"registration_token\": \"Registration token\",\n  \"pan\": \"ABCPV1234D\",\n  \"name\": \"Ramesh Kumar\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /expert/training/questions",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/expert/training/questions",
            "description": "Load active questions for the exact selected categories. Correct answers are deliberately omitted.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"registration_token\": \"Registration token\",\n  \"category_ids\": [\n    29\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /expert/training/attempts",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/expert/training/attempts",
            "description": "Submit one complete training attempt for server-side scoring. Every attempt is retained; score never blocks registration.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"registration_token\": \"Registration token\",\n  \"category_ids\": [\n    29\n  ],\n  \"answers\": [\n    {\n      \"question_id\": 1,\n      \"option_id\": 2\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /expert/auth/complete-registration",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/expert/auth/complete-registration",
            "description": "Submit a new Expert profile. A valid training_attempt_id is required only when active training questions exist for the selected categories; score never blocks registration.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"registration_token\": \"Registration token from verify OTP\",\n  \"training_attempt_id\": 4,\n  \"name\": \"Ramesh Kumar\",\n  \"email\": \"ramesh@example.com\",\n  \"address\": \"Ashok Nagar\",\n  \"address_line_2\": \"Near Main Road\",\n  \"city_name\": \"Ranchi\",\n  \"pincode\": \"834001\",\n  \"date_of_birth\": \"1993-06-18\",\n  \"is_business_user\": false,\n  \"gst_number\": \"\",\n  \"vehicle_type\": \"Bike\",\n  \"vehicle_owner_name\": \"Ramesh Kumar\",\n  \"languages\": [\n    \"Hindi\",\n    \"English\"\n  ],\n  \"category_ids\": [\n    29\n  ],\n  \"requested_categories\": [\n    \"Home services\"\n  ],\n  \"requested_skills\": [\n    \"AC Repair\"\n  ],\n  \"weekly_schedule\": [\n    {\n      \"day\": \"Mon\",\n      \"is_working\": true,\n      \"start_time\": \"09:00\",\n      \"end_time\": \"18:00\"\n    },\n    {\n      \"day\": \"Tue\",\n      \"is_working\": true,\n      \"start_time\": \"09:00\",\n      \"end_time\": \"18:00\"\n    },\n    {\n      \"day\": \"Wed\",\n      \"is_working\": true,\n      \"start_time\": \"09:00\",\n      \"end_time\": \"18:00\"\n    },\n    {\n      \"day\": \"Thu\",\n      \"is_working\": true,\n      \"start_time\": \"09:00\",\n      \"end_time\": \"18:00\"\n    },\n    {\n      \"day\": \"Fri\",\n      \"is_working\": true,\n      \"start_time\": \"09:00\",\n      \"end_time\": \"18:00\"\n    },\n    {\n      \"day\": \"Sat\",\n      \"is_working\": true,\n      \"start_time\": \"09:00\",\n      \"end_time\": \"18:00\"\n    },\n    {\n      \"day\": \"Sun\",\n      \"is_working\": false,\n      \"start_time\": \"\",\n      \"end_time\": \"\"\n    }\n  ],\n  \"bank_name\": \"HDFC Bank\",\n  \"bank_account_holder_name\": \"Ramesh Kumar\",\n  \"account_number\": \"1234567890123456\",\n  \"bank_ifsc_code\": \"HDFC0001234\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /expert/onboarding-options",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/expert/onboarding-options",
            "description": "Get active Admin City Master entries, categories, and skills for Expert onboarding."
          },
          "response": []
        },
        {
          "name": "GET /expert/address-autocomplete",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": {
              "raw": "{{base_url}}/expert/address-autocomplete?input=Ashok%20Nagar%20Ranchi",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "expert",
                "address-autocomplete"
              ],
              "query": [
                {
                  "key": "input",
                  "value": "Ashok Nagar Ranchi",
                  "disabled": false,
                  "description": ""
                }
              ]
            },
            "description": "Search Indian addresses through the configured Google Places service."
          },
          "response": []
        },
        {
          "name": "GET /expert/address-details/{place_id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/expert/address-details/{{place_id}}",
            "description": "Get a selected Google address and its city and pincode values."
          },
          "response": []
        },
        {
          "name": "GET /expert/profile",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{expert_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/expert/profile",
            "description": "Get the signed-in Expert profile."
          },
          "response": []
        },
        {
          "name": "PUT /expert/profile",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{expert_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/expert/profile",
            "description": "Update editable Expert profile fields and optionally replace the private profile photo. Phone cannot be changed here because it is the OTP login identity.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Ramesh Kumar\",\n  \"email\": \"ramesh@example.com\",\n  \"address\": \"Ashok Nagar\",\n  \"address_line_2\": \"Near Main Road\",\n  \"city_name\": \"Ranchi\",\n  \"pincode\": \"834001\",\n  \"date_of_birth\": \"1993-06-18\",\n  \"is_business_user\": false,\n  \"gst_number\": \"\",\n  \"languages\": [\n    \"Hindi\",\n    \"English\"\n  ],\n  \"profile_image_file\": {\n    \"name\": \"profile.jpg\",\n    \"data\": \"data:image/jpeg;base64,...\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /expert/jobs",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{expert_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/expert/jobs",
            "description": "List jobs assigned to the signed-in Expert. Supports status, page, and limit filters."
          },
          "response": []
        },
        {
          "name": "GET /expert/jobs/{job_id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{expert_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/expert/jobs/{{job_id}}",
            "description": "Get one job assigned to the signed-in Expert, including customer, address, service, payment, and job-history details."
          },
          "response": []
        },
        {
          "name": "GET /expert/profile/documents/{document_type}/{document_index}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{expert_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/expert/profile/documents/{{document_type}}/{{document_index}}",
            "description": "Download the signed-in Expert's private profile photo, driving licence, or certificate."
          },
          "response": []
        },
        {
          "name": "POST /expert/profile/phone/request-otp",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{expert_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/expert/profile/phone/request-otp",
            "description": "Request an account-bound phone-change code. Currently supports test OTP mode; SMS delivery is not configured.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"phone\": \"9000000002\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /expert/profile/phone/verify-otp",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{expert_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/expert/profile/phone/verify-otp",
            "description": "Verify a one-time code and update the authenticated expert phone.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"challenge_token\": \"request-response-challenge\",\n  \"otp\": \"123456\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "PUT /expert/profile/bank",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{expert_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/expert/profile/bank",
            "description": "Verify a replacement payout account with Cashfree before updating the signed-in Expert profile. The existing bank account is retained if verification fails.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"bank_name\": \"HDFC Bank\",\n  \"bank_account_holder_name\": \"Ramesh Kumar\",\n  \"account_number\": \"1234567890123456\",\n  \"bank_ifsc_code\": \"HDFC0001234\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "PUT /expert/profile/availability",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{expert_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/expert/profile/availability",
            "description": "Update the signed-in Expert's Online or Offline availability and/or replace dated unavailable periods. The home screen sends only availability; availability management sends unavailable_slots.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"availability\": \"Online\",\n  \"unavailable_slots\": [\n    {\n      \"date\": \"2026-09-12\",\n      \"day\": \"Sat\",\n      \"start_time\": \"10:00\",\n      \"end_time\": \"12:00\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "PUT /expert/profile/vehicle",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{expert_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/expert/profile/vehicle",
            "description": "Create or update the authenticated Expert vehicle profile. Licence uploads are optional and replace the corresponding existing file only when supplied.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"vehicle_type\": \"Bike\",\n  \"vehicle_owner_name\": \"Ramesh Kumar\",\n  \"driving_license_front_file\": {\n    \"name\": \"licence-front.jpg\",\n    \"data\": \"data:image/jpeg;base64,...\"\n  },\n  \"driving_license_back_file\": null\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        }
      ]
    },
    {
      "name": "Admin Profile",
      "item": [
        {
          "name": "GET /profile-sa/razorpay-settings",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/profile-sa/razorpay-settings",
            "description": "Read masked Razorpay configuration."
          },
          "response": []
        },
        {
          "name": "PUT /profile-sa/razorpay-settings",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/profile-sa/razorpay-settings",
            "description": "Select live or sandbox mode and optionally replace keys. Supply private values locally; never put real secrets in an exported collection.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"active_mode\": \"sandbox\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /profile-sa",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/profile-sa",
            "description": "Get super admin profile"
          },
          "response": []
        },
        {
          "name": "PUT /profile-sa",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/profile-sa",
            "description": "Update super admin profile",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"title\": \"Super Admin\",\n  \"name\": \"Admin Name\",\n  \"phone\": \"9876543210\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /profile-sa/activity",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/profile-sa/activity",
            "description": "Get login and logout activity"
          },
          "response": []
        },
        {
          "name": "POST /change-password-sa",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/change-password-sa",
            "description": "Change password",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"current_password\": \"Current password\",\n  \"new_password\": \"New password\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /logout-sa",
          "request": {
            "method": "POST",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/logout-sa",
            "description": "Log out"
          },
          "response": []
        },
        {
          "name": "PUT /profile-sa/preferences",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/profile-sa/preferences",
            "description": "Save the signed-in admin workspace theme, table density, default module, timezone, and date format.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"theme\": \"System\",\n  \"table_density\": \"Compact\",\n  \"default_module\": \"dashboard\",\n  \"timezone\": \"Asia/Kolkata\",\n  \"date_format\": \"DD/MM/YYYY\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        }
      ]
    },
    {
      "name": "Settings & RBAC",
      "item": [
        {
          "name": "GET /rbac/modules",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/rbac/modules",
            "description": "List active permission modules."
          },
          "response": []
        },
        {
          "name": "GET /rbac/roles",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/rbac/roles",
            "description": "List roles and assigned permission modules."
          },
          "response": []
        },
        {
          "name": "POST /rbac/roles",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/rbac/roles",
            "description": "Create a role using real module IDs returned by /rbac/modules.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Operations role\",\n  \"description\": \"Operations access\",\n  \"module_ids\": [\n    1\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "PUT /rbac/roles/{role_id}",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/rbac/roles/{{role_id}}",
            "description": "Update a role and its module IDs.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Operations role\",\n  \"description\": \"Operations access\",\n  \"module_ids\": [\n    1\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /platform-configurations",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/platform-configurations",
            "description": "List current platform settings."
          },
          "response": []
        },
        {
          "name": "PUT /platform-configurations/{configuration_id}",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/platform-configurations/{{configuration_id}}",
            "description": "Update one setting value; supply a value valid for the selected setting key.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"value\": \"2 hours before\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /platform-configurations/history",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/platform-configurations/history",
            "description": "Read configuration change history."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Expert Management",
      "item": [
        {
          "name": "PATCH /experts/{expert_id}/status",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/experts/{{expert_id}}/status",
            "description": "Set expert account Active or Inactive.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"status\": \"Active\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /experts/{expert_id}/documents/{document_type}/{document_index}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/experts/{{expert_id}}/documents/{{document_type}}/{{document_index}}",
            "description": "Download an expert document; response is a binary file rather than JSON on success."
          },
          "response": []
        },
        {
          "name": "GET /experts",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/experts",
            "description": "List experts"
          },
          "response": []
        },
        {
          "name": "POST /experts",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/experts",
            "description": "Create experts",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Ramesh Kumar\",\n  \"gender\": \"Male\",\n  \"phone_no_country_code\": \"+91\",\n  \"phone\": \"9876543210\",\n  \"city_name\": \"Ranchi\",\n  \"category_ids\": [\n    1\n  ],\n  \"skill_ids\": [\n    1\n  ],\n  \"availability\": \"Online\",\n  \"unavailable_slots\": [\n    {\n      \"day\": \"Mon\",\n      \"start_time\": \"10:00\",\n      \"end_time\": \"16:00\"\n    }\n  ],\n  \"weekly_schedule\": [\n    {\n      \"day\": \"Mon\",\n      \"is_working\": true,\n      \"start_time\": \"00:00\",\n      \"end_time\": \"23:59\"\n    },\n    {\n      \"day\": \"Tue\",\n      \"is_working\": true,\n      \"start_time\": \"00:00\",\n      \"end_time\": \"23:59\"\n    },\n    {\n      \"day\": \"Wed\",\n      \"is_working\": true,\n      \"start_time\": \"00:00\",\n      \"end_time\": \"23:59\"\n    },\n    {\n      \"day\": \"Thu\",\n      \"is_working\": true,\n      \"start_time\": \"00:00\",\n      \"end_time\": \"23:59\"\n    },\n    {\n      \"day\": \"Fri\",\n      \"is_working\": true,\n      \"start_time\": \"00:00\",\n      \"end_time\": \"23:59\"\n    },\n    {\n      \"day\": \"Sat\",\n      \"is_working\": true,\n      \"start_time\": \"00:00\",\n      \"end_time\": \"23:59\"\n    },\n    {\n      \"day\": \"Sun\",\n      \"is_working\": true,\n      \"start_time\": \"00:00\",\n      \"end_time\": \"23:59\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /experts/{expert_id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/experts/{{expert_id}}",
            "description": "Get experts by ID"
          },
          "response": []
        },
        {
          "name": "PUT /experts/{expert_id}",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/experts/{{expert_id}}",
            "description": "Update experts",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Ramesh Kumar\",\n  \"gender\": \"Male\",\n  \"phone_no_country_code\": \"+91\",\n  \"phone\": \"9876543210\",\n  \"city_name\": \"Ranchi\",\n  \"category_ids\": [\n    1\n  ],\n  \"skill_ids\": [\n    1\n  ],\n  \"availability\": \"Online\",\n  \"unavailable_slots\": [\n    {\n      \"day\": \"Mon\",\n      \"start_time\": \"10:00\",\n      \"end_time\": \"16:00\"\n    }\n  ],\n  \"weekly_schedule\": [\n    {\n      \"day\": \"Mon\",\n      \"is_working\": true,\n      \"start_time\": \"00:00\",\n      \"end_time\": \"23:59\"\n    },\n    {\n      \"day\": \"Tue\",\n      \"is_working\": true,\n      \"start_time\": \"00:00\",\n      \"end_time\": \"23:59\"\n    },\n    {\n      \"day\": \"Wed\",\n      \"is_working\": true,\n      \"start_time\": \"00:00\",\n      \"end_time\": \"23:59\"\n    },\n    {\n      \"day\": \"Thu\",\n      \"is_working\": true,\n      \"start_time\": \"00:00\",\n      \"end_time\": \"23:59\"\n    },\n    {\n      \"day\": \"Fri\",\n      \"is_working\": true,\n      \"start_time\": \"00:00\",\n      \"end_time\": \"23:59\"\n    },\n    {\n      \"day\": \"Sat\",\n      \"is_working\": true,\n      \"start_time\": \"00:00\",\n      \"end_time\": \"23:59\"\n    },\n    {\n      \"day\": \"Sun\",\n      \"is_working\": true,\n      \"start_time\": \"00:00\",\n      \"end_time\": \"23:59\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "DELETE /experts/{expert_id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/experts/{{expert_id}}",
            "description": "Delete experts"
          },
          "response": []
        },
        {
          "name": "PATCH /experts/{expert_id}/availability",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/experts/{{expert_id}}/availability",
            "description": "Update an expert's availability status and dated unavailable periods without editing the rest of the profile.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"availability\": \"Online\",\n  \"unavailable_slots\": [\n    {\n      \"date\": \"2026-10-06\",\n      \"day\": \"Tue\",\n      \"start_time\": \"10:00\",\n      \"end_time\": \"12:00\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "PATCH /experts/{expert_id}/suspension",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/experts/{{expert_id}}/suspension",
            "description": "Suspend an Expert account with a required reason, or resume it to its previous approval state. Suspended Experts cannot use protected Expert mobile APIs.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"action\": \"suspend\",\n  \"reason\": \"Repeated breach of platform conduct policy\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /experts/{expert_id}/notes",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/experts/{{expert_id}}/notes",
            "description": "List internal notes for one Expert"
          },
          "response": []
        },
        {
          "name": "POST /experts/{expert_id}/notes",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/experts/{{expert_id}}/notes",
            "description": "Add an internal note to one Expert",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"note\": \"Strong performance during the festival period; consider for priority assignments.\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "DELETE /experts/{expert_id}/notes/{note_id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/experts/{{expert_id}}/notes/{{note_id}}",
            "description": "Delete an internal Expert note"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Job Tracking",
      "item": [
        {
          "name": "POST /expert/jobs/{job_id}/tracking/start",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{expert_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/expert/jobs/{{job_id}}/tracking/start",
            "description": "Start trip-only sharing on the scheduled India date. Returns trip_id; repeated start during the same trip is a no-op. Stops any other sharing trip for this expert. No job status or OTP changes.",
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const result = pm.response.json();",
                  "if (result.status && result.x?.tracking?.trip_id) pm.collectionVariables.set(\"trip_id\", result.x.tracking.trip_id);"
                ]
              }
            }
          ]
        },
        {
          "name": "POST /expert/jobs/{job_id}/tracking/location",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{expert_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/expert/jobs/{{job_id}}/tracking/location",
            "description": "Assigned expert GPS update for a current trip_id. Send every 10 seconds while travelling. Timestamps must be recent and increasing. No off-trip updates accepted.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"trip_id\": \"{{trip_id}}\",\n  \"latitude\": 22.5726,\n  \"longitude\": 88.3639,\n  \"accuracy_m\": 15,\n  \"heading\": 90,\n  \"recorded_at\": \"{{$isoTimestamp}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /expert/jobs/{job_id}/tracking/stop",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{expert_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/expert/jobs/{{job_id}}/tracking/stop",
            "description": "Stop trip sharing and clear the point. reason is arrived or stopped. Arrival does not start the service; normal job start OTP still applies.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"trip_id\": \"{{trip_id}}\",\n  \"reason\": \"arrived\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /mobile/jobs/{job_id}/tracking",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/jobs/{{job_id}}/tracking",
            "description": "Booking owner reads only the current assigned expert trip. Poll every 10 seconds while tracking screen is open. location is null if not sharing, stale over 60 seconds, expired, reassigned or job no longer eligible. Not an ETA/routing API."
          },
          "response": []
        },
        {
          "name": "GET /expert/jobs/{job_id}/tracking",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{expert_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/expert/jobs/{{job_id}}/tracking",
            "description": "Assigned expert reads their current trip session; resume GPS only for an active sharing session."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Homepage Banners",
      "item": [
        {
          "name": "GET /admin/homepage-banners",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/admin/homepage-banners",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "admin",
                "homepage-banners"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "20",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "List every homepage banner, newest first, with pagination. No fixed total banner limit."
          },
          "response": []
        },
        {
          "name": "POST /admin/homepage-banners",
          "request": {
            "method": "POST",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/homepage-banners",
            "description": "Create an image-backed homepage banner. All three text fields must be supplied; they may individually be empty, but not all blank. Preserves spaces and line breaks. All saved banners are visible in the mobile list.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "prefix",
                  "type": "text",
                  "value": "Let's curate a ",
                  "disabled": false,
                  "description": "Plain text; trailing spaces are preserved."
                },
                {
                  "key": "highlight",
                  "type": "text",
                  "value": "perfect",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "suffix",
                  "type": "text",
                  "value": "\npackage just for you !!",
                  "disabled": false,
                  "description": "Plain text; actual newlines are preserved."
                },
                {
                  "key": "image",
                  "type": "file",
                  "src": "",
                  "disabled": false,
                  "description": "Required on create; optional replacement on edit. PNG, JPEG, WebP or safe SVG, max 5 MB."
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "GET /admin/homepage-banners/{id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/homepage-banners/{{id}}",
            "description": "Get one banner for editing."
          },
          "response": []
        },
        {
          "name": "PUT /admin/homepage-banners/{id}",
          "request": {
            "method": "PUT",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/homepage-banners/{{id}}",
            "description": "Update all three text fields; omit image to retain it or upload a replacement. Original file is removed after a successful update.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "prefix",
                  "type": "text",
                  "value": "Let's curate a ",
                  "disabled": false,
                  "description": "Plain text; trailing spaces are preserved."
                },
                {
                  "key": "highlight",
                  "type": "text",
                  "value": "perfect",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "suffix",
                  "type": "text",
                  "value": "\npackage just for you !!",
                  "disabled": false,
                  "description": "Plain text; actual newlines are preserved."
                },
                {
                  "key": "image",
                  "type": "file",
                  "src": "",
                  "disabled": true,
                  "description": "Required on create; optional replacement on edit. PNG, JPEG, WebP or safe SVG, max 5 MB."
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "DELETE /admin/homepage-banners/{id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/homepage-banners/{{id}}",
            "description": "Delete one banner and its associated image. Does not affect other CMS content."
          },
          "response": []
        },
        {
          "name": "GET /mobile/homepage-banners",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": {
              "raw": "{{base_url}}/mobile/homepage-banners",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "mobile",
                "homepage-banners"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "20",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "Public mobile homepage banner list, newest first. Read x.banners with id, prefix, highlight, suffix, image_name, image_url, created_at and updated_at. Render as separate native text spans; preserve whitespace/newlines. No customer token is required."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Service Banners",
      "item": [
        {
          "name": "GET /admin/service-banners",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/admin/service-banners",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "admin",
                "service-banners"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "20",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "placement",
                  "value": "home_page",
                  "disabled": true,
                  "description": "Filter to home_page or service_page. Omit for both."
                }
              ]
            },
            "description": "List service banners and linked categories, newest first. Optionally filter by placement."
          },
          "response": []
        },
        {
          "name": "POST /admin/service-banners",
          "request": {
            "method": "POST",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/service-banners",
            "description": "Create an image-backed service banner linked to one active Category Master record.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "placement",
                  "type": "text",
                  "value": "home_page",
                  "disabled": true,
                  "description": "Banner display location."
                },
                {
                  "key": "category_id",
                  "type": "text",
                  "value": "10",
                  "disabled": false,
                  "description": "Required active Category Master ID. The mobile app uses this value as the tap destination."
                },
                {
                  "key": "image",
                  "type": "file",
                  "src": "",
                  "disabled": false,
                  "description": "Required on create; optional replacement on edit. PNG, JPEG, WebP or safe SVG, max 5 MB."
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "GET /admin/service-banners/{id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/service-banners/{{id}}",
            "description": "Get one service banner for editing."
          },
          "response": []
        },
        {
          "name": "PUT /admin/service-banners/{id}",
          "request": {
            "method": "PUT",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/service-banners/{{id}}",
            "description": "Update the active linked category and optionally replace the image. Omit image to retain it.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "placement",
                  "type": "text",
                  "value": "home_page",
                  "disabled": true,
                  "description": "Banner display location."
                },
                {
                  "key": "category_id",
                  "type": "text",
                  "value": "10",
                  "disabled": false,
                  "description": "Required active Category Master ID. The mobile app uses this value as the tap destination."
                },
                {
                  "key": "image",
                  "type": "file",
                  "src": "",
                  "disabled": true,
                  "description": "Required on create; optional replacement on edit. PNG, JPEG, WebP or safe SVG, max 5 MB."
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "DELETE /admin/service-banners/{id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/service-banners/{{id}}",
            "description": "Delete one service banner and its associated image."
          },
          "response": []
        },
        {
          "name": "GET /mobile/service-banners",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": {
              "raw": "{{base_url}}/mobile/service-banners",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "mobile",
                "service-banners"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "20",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "placement",
                  "value": "home_page",
                  "disabled": true,
                  "description": "Filter to home_page or service_page. Omit for both."
                }
              ]
            },
            "description": "Public category-linked banner feed. Pass placement=home_page or placement=service_page for the respective screen; omit for both. Each banner includes placement and category_id. Only active categories are returned. No token required."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Issue Facing",
      "item": [
        {
          "name": "GET /admin/issue-facings",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/admin/issue-facings",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "admin",
                "issue-facings"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "20",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "List all configured Issue Facing items and their linked categories, newest first, with pagination."
          },
          "response": []
        },
        {
          "name": "POST /admin/issue-facings",
          "request": {
            "method": "POST",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/issue-facings",
            "description": "Create an Issue Facing item with a short title, icon and one active Category Master destination.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "title",
                  "type": "text",
                  "value": "AC not cooling",
                  "disabled": false,
                  "description": "The short customer-facing issue text."
                },
                {
                  "key": "category_id",
                  "type": "text",
                  "value": "10",
                  "disabled": false,
                  "description": "Required active Category Master ID. The mobile app uses this value as the tap destination."
                },
                {
                  "key": "icon",
                  "type": "file",
                  "src": "",
                  "disabled": false,
                  "description": "Required on create; optional replacement on edit. PNG, JPEG, WebP or safe SVG, max 5 MB."
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "GET /admin/issue-facings/{id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/issue-facings/{{id}}",
            "description": "Get one Issue Facing item for editing."
          },
          "response": []
        },
        {
          "name": "PUT /admin/issue-facings/{id}",
          "request": {
            "method": "PUT",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/issue-facings/{{id}}",
            "description": "Update the issue title, active linked category and optionally replace its icon. Omit icon to retain it.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "title",
                  "type": "text",
                  "value": "AC not cooling",
                  "disabled": false,
                  "description": "The short customer-facing issue text."
                },
                {
                  "key": "category_id",
                  "type": "text",
                  "value": "10",
                  "disabled": false,
                  "description": "Required active Category Master ID. The mobile app uses this value as the tap destination."
                },
                {
                  "key": "icon",
                  "type": "file",
                  "src": "",
                  "disabled": true,
                  "description": "Required on create; optional replacement on edit. PNG, JPEG, WebP or safe SVG, max 5 MB."
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "DELETE /admin/issue-facings/{id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/issue-facings/{{id}}",
            "description": "Delete one Issue Facing item and its associated icon."
          },
          "response": []
        },
        {
          "name": "GET /mobile/issue-facings",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": {
              "raw": "{{base_url}}/mobile/issue-facings",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "mobile",
                "issue-facings"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "20",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "Public mobile Issue Facing list, newest first. Each result includes title, icon_url and category_id. Only items linked to active categories are returned. No customer token is required."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Recommended Session",
      "item": [
        {
          "name": "GET /admin/recommended-sessions",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/admin/recommended-sessions",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "admin",
                "recommended-sessions"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "20",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "List all configured items in x.recommendations, newest first, with pagination."
          },
          "response": []
        },
        {
          "name": "POST /admin/recommended-sessions",
          "request": {
            "method": "POST",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/recommended-sessions",
            "description": "Create a recommendation with a title, icon, and active category. The saved item is in x.recommendation.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "title",
                  "type": "text",
                  "value": "AC maintenance",
                  "disabled": false,
                  "description": "The short customer-facing recommendation text."
                },
                {
                  "key": "category_id",
                  "type": "text",
                  "value": "10",
                  "disabled": false,
                  "description": "Required active Category Master ID. The mobile app uses this value as the tap destination."
                },
                {
                  "key": "icon",
                  "type": "file",
                  "src": "",
                  "disabled": false,
                  "description": "Required on create; optional replacement on edit. PNG, JPEG, WebP or safe SVG, max 5 MB."
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "GET /admin/recommended-sessions/{id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/recommended-sessions/{{id}}",
            "description": "Get one item for editing in x.recommendation."
          },
          "response": []
        },
        {
          "name": "PUT /admin/recommended-sessions/{id}",
          "request": {
            "method": "PUT",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/recommended-sessions/{{id}}",
            "description": "Update the title, active category, and optionally the icon. Omit icon to retain it.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "title",
                  "type": "text",
                  "value": "AC maintenance",
                  "disabled": false,
                  "description": "The short customer-facing recommendation text."
                },
                {
                  "key": "category_id",
                  "type": "text",
                  "value": "10",
                  "disabled": false,
                  "description": "Required active Category Master ID. The mobile app uses this value as the tap destination."
                },
                {
                  "key": "icon",
                  "type": "file",
                  "src": "",
                  "disabled": true,
                  "description": "Required on create; optional replacement on edit. PNG, JPEG, WebP or safe SVG, max 5 MB."
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "DELETE /admin/recommended-sessions/{id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/recommended-sessions/{{id}}",
            "description": "Delete a recommendation and its associated icon."
          },
          "response": []
        },
        {
          "name": "GET /mobile/recommended-sessions",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": {
              "raw": "{{base_url}}/mobile/recommended-sessions",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "mobile",
                "recommended-sessions"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "20",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "Public list for Recommended for this session, newest first. Use x.recommendations[].category_id as the tap destination. Only active categories are included. No customer token is required."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Help & Support FAQs",
      "item": [
        {
          "name": "GET /admin/support-faq-categories",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/admin/support-faq-categories",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "admin",
                "support-faq-categories"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "20",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "List Help & Support FAQ categories for Admin, ordered by display_order then ID."
          },
          "response": []
        },
        {
          "name": "POST /admin/support-faq-categories",
          "request": {
            "method": "POST",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/support-faq-categories",
            "description": "Create an icon-backed Help & Support FAQ category. Categories can have unlimited FAQs.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "title",
                  "type": "text",
                  "value": "Account related issues",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "status",
                  "type": "text",
                  "value": "Active",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "display_order",
                  "type": "text",
                  "value": "1",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "icon",
                  "type": "file",
                  "src": "",
                  "disabled": false,
                  "description": "Required on create; optional replacement on edit. PNG, JPEG, WebP or safe SVG, max 5 MB."
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "GET /admin/support-faq-categories/{id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/support-faq-categories/{{id}}",
            "description": "Get one FAQ category for editing."
          },
          "response": []
        },
        {
          "name": "PUT /admin/support-faq-categories/{id}",
          "request": {
            "method": "PUT",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/support-faq-categories/{{id}}",
            "description": "Update FAQ category text, status, display order and optionally replace its icon.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "title",
                  "type": "text",
                  "value": "Account related issues",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "status",
                  "type": "text",
                  "value": "Active",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "display_order",
                  "type": "text",
                  "value": "1",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "icon",
                  "type": "file",
                  "src": "",
                  "disabled": true,
                  "description": "Required on create; optional replacement on edit. PNG, JPEG, WebP or safe SVG, max 5 MB."
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "DELETE /admin/support-faq-categories/{id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/support-faq-categories/{{id}}",
            "description": "Delete one FAQ category and all its FAQs. Its icon is removed after deletion."
          },
          "response": []
        },
        {
          "name": "GET /admin/support-faqs",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/admin/support-faqs",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "admin",
                "support-faqs"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "20",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "category_id",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "List Help & Support FAQs for Admin. Optionally filter by category_id."
          },
          "response": []
        },
        {
          "name": "POST /admin/support-faqs",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/support-faqs",
            "description": "Create a Help & Support FAQ under an existing category.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"category_id\": {\n    \"type\": \"integer\",\n    \"minimum\": 1,\n    \"example\": 1\n  },\n  \"question\": {\n    \"type\": \"string\",\n    \"minLength\": 3,\n    \"maxLength\": 500,\n    \"example\": \"I want to change my phone number\"\n  },\n  \"answer\": {\n    \"type\": \"string\",\n    \"minLength\": 1,\n    \"maxLength\": 20000,\n    \"example\": \"You can change your phone number from the profile section after verifying it with an OTP.\"\n  },\n  \"status\": {\n    \"type\": \"string\",\n    \"enum\": [\n      \"Active\",\n      \"Inactive\"\n    ],\n    \"example\": \"Active\"\n  },\n  \"display_order\": {\n    \"type\": \"integer\",\n    \"minimum\": 0,\n    \"example\": 1\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /admin/support-faqs/{id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/support-faqs/{{id}}",
            "description": "Get one FAQ for editing."
          },
          "response": []
        },
        {
          "name": "PUT /admin/support-faqs/{id}",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/support-faqs/{{id}}",
            "description": "Update a Help & Support FAQ.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"category_id\": {\n    \"type\": \"integer\",\n    \"minimum\": 1,\n    \"example\": 1\n  },\n  \"question\": {\n    \"type\": \"string\",\n    \"minLength\": 3,\n    \"maxLength\": 500,\n    \"example\": \"I want to change my phone number\"\n  },\n  \"answer\": {\n    \"type\": \"string\",\n    \"minLength\": 1,\n    \"maxLength\": 20000,\n    \"example\": \"You can change your phone number from the profile section after verifying it with an OTP.\"\n  },\n  \"status\": {\n    \"type\": \"string\",\n    \"enum\": [\n      \"Active\",\n      \"Inactive\"\n    ],\n    \"example\": \"Active\"\n  },\n  \"display_order\": {\n    \"type\": \"integer\",\n    \"minimum\": 0,\n    \"example\": 1\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "DELETE /admin/support-faqs/{id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/support-faqs/{{id}}",
            "description": "Delete one Help & Support FAQ."
          },
          "response": []
        },
        {
          "name": "GET /mobile/support-faq-categories",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": {
              "raw": "{{base_url}}/mobile/support-faq-categories",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "mobile",
                "support-faq-categories"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "20",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "Public active Help & Support category list for the mobile Help screen. Ordered by display_order then ID. No token is required."
          },
          "response": []
        },
        {
          "name": "GET /mobile/support-faqs",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": {
              "raw": "{{base_url}}/mobile/support-faqs",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "mobile",
                "support-faqs"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "20",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "category_id",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "Public active Help & Support FAQ list. Pass category_id after a customer opens a category. Inactive FAQs and FAQs in inactive categories are excluded. No token is required."
          },
          "response": []
        }
      ]
    },
    {
      "name": "CMS",
      "item": [
        {
          "name": "GET /admin/cms",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/cms",
            "description": "List the fixed CMS pages (Super Admin only)."
          },
          "response": []
        },
        {
          "name": "GET /admin/cms/{slug}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/admin/cms/{{slug}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "admin",
                "cms",
                "{{slug}}"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "20",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "Get editable page and paginated subsection summaries."
          },
          "response": []
        },
        {
          "name": "PUT /admin/cms/{slug}",
          "request": {
            "method": "PUT",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/cms/{{slug}}",
            "description": "Save page content, visibility and optional banner. About Us has direct Markdown; legal pages use subsections.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "title",
                  "type": "text",
                  "value": "Terms & Conditions",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "banner_heading",
                  "type": "text",
                  "value": "Our terms, your trust",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "banner_description",
                  "type": "text",
                  "value": "Rules for using our services",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "content",
                  "type": "text",
                  "value": "",
                  "disabled": true,
                  "description": "Markdown content for About Us only; empty for legal policy pages."
                },
                {
                  "key": "status",
                  "type": "text",
                  "value": "Active",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "remove_banner",
                  "type": "text",
                  "value": "false",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "banner",
                  "type": "file",
                  "src": "",
                  "disabled": true,
                  "description": "Optional SVG, PNG, JPEG or WebP, up to 5 MB."
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "POST /admin/cms/{slug}/sections",
          "request": {
            "method": "POST",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/cms/{{slug}}/sections",
            "description": "Create an icon-backed legal policy subsection. About Us does not accept subsections.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "title",
                  "type": "text",
                  "value": "Acceptance of terms",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "description",
                  "type": "text",
                  "value": "By using our app, you agree to these terms",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "content",
                  "type": "text",
                  "value": "## User Agreement\n\nEnter approved content here.",
                  "disabled": false,
                  "description": "Required Markdown, up to 100,000 characters. Render as Markdown, never execute raw HTML."
                },
                {
                  "key": "display_order",
                  "type": "text",
                  "value": "1",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "status",
                  "type": "text",
                  "value": "Active",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "icon",
                  "type": "file",
                  "src": "",
                  "disabled": false,
                  "description": "Required on creation. SVG, PNG, JPEG or WebP, up to 5 MB. Omit on edit to retain the current icon."
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "GET /admin/cms/{slug}/sections/{id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/cms/{{slug}}/sections/{{id}}",
            "description": "Get subsection content for editing."
          },
          "response": []
        },
        {
          "name": "PUT /admin/cms/{slug}/sections/{id}",
          "request": {
            "method": "PUT",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/cms/{{slug}}/sections/{{id}}",
            "description": "Edit subsection content, order and visibility; optional icon replacement.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "title",
                  "type": "text",
                  "value": "Acceptance of terms",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "description",
                  "type": "text",
                  "value": "By using our app, you agree to these terms",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "content",
                  "type": "text",
                  "value": "## User Agreement\n\nEnter approved content here.",
                  "disabled": false,
                  "description": "Required Markdown, up to 100,000 characters. Render as Markdown, never execute raw HTML."
                },
                {
                  "key": "display_order",
                  "type": "text",
                  "value": "1",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "status",
                  "type": "text",
                  "value": "Active",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "icon",
                  "type": "file",
                  "src": "",
                  "disabled": true,
                  "description": "Required on creation. SVG, PNG, JPEG or WebP, up to 5 MB. Omit on edit to retain the current icon."
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "DELETE /admin/cms/{slug}/sections/{id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/cms/{{slug}}/sections/{{id}}",
            "description": "Delete a subsection and its stored icon."
          },
          "response": []
        },
        {
          "name": "GET /mobile/cms/{slug}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": {
              "raw": "{{base_url}}/mobile/cms/{{slug}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "mobile",
                "cms",
                "{{slug}}"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "20",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "Public CMS page with active subsection summaries ordered by display_order then ID. Follow pagination. About Us includes content (Markdown), content_format and content_blocks for native mobile rendering without HTML. Blocks: heading(level,spans), paragraph(spans), list(ordered,start,items[].blocks), quote(blocks), divider. Spans: text plus optional bold, italic, url. Inactive pages return 404."
          },
          "response": []
        },
        {
          "name": "GET /mobile/cms/{slug}/sections/{id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/mobile/cms/{{slug}}/sections/{{id}}",
            "description": "Public active subsection detail. x.section includes content, content_format: markdown, and content_blocks for native mobile widgets. HTML/code/images are rejected on save; safe links only. Both page and subsection must be Active; wrong parent/inactive returns 404. See CMS integration guide for block schema."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Staff Management",
      "item": [
        {
          "name": "GET /departments",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/departments",
            "description": "List Department Master records used for Staff assignment."
          },
          "response": []
        },
        {
          "name": "POST /departments",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/departments",
            "description": "Create a Department Master record.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Operations\",\n  \"status\": \"Active\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "PUT /departments/{department_id}",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/departments/{{department_id}}",
            "description": "Update a Department Master record.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Operations\",\n  \"status\": \"Active\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /staff",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/staff",
            "description": "List staff with search, Department, RBAC role, State/City location, and status filters."
          },
          "response": []
        },
        {
          "name": "POST /staff",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/staff",
            "description": "Create a staff draft or send an invite. Staff use a required name, email, phone, department, RBAC role, State, and City; manager is optional.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Priya Sharma\",\n  \"email\": \"priya.sharma@example.com\",\n  \"phone\": \"+91 9000000000\",\n  \"department_id\": 1,\n  \"role_id\": 2,\n  \"manager_id\": null,\n  \"state_id\": 1,\n  \"city_id\": 1,\n  \"save_as_draft\": false\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /staff/{staff_id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/staff/{{staff_id}}",
            "description": "Get a staff profile and access details."
          },
          "response": []
        },
        {
          "name": "PUT /staff/{staff_id}",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/staff/{{staff_id}}",
            "description": "Update a staff profile, role, manager, or State/City location.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Priya Sharma\",\n  \"email\": \"priya.sharma@example.com\",\n  \"phone\": \"+91 9000000000\",\n  \"department_id\": 1,\n  \"role_id\": 2,\n  \"manager_id\": null,\n  \"state_id\": 1,\n  \"city_id\": 1\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "PATCH /staff/{staff_id}/suspension",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/staff/{{staff_id}}/suspension",
            "description": "Suspend or resume staff access.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"suspended\": true,\n  \"reason\": \"Access review required\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /staff/{staff_id}/resend-invite",
          "request": {
            "method": "POST",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/staff/{{staff_id}}/resend-invite",
            "description": "Send a fresh one-time account activation link to an invited or draft staff member."
          },
          "response": []
        },
        {
          "name": "POST /staff/{staff_id}/reset-password",
          "request": {
            "method": "POST",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/staff/{{staff_id}}/reset-password",
            "description": "Send a one-time password reset link to an active staff member."
          },
          "response": []
        },
        {
          "name": "POST /staff/auth/login",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/staff/auth/login",
            "description": "Sign in an active staff account using its email and password.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"email\": \"staff@example.com\",\n  \"password\": \"secure-password\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /staff/auth/complete-access",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/staff/auth/complete-access",
            "description": "Activate a staff account or reset its password using its one-time email link.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"token\": \"64-character-token\",\n  \"password\": \"secure-password\",\n  \"confirm_password\": \"secure-password\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        }
      ]
    },
    {
      "name": "Emergency Controls",
      "item": [
        {
          "name": "GET /emergency-service-pauses",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/emergency-service-pauses",
            "description": "List active location-based emergency service pauses. Expired pauses are removed automatically."
          },
          "response": []
        },
        {
          "name": "POST /emergency-service-pauses",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/emergency-service-pauses",
            "description": "Pause new service bookings for one active State and City. The entered message is returned to mobile checkout clients.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"state_id\": 1,\n  \"city_id\": 1,\n  \"duration_minutes\": 60,\n  \"communication_template\": \"Service temporarily unavailable\",\n  \"message\": \"Service is temporarily unavailable in this city. Please try again shortly.\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "DELETE /emergency-service-pauses/{pause_id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/emergency-service-pauses/{{pause_id}}",
            "description": "Resume new service bookings immediately and remove the active pause."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Global Search",
      "item": [
        {
          "name": "GET /admin/global-search",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/admin/global-search?q=AC%20repair",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "admin",
                "global-search"
              ],
              "query": [
                {
                  "key": "q",
                  "value": "AC repair",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "20",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "Search indexed Jobs, Experts, Customers, Variants, and Service Catalog records. Results are served through the protected ESNTLS API; Algolia credentials are never exposed to the Admin Portal."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Category Master",
      "item": [
        {
          "name": "GET /categories",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/categories",
            "description": "List categories"
          },
          "response": []
        },
        {
          "name": "POST /categories",
          "request": {
            "method": "POST",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/categories",
            "description": "Create a category with optional uploaded icon, image, and banner files. display_order controls the customer-facing sequence within the same parent; lower values appear first.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "name",
                  "type": "text",
                  "value": "",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "parent_category_id",
                  "type": "text",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "description",
                  "type": "text",
                  "value": "",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "status",
                  "type": "text",
                  "value": "",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "featured",
                  "type": "text",
                  "value": "false",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "display_order",
                  "type": "text",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "color",
                  "type": "text",
                  "value": "",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "icon",
                  "type": "file",
                  "src": "",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "image",
                  "type": "file",
                  "src": "",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "banner",
                  "type": "file",
                  "src": "",
                  "disabled": true,
                  "description": ""
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "GET /categories/{category_id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/categories/{{category_id}}",
            "description": "Get a category"
          },
          "response": []
        },
        {
          "name": "PUT /categories/{category_id}",
          "request": {
            "method": "PUT",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/categories/{{category_id}}",
            "description": "Update a category and optionally replace uploaded icon, image, and banner files. display_order controls the customer-facing sequence within the same parent; lower values appear first.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "name",
                  "type": "text",
                  "value": "",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "parent_category_id",
                  "type": "text",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "description",
                  "type": "text",
                  "value": "",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "status",
                  "type": "text",
                  "value": "",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "featured",
                  "type": "text",
                  "value": "false",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "display_order",
                  "type": "text",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "color",
                  "type": "text",
                  "value": "",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "icon",
                  "type": "file",
                  "src": "",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "image",
                  "type": "file",
                  "src": "",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "banner",
                  "type": "file",
                  "src": "",
                  "disabled": true,
                  "description": ""
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "DELETE /categories/{category_id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/categories/{{category_id}}",
            "description": "Delete a category"
          },
          "response": []
        },
        {
          "name": "PATCH /categories/{category_id}/booking-pause",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/categories/{{category_id}}/booking-pause",
            "description": "Pause or resume new bookings for one category without changing its active status. A paused parent blocks new bookings for every descendant category.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"booking_paused\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "PUT /categories/{category_id}/process",
          "request": {
            "method": "PUT",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/categories/{{category_id}}/process",
            "description": "Replace a category process with ordered title-and-image steps. Submit multipart form data with a JSON steps field and matching process_images files. Existing step IDs retain their image when image_index is omitted.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "steps",
                  "type": "text",
                  "value": "[{\"id\":2,\"title\":\"Pre-service check\"},{\"title\":\"Repair done\",\"image_index\":0}]",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "process_images",
                  "type": "file",
                  "src": "",
                  "disabled": true,
                  "description": ""
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "PUT /categories/{category_id}/policies",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/categories/{{category_id}}/policies",
            "description": "Replace grouped Warranty, Cancellation Policy, and Safety & Trust points for one category.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"points\": [\n    {\n      \"policy_type\": \"warranty\",\n      \"content\": \"30 days warranty on repair workmanship\"\n    },\n    {\n      \"policy_type\": \"cancellation_policy\",\n      \"content\": \"Cancellation is subject to the service terms.\"\n    },\n    {\n      \"policy_type\": \"safety_trust\",\n      \"content\": \"Professionals follow safety checks.\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "PUT /categories/{category_id}/warranty",
          "request": {
            "method": "PUT",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/categories/{{category_id}}/warranty",
            "description": "Replace the category warranty main heading, image-backed sections, and their ordered customer-facing points. Submit multipart form data with JSON warranty content and matching warranty_images files. Existing section IDs retain their background image when background_image_index is omitted.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "warranty",
                  "type": "text",
                  "value": "{\"main_heading\":\"30 Days Warranty On Repairs\",\"sections\":[{\"heading\":\"Repairs you can rely on\",\"background_image_index\":0,\"points\":[{\"content\":\"Free repairs if the same issue arises\"},{\"content\":\"One-click hassle-free claims\"}]}]}",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "warranty_images",
                  "type": "file",
                  "src": "",
                  "disabled": true,
                  "description": ""
                }
              ]
            }
          },
          "response": []
        }
      ]
    },
    {
      "name": "Category Add-ons",
      "item": [
        {
          "name": "GET /categories/{category_id}/addons",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/categories/{{category_id}}/addons",
            "description": "List all category add-ons with structured key-value attributes and image URLs."
          },
          "response": []
        },
        {
          "name": "POST /categories/{category_id}/addons",
          "request": {
            "method": "POST",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/categories/{{category_id}}/addons",
            "description": "Create a category add-on. attributes is a JSON array of key-value objects; image accepts PNG, JPEG, WebP, or safe SVG up to 5 MB.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "title",
                  "type": "text",
                  "value": "AC Gas refill",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "price",
                  "type": "text",
                  "value": "799",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "attributes",
                  "type": "text",
                  "value": "[{\"key\":\"Gas type\",\"value\":\"R32\"}]",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "image",
                  "type": "file",
                  "src": "",
                  "disabled": false,
                  "description": ""
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "GET /categories/{category_id}/addons/{addon_id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/categories/{{category_id}}/addons/{{addon_id}}",
            "description": "Get one category add-on for editing."
          },
          "response": []
        },
        {
          "name": "PUT /categories/{category_id}/addons/{addon_id}",
          "request": {
            "method": "PUT",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/categories/{{category_id}}/addons/{{addon_id}}",
            "description": "Update an add-on. Omit image to retain the current image; attributes replaces the detail list.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "title",
                  "type": "text",
                  "value": "AC Gas refill",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "price",
                  "type": "text",
                  "value": "799",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "attributes",
                  "type": "text",
                  "value": "[{\"key\":\"Gas type\",\"value\":\"R32\"}]",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "image",
                  "type": "file",
                  "src": "",
                  "disabled": true,
                  "description": ""
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "DELETE /categories/{category_id}/addons/{addon_id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/categories/{{category_id}}/addons/{{addon_id}}",
            "description": "Delete one category add-on and its uploaded image."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Service Catalog",
      "item": [
        {
          "name": "GET /services/{service_id}/reviews",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/services/{{service_id}}/reviews",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "services",
                "{{service_id}}",
                "reviews"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "25",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "Admin-only audit view of the submitted ratings behind a service average. Returns paginated customer, job, star rating, optional review text, five-star distribution, and the average calculation."
          },
          "response": []
        },
        {
          "name": "GET /services",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/services",
            "description": "List services"
          },
          "response": []
        },
        {
          "name": "POST /services",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/services",
            "description": "Create services",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"AC Repair\",\n  \"category_id\": 1,\n  \"subcategory_id\": 2,\n  \"service_type\": \"standard\",\n  \"vendor_price\": 250,\n  \"selling_price\": 499,\n  \"duration\": \"30-90 mins\",\n  \"description\": \"Complete AC inspection and repair service.\",\n  \"inclusions\": [\n    \"Service visit\"\n  ],\n  \"exclusions\": [],\n  \"instructions\": \"\",\n  \"complaint_window\": \"48 hours\",\n  \"tax_mode\": \"marketplace\",\n  \"expert_gender_requirement\": \"Any\",\n  \"tags\": [],\n  \"image_urls\": [],\n  \"video_urls\": [],\n  \"transformation_image_urls\": [],\n  \"active_city_ids\": [\n    1\n  ],\n  \"service_variants\": [],\n  \"status\": \"Draft\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /services/{service_id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/services/{{service_id}}",
            "description": "Get services by ID"
          },
          "response": []
        },
        {
          "name": "PUT /services/{service_id}",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/services/{{service_id}}",
            "description": "Update services",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"AC Repair\",\n  \"category_id\": 1,\n  \"subcategory_id\": 2,\n  \"service_type\": \"standard\",\n  \"vendor_price\": 250,\n  \"selling_price\": 499,\n  \"duration\": \"30-90 mins\",\n  \"description\": \"Complete AC inspection and repair service.\",\n  \"inclusions\": [\n    \"Service visit\"\n  ],\n  \"exclusions\": [],\n  \"instructions\": \"\",\n  \"complaint_window\": \"48 hours\",\n  \"tax_mode\": \"marketplace\",\n  \"expert_gender_requirement\": \"Any\",\n  \"tags\": [],\n  \"image_urls\": [],\n  \"video_urls\": [],\n  \"transformation_image_urls\": [],\n  \"active_city_ids\": [\n    1\n  ],\n  \"service_variants\": [],\n  \"status\": \"Draft\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "DELETE /services/{service_id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/services/{{service_id}}",
            "description": "Delete services"
          },
          "response": []
        },
        {
          "name": "POST /services/{service_id}/duplicate",
          "request": {
            "method": "POST",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/services/{{service_id}}/duplicate",
            "description": "Create a Draft copy of a service, including saved city and variant mappings."
          },
          "response": []
        },
        {
          "name": "PATCH /services/{service_id}/status",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/services/{{service_id}}/status",
            "description": "Set a service to Active or Inactive without changing its configuration.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"status\": \"Inactive\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        }
      ]
    },
    {
      "name": "Mobile App",
      "item": [
        {
          "name": "GET /mobile/categories/{category_id}/addons",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/categories/{{category_id}}/addons",
            "description": "Get active add-ons for one category, including public image URLs and structured key-value attributes."
          },
          "response": []
        },
        {
          "name": "POST /mobile/auth/request-otp",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/mobile/auth/request-otp",
            "description": "Request sign-in OTP. Authorized development testing only: send the private X-Development-OTP-Key header to receive x.development_otp. Without the header, the OTP is never returned.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"phone\": \"9876543210\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /mobile/auth/verify-otp",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/mobile/auth/verify-otp",
            "description": "Verify OTP using x.challenge_token from the request step.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"challenge_token\": \"Challenge token from request OTP\",\n  \"otp\": \"123456\",\n  \"fcm_token\": \"Firebase token\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /mobile/auth/complete-registration",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/mobile/auth/complete-registration",
            "description": "Complete new customer registration. Include google_place_id after an address selection to store the Google-resolved latitude and longitude.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"registration_token\": \"Registration token\",\n  \"fcm_token\": \"Firebase token\",\n  \"name\": \"Customer Name\",\n  \"gender\": \"Female\",\n  \"email\": \"customer@example.com\",\n  \"address_name\": \"Home\",\n  \"address\": \"Street and locality\",\n  \"google_place_id\": \"ChIJ...\",\n  \"house_flat_no\": \"Flat 402\",\n  \"floor\": \"4th Floor\",\n  \"building_name\": \"Example Residency\",\n  \"nearby_landmark\": \"Near City Mall\",\n  \"lift_available\": true,\n  \"parking_instructions\": \"Use visitor parking near Gate 2\",\n  \"receiver_name\": \"Receiver Name\",\n  \"receiver_phone\": \"9876543210\",\n  \"state_id\": 1,\n  \"city_id\": 1,\n  \"pincode\": \"560001\",\n  \"home_type\": \"Apartment / Flat\",\n  \"family_type\": \"Couple household\",\n  \"preferred_timings\": [\n    \"Morning\"\n  ],\n  \"appliances_owned\": [\n    \"AC\"\n  ],\n  \"services\": [\n    \"Home Services\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /mobile/payment-links",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/payment-links",
            "description": "List every unpaid Admin-created Razorpay payment link for the signed-in customer. A previously expired hosted URL is replaced automatically; the pending booking remains available until payment succeeds."
          },
          "response": []
        },
        {
          "name": "POST /mobile/payment-links/{checkout_session_id}/confirm",
          "request": {
            "method": "POST",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/payment-links/{{checkout_session_id}}/confirm",
            "description": "Confirm a paid Admin-created Razorpay link and create the order."
          },
          "response": []
        },
        {
          "name": "GET /mobile/settings",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/settings",
            "description": "Get customer settings"
          },
          "response": []
        },
        {
          "name": "PUT /mobile/settings",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/settings",
            "description": "Update customer settings",
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /mobile/preferences",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/preferences",
            "description": "Get customer preferences"
          },
          "response": []
        },
        {
          "name": "PUT /mobile/preferences",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/preferences",
            "description": "Update customer preferences",
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /mobile/profile",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/profile",
            "description": "Get signed-in customer profile. The response includes a profile_completion_percentage and completed/missing profile-field breakdown; bookings, preferences, and payments are excluded."
          },
          "response": []
        },
        {
          "name": "PUT /mobile/profile",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/profile",
            "description": "Partially update the signed-in customer profile. Address fields are required only when an address is being changed.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Example Customer\",\n  \"email\": \"customer@example.com\",\n  \"gender\": \"Other\",\n  \"date_of_birth\": \"1993-06-18\",\n  \"preferred_languages\": [\n    \"Hindi\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /mobile/profile/photo",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/profile/photo",
            "description": "Download the signed-in customer's private profile photo. Send the Customer bearer token; the response is image bytes."
          },
          "response": []
        },
        {
          "name": "POST /mobile/profile/photo",
          "request": {
            "method": "POST",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/profile/photo",
            "description": "Upload or replace the signed-in customer's private profile photo. Send multipart/form-data with exactly one binary profile_image field; JPG, PNG, and WebP up to 5 MB are accepted.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "profile_image",
                  "type": "file",
                  "src": "",
                  "disabled": false,
                  "description": ""
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "GET /mobile/addresses",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/addresses",
            "description": "List customer addresses, including stored google_place_id, latitude, and longitude when available."
          },
          "response": []
        },
        {
          "name": "POST /mobile/addresses",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/addresses",
            "description": "Create customer address. Include google_place_id after an address selection; the API resolves and stores the exact latitude and longitude.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"address_type\": \"Home\",\n  \"address_name\": \"Home\",\n  \"address\": \"Street and locality\",\n  \"google_place_id\": \"ChIJ...\",\n  \"house_flat_no\": \"Flat 402\",\n  \"floor\": \"4th Floor\",\n  \"building_name\": \"Example Residency\",\n  \"nearby_landmark\": \"Near City Mall\",\n  \"lift_available\": true,\n  \"parking_instructions\": \"Use visitor parking near Gate 2\",\n  \"receiver_name\": \"Receiver Name\",\n  \"receiver_phone\": \"9876543210\",\n  \"state_id\": 1,\n  \"city_id\": 1,\n  \"pincode\": \"560001\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "PUT /mobile/addresses/{address_id}",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/addresses/{{address_id}}",
            "description": "Update customer address. Include google_place_id after an address selection; the API resolves and stores the exact latitude and longitude.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"address_type\": \"Work\",\n  \"address_name\": \"Main Office\",\n  \"address\": \"Street and locality\",\n  \"google_place_id\": \"ChIJ...\",\n  \"house_flat_no\": \"Suite 12\",\n  \"floor\": \"2nd Floor\",\n  \"building_name\": \"Business Park\",\n  \"nearby_landmark\": \"Near Metro Station\",\n  \"lift_available\": false,\n  \"parking_instructions\": \"Call on arrival\",\n  \"receiver_name\": \"Office Reception\",\n  \"receiver_phone\": \"9876543210\",\n  \"state_id\": 1,\n  \"city_id\": 1,\n  \"pincode\": \"560001\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "DELETE /mobile/addresses/{address_id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/addresses/{{address_id}}",
            "description": "Delete customer address"
          },
          "response": []
        },
        {
          "name": "PATCH /mobile/addresses/{address_id}/default",
          "request": {
            "method": "PATCH",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/addresses/{{address_id}}/default",
            "description": "Set default address"
          },
          "response": []
        },
        {
          "name": "GET /mobile/services/search",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/mobile/services/search?q=ac%20maintenanxe",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "mobile",
                "services",
                "search"
              ],
              "query": [
                {
                  "key": "q",
                  "value": "ac maintenanxe",
                  "disabled": false,
                  "description": "The typed customer search text. The API handles typo tolerance after an empty exact search."
                },
                {
                  "key": "city_id",
                  "value": "1",
                  "disabled": true,
                  "description": "Optional active city. Omit to use the customer profile city."
                },
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "20",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "Search active, city-eligible services and variants. Exact matching runs first; only an empty exact result uses server-side typo tolerance."
          },
          "response": []
        },
        {
          "name": "GET /mobile/recommendations",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/mobile/recommendations",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "mobile",
                "recommendations"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "20",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "Get active services from the signed-in customer’s previously paid, non-cancelled orders, ordered by most recent booking. Each recommendation includes current catalog details, active FAQs, rating, total_price, prior-booking details, cart_defaults, and Level 2 policy data in policy_category and policy_response. Customers without paid booking history receive an empty recommendations list."
          },
          "response": []
        },
        {
          "name": "POST /mobile/service-catalog",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/service-catalog",
            "description": "Get active services for the selected root category and final subcategory. Each service includes its active FAQs in an faqs array. Optional rating is the minimum average submitted rating (1-5); min_price and max_price are inclusive selling-price filters. Optional transformation images are returned as transformation_image_urls. Includes reviews_and_ratings: {average_rating: number|null, rating_count: number, reviews: [{id, service_id, rating, review, customer_name, submitted_at}], preview_limit: 5, has_more: boolean}. Counts/average cover every submitted star rating, including ratings without written text; latest five are returned, newest first. No reviews means null average, zero count and an empty array. Category summaries include active services in the active descendant branch; they are weighted by individual ratings, not averages of averages. Private customer contact details are never exposed. Existing request parameters and response fields remain unchanged. Present at x.reviews_and_ratings for the selected final category and at each x.services[].reviews_and_ratings. Category summary is independent of service pagination and price/rating filters.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"category_id\": 29,\n  \"subcategory_id\": 40,\n  \"rating\": 4,\n  \"min_price\": 500,\n  \"max_price\": 2500,\n  \"page\": 1,\n  \"limit\": 20\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /mobile/cart/eligible-experts",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/cart/eligible-experts",
            "description": "List active experts who match every service and requested skill. The authenticated customer gender is used only when a cart service is configured for Same Gender matching: Male/Female customers then receive only matching expert genders; Other, Prefer not to say, and blank genders receive all eligible experts. previous_experts contains past completed-service experts who remain eligible for this cart.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"cart_items\": [\n    {\n      \"service_id\": 1,\n      \"skill_ids\": [\n        1\n      ],\n      \"scheduled_date\": \"2026-09-15\",\n      \"slot_start\": \"10:00\",\n      \"slot_end\": \"12:00\"\n    },\n    {\n      \"service_id\": 2,\n      \"skill_ids\": [],\n      \"scheduled_date\": \"2026-09-15\",\n      \"slot_start\": \"10:00\",\n      \"slot_end\": \"12:00\"\n    }\n  ],\n  \"availability\": [\n    \"Online\",\n    \"On Job\"\n  ],\n  \"page\": 1,\n  \"limit\": 20\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /mobile/categories",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/categories",
            "description": "Get root categories. Each result includes image_name, image_url, banner_name, banner_url, warranty, and variant_count."
          },
          "response": []
        },
        {
          "name": "GET /mobile/categories/{category_id}/children",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/mobile/categories/{{category_id}}/children",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "mobile",
                "categories",
                "{{category_id}}",
                "children"
              ],
              "query": [
                {
                  "key": "rating",
                  "value": "4",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "min_price",
                  "value": "500",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "max_price",
                  "value": "2500",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "Get next category level. The returned parent category and every child include warranty when it is configured, with its ordered sections, public background-image URLs, and points; otherwise warranty is null. This navigation endpoint does not return services; call mobile/service-catalog after selecting a final category to receive each service and its active FAQs. Optional rating is the minimum average rating (1-5); min_price and max_price keep only child branches with an active service in the inclusive selling-price range. Includes reviews_and_ratings: {average_rating: number|null, rating_count: number, reviews: [{id, service_id, rating, review, customer_name, submitted_at}], preview_limit: 5, has_more: boolean}. Counts/average cover every submitted star rating, including ratings without written text; latest five are returned, newest first. No reviews means null average, zero count and an empty array. Category summaries include active services in the active descendant branch; they are weighted by individual ratings, not averages of averages. Private customer contact details are never exposed. Existing request parameters and response fields remain unchanged. Present at x.reviews_and_ratings, x.category.reviews_and_ratings and each x.children[].reviews_and_ratings. Category reviews are independent of navigation price/rating filters."
          },
          "response": []
        },
        {
          "name": "GET /mobile/categories/{category_id}/subcategories/{subcategory_id}/variants",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/categories/{{category_id}}/subcategories/{{subcategory_id}}/variants",
            "description": "Get variants for selected category and leaf category, including public category image and banner URLs."
          },
          "response": []
        },
        {
          "name": "POST /mobile/services/frequently-added",
          "request": {
            "method": "POST",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/services/frequently-added",
            "description": "Read-only customer discovery. No body or {} returns most_booked across active categories, ranked by recorded non-cancelled, non-failed jobs (one per job, descending, ties by service ID). Returns booking_count and completed_booking_count; zero-booking services are omitted. With category_id, returns related_services from the explicit active, unpaused branch in alphabetical order; completed_booking_count is null. subcategory_id requires category_id and validates context only. Optional city_id filters service availability, not historical counts. service_ids and exclude_service_ids are merged exclusions. Page default 1; limit default 20, max 50. Both modes use the same catalog card shape. See docs/frequently-added-services.md."
          },
          "response": [
            {
              "name": "Most booked services (no request body)",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "auth": {
                  "type": "bearer",
                  "bearer": [
                    {
                      "key": "token",
                      "value": "{{mobile_token}}",
                      "type": "string"
                    }
                  ]
                },
                "url": "{{base_url}}/mobile/services/frequently-added",
                "description": "Read-only customer discovery. No body or {} returns most_booked across active categories, ranked by recorded non-cancelled, non-failed jobs (one per job, descending, ties by service ID). Returns booking_count and completed_booking_count; zero-booking services are omitted. With category_id, returns related_services from the explicit active, unpaused branch in alphabetical order; completed_booking_count is null. subcategory_id requires category_id and validates context only. Optional city_id filters service availability, not historical counts. service_ids and exclude_service_ids are merged exclusions. Page default 1; limit default 20, max 50. Both modes use the same catalog card shape. See docs/frequently-added-services.md."
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": true,\n  \"message\": \"Frequently added services fetched successfully\",\n  \"x\": {\n    \"parent_category\": null,\n    \"ranking_mode\": \"most_booked\",\n    \"services\": [\n      {\n        \"id\": 11,\n        \"service_code\": \"SVC-011\",\n        \"name\": \"AC Gas Refill\",\n        \"service_type\": \"standard\",\n        \"selling_price\": 199,\n        \"vendor_price\": 150,\n        \"duration\": \"45 minutes\",\n        \"currency\": \"INR\",\n        \"image_names\": [\n          \"gas-refill.jpg\"\n        ],\n        \"image_urls\": [\n          \"https://esntlsapi.aquaninjas.in/public/service-media/gas-refill.jpg\"\n        ],\n        \"primary_image_url\": \"https://esntlsapi.aquaninjas.in/public/service-media/gas-refill.jpg\",\n        \"rating\": null,\n        \"rating_count\": 0,\n        \"completed_booking_count\": 4,\n        \"faqs\": [],\n        \"variants\": [],\n        \"variant_count\": 0,\n        \"requires_variant_selection\": false,\n        \"cart_defaults\": {\n          \"service_id\": 11,\n          \"service_variant_id\": null,\n          \"quantity\": 1,\n          \"skill_ids\": []\n        },\n        \"booking_count\": 7\n      }\n    ],\n    \"applied_filters\": {\n      \"category_id\": null,\n      \"subcategory_id\": null,\n      \"city_id\": null,\n      \"excluded_service_ids\": []\n    },\n    \"pagination\": {\n      \"page\": 1,\n      \"limit\": 20,\n      \"total\": 1,\n      \"total_pages\": 1,\n      \"has_next\": false,\n      \"has_previous\": false\n    }\n  },\n  \"errors\": null\n}"
            },
            {
              "name": "Related services (with category payload)",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "auth": {
                  "type": "bearer",
                  "bearer": [
                    {
                      "key": "token",
                      "value": "{{mobile_token}}",
                      "type": "string"
                    }
                  ]
                },
                "url": "{{base_url}}/mobile/services/frequently-added",
                "description": "Read-only customer discovery. No body or {} returns most_booked across active categories, ranked by recorded non-cancelled, non-failed jobs (one per job, descending, ties by service ID). Returns booking_count and completed_booking_count; zero-booking services are omitted. With category_id, returns related_services from the explicit active, unpaused branch in alphabetical order; completed_booking_count is null. subcategory_id requires category_id and validates context only. Optional city_id filters service availability, not historical counts. service_ids and exclude_service_ids are merged exclusions. Page default 1; limit default 20, max 50. Both modes use the same catalog card shape. See docs/frequently-added-services.md.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"category_id\": 35,\n  \"subcategory_id\": 40,\n  \"service_ids\": [\n    10\n  ],\n  \"exclude_service_ids\": [],\n  \"page\": 1,\n  \"limit\": 20\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": true,\n  \"message\": \"Frequently added services fetched successfully\",\n  \"x\": {\n    \"parent_category\": {\n      \"id\": 35,\n      \"name\": \"AC Services\"\n    },\n    \"ranking_mode\": \"related_services\",\n    \"services\": [\n      {\n        \"id\": 11,\n        \"service_code\": \"SVC-011\",\n        \"name\": \"AC Gas Refill\",\n        \"service_type\": \"standard\",\n        \"selling_price\": 199,\n        \"vendor_price\": 150,\n        \"duration\": \"45 minutes\",\n        \"currency\": \"INR\",\n        \"image_names\": [\n          \"gas-refill.jpg\"\n        ],\n        \"image_urls\": [\n          \"https://esntlsapi.aquaninjas.in/public/service-media/gas-refill.jpg\"\n        ],\n        \"primary_image_url\": \"https://esntlsapi.aquaninjas.in/public/service-media/gas-refill.jpg\",\n        \"rating\": null,\n        \"rating_count\": 0,\n        \"completed_booking_count\": null,\n        \"faqs\": [],\n        \"variants\": [],\n        \"variant_count\": 0,\n        \"requires_variant_selection\": false,\n        \"cart_defaults\": {\n          \"service_id\": 11,\n          \"service_variant_id\": null,\n          \"quantity\": 1,\n          \"skill_ids\": []\n        }\n      }\n    ],\n    \"applied_filters\": {\n      \"category_id\": 35,\n      \"subcategory_id\": 40,\n      \"city_id\": null,\n      \"excluded_service_ids\": [\n        10\n      ]\n    },\n    \"pagination\": {\n      \"page\": 1,\n      \"limit\": 20,\n      \"total\": 1,\n      \"total_pages\": 1,\n      \"has_next\": false,\n      \"has_previous\": false\n    }\n  },\n  \"errors\": null\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Public Mobile Data",
      "item": [
        {
          "name": "GET /public/categories/by-level",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": {
              "raw": "{{base_url}}/public/categories/by-level?level=1",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "public",
                "categories",
                "by-level"
              ],
              "query": [
                {
                  "key": "level",
                  "value": "1",
                  "disabled": false,
                  "description": ""
                }
              ]
            },
            "description": "Get all active categories at one exact hierarchy level. Each category includes icon_url, image_url, and banner_url when an Admin has uploaded those assets. No authentication is required."
          },
          "response": []
        },
        {
          "name": "GET /mobile/coupons",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/mobile/coupons",
            "description": "List every configured coupon for mobile offer discovery. No customer token, cart, address, or coupon code is required. This response is display-only and does not confirm eligibility, availability, or automatic application; use the authenticated mobile coupon endpoints when a customer selects or checks out with a coupon."
          },
          "response": []
        },
        {
          "name": "GET /public/home-types",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/public/home-types",
            "description": "Get active home types"
          },
          "response": []
        },
        {
          "name": "GET /public/family-types",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/public/family-types",
            "description": "Get active family types"
          },
          "response": []
        },
        {
          "name": "GET /public/preferred-timings",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/public/preferred-timings",
            "description": "Get active preferred timings"
          },
          "response": []
        },
        {
          "name": "GET /public/appliances-owned",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/public/appliances-owned",
            "description": "Get active appliances owned"
          },
          "response": []
        },
        {
          "name": "GET /public/states",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/public/states",
            "description": "Get active states"
          },
          "response": []
        },
        {
          "name": "GET /public/cities",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/public/cities",
            "description": "Get active cities"
          },
          "response": []
        },
        {
          "name": "GET /public/service-categories",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/public/service-categories",
            "description": "Get active service categories"
          },
          "response": []
        },
        {
          "name": "GET /public/services",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/public/services",
            "description": "Get active services"
          },
          "response": []
        },
        {
          "name": "GET /public/services/{service_id}/faqs",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": "{{base_url}}/public/services/{{service_id}}/faqs",
            "description": "Get public service FAQs"
          },
          "response": []
        }
      ]
    },
    {
      "name": "State Master",
      "item": [
        {
          "name": "GET /states",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/states",
            "description": "List states"
          },
          "response": []
        },
        {
          "name": "POST /states",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/states",
            "description": "Create states",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Karnataka\",\n  \"status\": \"Active\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /states/{state_id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/states/{{state_id}}",
            "description": "Get states by ID"
          },
          "response": []
        },
        {
          "name": "PUT /states/{state_id}",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/states/{{state_id}}",
            "description": "Update states",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Karnataka\",\n  \"status\": \"Active\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "DELETE /states/{state_id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/states/{{state_id}}",
            "description": "Delete states"
          },
          "response": []
        },
        {
          "name": "GET /states/code-preview",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/states/code-preview",
            "description": "Preview generated state code"
          },
          "response": []
        }
      ]
    },
    {
      "name": "City Master",
      "item": [
        {
          "name": "GET /cities",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/cities",
            "description": "List cities"
          },
          "response": []
        },
        {
          "name": "POST /cities",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/cities",
            "description": "Create cities",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Bengaluru\",\n  \"state_id\": 1,\n  \"status\": \"Active\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /cities/{city_id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/cities/{{city_id}}",
            "description": "Get cities by ID"
          },
          "response": []
        },
        {
          "name": "PUT /cities/{city_id}",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/cities/{{city_id}}",
            "description": "Update cities",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Bengaluru\",\n  \"state_id\": 1,\n  \"status\": \"Active\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "DELETE /cities/{city_id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/cities/{{city_id}}",
            "description": "Delete cities"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Variant Master",
      "item": [
        {
          "name": "GET /variants",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/variants",
            "description": "List variant mappings"
          },
          "response": []
        },
        {
          "name": "POST /variants",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/variants",
            "description": "Create variant mappings",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"category_id\": 1,\n  \"subcategory_id\": 2,\n  \"variant_label\": \"Service Type\",\n  \"option_values\": [\n    \"Standard\",\n    \"Premium\"\n  ],\n  \"status\": \"Active\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /variants/{variant_id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/variants/{{variant_id}}",
            "description": "Get variant mappings by ID"
          },
          "response": []
        },
        {
          "name": "PUT /variants/{variant_id}",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/variants/{{variant_id}}",
            "description": "Update variant mappings",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"category_id\": 1,\n  \"subcategory_id\": 2,\n  \"variant_label\": \"Service Type\",\n  \"option_values\": [\n    \"Standard\",\n    \"Premium\"\n  ],\n  \"status\": \"Active\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "DELETE /variants/{variant_id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/variants/{{variant_id}}",
            "description": "Delete variant mappings"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Preference Masters",
      "item": [
        {
          "name": "GET /home-types",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/home-types",
            "description": "List home types"
          },
          "response": []
        },
        {
          "name": "POST /home-types",
          "request": {
            "method": "POST",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/home-types",
            "description": "Create home types with an optional uploaded image.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "label",
                  "type": "text",
                  "value": "",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "display_order",
                  "type": "text",
                  "value": "1",
                  "disabled": true,
                  "description": "Lower positions are returned first. Omit this when creating a record to add it at the end."
                },
                {
                  "key": "status",
                  "type": "text",
                  "value": "Active",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "image",
                  "type": "file",
                  "src": "",
                  "disabled": true,
                  "description": ""
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "GET /home-types/{id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/home-types/{{id}}",
            "description": "Get home types by ID"
          },
          "response": []
        },
        {
          "name": "PUT /home-types/{id}",
          "request": {
            "method": "PUT",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/home-types/{{id}}",
            "description": "Update home types and optionally replace its uploaded image.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "label",
                  "type": "text",
                  "value": "",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "display_order",
                  "type": "text",
                  "value": "1",
                  "disabled": true,
                  "description": "Lower positions are returned first. Omit this when creating a record to add it at the end."
                },
                {
                  "key": "status",
                  "type": "text",
                  "value": "Active",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "image",
                  "type": "file",
                  "src": "",
                  "disabled": true,
                  "description": ""
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "DELETE /home-types/{id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/home-types/{{id}}",
            "description": "Delete home types"
          },
          "response": []
        },
        {
          "name": "GET /family-types",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/family-types",
            "description": "List family types"
          },
          "response": []
        },
        {
          "name": "POST /family-types",
          "request": {
            "method": "POST",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/family-types",
            "description": "Create family types with an optional uploaded image.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "label",
                  "type": "text",
                  "value": "",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "display_order",
                  "type": "text",
                  "value": "1",
                  "disabled": true,
                  "description": "Lower positions are returned first. Omit this when creating a record to add it at the end."
                },
                {
                  "key": "status",
                  "type": "text",
                  "value": "Active",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "image",
                  "type": "file",
                  "src": "",
                  "disabled": true,
                  "description": ""
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "GET /family-types/{id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/family-types/{{id}}",
            "description": "Get family types by ID"
          },
          "response": []
        },
        {
          "name": "PUT /family-types/{id}",
          "request": {
            "method": "PUT",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/family-types/{{id}}",
            "description": "Update family types and optionally replace its uploaded image.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "label",
                  "type": "text",
                  "value": "",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "display_order",
                  "type": "text",
                  "value": "1",
                  "disabled": true,
                  "description": "Lower positions are returned first. Omit this when creating a record to add it at the end."
                },
                {
                  "key": "status",
                  "type": "text",
                  "value": "Active",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "image",
                  "type": "file",
                  "src": "",
                  "disabled": true,
                  "description": ""
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "DELETE /family-types/{id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/family-types/{{id}}",
            "description": "Delete family types"
          },
          "response": []
        },
        {
          "name": "GET /preferred-timings",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/preferred-timings",
            "description": "List preferred timings"
          },
          "response": []
        },
        {
          "name": "POST /preferred-timings",
          "request": {
            "method": "POST",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/preferred-timings",
            "description": "Create preferred timings with an optional uploaded image.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "label",
                  "type": "text",
                  "value": "",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "display_order",
                  "type": "text",
                  "value": "1",
                  "disabled": true,
                  "description": "Lower positions are returned first. Omit this when creating a record to add it at the end."
                },
                {
                  "key": "status",
                  "type": "text",
                  "value": "Active",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "image",
                  "type": "file",
                  "src": "",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "start_time",
                  "type": "text",
                  "value": "09:00",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "end_time",
                  "type": "text",
                  "value": "12:00",
                  "disabled": false,
                  "description": ""
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "GET /preferred-timings/{id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/preferred-timings/{{id}}",
            "description": "Get preferred timings by ID"
          },
          "response": []
        },
        {
          "name": "PUT /preferred-timings/{id}",
          "request": {
            "method": "PUT",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/preferred-timings/{{id}}",
            "description": "Update preferred timings and optionally replace its uploaded image.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "label",
                  "type": "text",
                  "value": "",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "display_order",
                  "type": "text",
                  "value": "1",
                  "disabled": true,
                  "description": "Lower positions are returned first. Omit this when creating a record to add it at the end."
                },
                {
                  "key": "status",
                  "type": "text",
                  "value": "Active",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "image",
                  "type": "file",
                  "src": "",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "start_time",
                  "type": "text",
                  "value": "09:00",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "end_time",
                  "type": "text",
                  "value": "12:00",
                  "disabled": false,
                  "description": ""
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "DELETE /preferred-timings/{id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/preferred-timings/{{id}}",
            "description": "Delete preferred timings"
          },
          "response": []
        },
        {
          "name": "GET /appliances-owned",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/appliances-owned",
            "description": "List appliances owned"
          },
          "response": []
        },
        {
          "name": "POST /appliances-owned",
          "request": {
            "method": "POST",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/appliances-owned",
            "description": "Create appliances owned with an optional uploaded image.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "label",
                  "type": "text",
                  "value": "",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "display_order",
                  "type": "text",
                  "value": "1",
                  "disabled": true,
                  "description": "Lower positions are returned first. Omit this when creating a record to add it at the end."
                },
                {
                  "key": "status",
                  "type": "text",
                  "value": "Active",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "image",
                  "type": "file",
                  "src": "",
                  "disabled": true,
                  "description": ""
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "GET /appliances-owned/{id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/appliances-owned/{{id}}",
            "description": "Get appliances owned by ID"
          },
          "response": []
        },
        {
          "name": "PUT /appliances-owned/{id}",
          "request": {
            "method": "PUT",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/appliances-owned/{{id}}",
            "description": "Update appliances owned and optionally replace its uploaded image.",
            "body": {
              "mode": "formdata",
              "formdata": [
                {
                  "key": "label",
                  "type": "text",
                  "value": "",
                  "disabled": false,
                  "description": ""
                },
                {
                  "key": "display_order",
                  "type": "text",
                  "value": "1",
                  "disabled": true,
                  "description": "Lower positions are returned first. Omit this when creating a record to add it at the end."
                },
                {
                  "key": "status",
                  "type": "text",
                  "value": "Active",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "image",
                  "type": "file",
                  "src": "",
                  "disabled": true,
                  "description": ""
                }
              ]
            }
          },
          "response": []
        },
        {
          "name": "DELETE /appliances-owned/{id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/appliances-owned/{{id}}",
            "description": "Delete appliances owned"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Skill Master",
      "item": [
        {
          "name": "GET /skills",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/skills",
            "description": "List skills"
          },
          "response": []
        },
        {
          "name": "POST /skills",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/skills",
            "description": "Create skills",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"skill_names\": \"AC repair, Plumbing\",\n  \"status\": \"Active\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /skills/{skill_id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/skills/{{skill_id}}",
            "description": "Get skills by ID"
          },
          "response": []
        },
        {
          "name": "PUT /skills/{skill_id}",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/skills/{{skill_id}}",
            "description": "Update skills",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"skill_names\": \"AC repair, Plumbing\",\n  \"status\": \"Active\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "DELETE /skills/{skill_id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/skills/{{skill_id}}",
            "description": "Delete skills"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Operations Command",
      "item": [
        {
          "name": "GET /ops-command/expert-workload",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/ops-command/expert-workload",
            "description": "List every expert with live availability, average rating, active count, inactive count, and total assigned-job count."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Exports",
      "item": [
        {
          "name": "GET /exports/experts",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/exports/experts",
            "description": "Download every Expert Management record as an Excel workbook. This ignores listing filters and pagination."
          },
          "response": []
        },
        {
          "name": "GET /exports/customers",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/exports/customers",
            "description": "Download every Customer 360 record as an Excel workbook. This ignores listing filters and pagination."
          },
          "response": []
        },
        {
          "name": "GET /exports/jobs",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/exports/jobs",
            "description": "Download every Jobs record as an Excel workbook. This ignores listing filters and pagination."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Expert Training",
      "item": [
        {
          "name": "GET /experts/{expert_id}/training-attempts",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/experts/{{expert_id}}/training-attempts",
            "description": "View every server-scored onboarding attempt, including selected and correct answers."
          },
          "response": []
        },
        {
          "name": "GET /training-questions",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/training-questions",
            "description": "List Admin-managed expert training questions."
          },
          "response": []
        },
        {
          "name": "POST /training-questions",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/training-questions",
            "description": "Create a single-choice question for one exact Category Master item.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"category_id\": 29,\n  \"question\": \"What should be checked before beginning service?\",\n  \"marks\": 10,\n  \"status\": \"Active\",\n  \"sort_order\": 0,\n  \"options\": [\n    {\n      \"option_text\": \"Confirm the issue and safety conditions\",\n      \"is_correct\": true\n    },\n    {\n      \"option_text\": \"Start work without inspection\",\n      \"is_correct\": false\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "PUT /training-questions/{question_id}",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/training-questions/{{question_id}}",
            "description": "Update a training question and its answer options.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"category_id\": 29,\n  \"question\": \"What should be checked before beginning service?\",\n  \"marks\": 10,\n  \"status\": \"Active\",\n  \"sort_order\": 0,\n  \"options\": [\n    {\n      \"option_text\": \"Confirm the issue and safety conditions\",\n      \"is_correct\": true\n    },\n    {\n      \"option_text\": \"Start work without inspection\",\n      \"is_correct\": false\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "DELETE /training-questions/{question_id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/training-questions/{{question_id}}",
            "description": "Delete a training question. Existing answer snapshots remain available in attempt history."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Admin Audit Logs",
      "item": [
        {
          "name": "GET /audit-logs",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/audit-logs",
            "description": "List server-generated Admin Portal create, update, and delete actions. Only Super Admin accounts can access audit records."
          },
          "response": []
        },
        {
          "name": "GET /audit-logs/{audit_log_id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/audit-logs/{{audit_log_id}}",
            "description": "View immutable previous and current values for one audit record."
          },
          "response": []
        },
        {
          "name": "GET /audit-logs/export",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/audit-logs/export",
            "description": "Export all matching audit logs to Excel, including previous and current values."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Service FAQs",
      "item": [
        {
          "name": "GET /services/{service_id}/faqs",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/services/{{service_id}}/faqs",
            "description": "List service FAQs"
          },
          "response": []
        },
        {
          "name": "POST /services/{service_id}/faqs",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/services/{{service_id}}/faqs",
            "description": "Create service FAQ",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"question\": \"What is included?\",\n  \"answer\": \"Service visit and inspection\",\n  \"status\": \"Active\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "PUT /services/{service_id}/faqs/{faq_id}",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/services/{{service_id}}/faqs/{{faq_id}}",
            "description": "Update service FAQ",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"question\": \"What is included?\",\n  \"answer\": \"Service visit and inspection\",\n  \"status\": \"Active\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "DELETE /services/{service_id}/faqs/{faq_id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/services/{{service_id}}/faqs/{{faq_id}}",
            "description": "Delete service FAQ"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Customer 360",
      "item": [
        {
          "name": "GET /customers",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/customers",
            "description": "List Customer 360 records with live job booking counts, last booking timestamps, and engagement percentages. Engagement adds 20 points per booking and is capped at 100%."
          },
          "response": []
        },
        {
          "name": "POST /customers",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/customers",
            "description": "Create customers",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Customer Name\",\n  \"phone\": \"9876543210\",\n  \"email\": \"customer@example.com\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /customers/{customer_id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/customers/{{customer_id}}",
            "description": "Get customers by ID"
          },
          "response": []
        },
        {
          "name": "PUT /customers/{customer_id}",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/customers/{{customer_id}}",
            "description": "Update customers",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Customer Name\",\n  \"phone\": \"9876543210\",\n  \"email\": \"customer@example.com\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "DELETE /customers/{customer_id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/customers/{{customer_id}}",
            "description": "Delete customers"
          },
          "response": []
        },
        {
          "name": "GET /customers/{customer_id}/notes",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/customers/{{customer_id}}/notes",
            "description": "List internal notes for one customer"
          },
          "response": []
        },
        {
          "name": "POST /customers/{customer_id}/notes",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/customers/{{customer_id}}/notes",
            "description": "Add an internal note to one customer",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"note\": \"Customer requested an afternoon appointment for future bookings.\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "DELETE /customers/{customer_id}/notes/{note_id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/customers/{{customer_id}}/notes/{{note_id}}",
            "description": "Delete an internal customer note"
          },
          "response": []
        },
        {
          "name": "GET /customers/{customer_id}/settings",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/customers/{{customer_id}}/settings",
            "description": "Get customer notification settings"
          },
          "response": []
        },
        {
          "name": "PUT /customers/{customer_id}/settings",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/customers/{{customer_id}}/settings",
            "description": "Update customer notification settings",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"settings\": {\n    \"whatsapp_updates\": true,\n    \"push_notifications\": true,\n    \"voice_calls\": false,\n    \"email_updates\": true,\n    \"sms_updates\": true\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /customers/{customer_id}/addresses",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/customers/{{customer_id}}/addresses",
            "description": "List all saved addresses for one customer"
          },
          "response": []
        },
        {
          "name": "POST /customers/{customer_id}/addresses",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/customers/{{customer_id}}/addresses",
            "description": "Add a customer address. Send google_place_id after selecting an address; the API resolves and stores the exact latitude and longitude.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"address_type\": \"Home\",\n  \"address_name\": \"Home\",\n  \"address\": \"Street and locality\",\n  \"google_place_id\": \"ChIJ...\",\n  \"house_flat_no\": \"Flat 402\",\n  \"floor\": \"4th Floor\",\n  \"building_name\": \"Example Residency\",\n  \"nearby_landmark\": \"Near City Mall\",\n  \"lift_available\": true,\n  \"parking_instructions\": \"Use visitor parking near Gate 2\",\n  \"receiver_name\": \"Receiver Name\",\n  \"receiver_phone\": \"9876543210\",\n  \"state_id\": 1,\n  \"city_id\": 1,\n  \"pincode\": \"560001\",\n  \"society\": \"Example Society\",\n  \"is_default\": false\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "PUT /customers/{customer_id}/addresses/{address_id}",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/customers/{{customer_id}}/addresses/{{address_id}}",
            "description": "Update a customer address. Send google_place_id after selecting an address; the API resolves and stores the exact latitude and longitude.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"address_type\": \"Work\",\n  \"address_name\": \"Main Office\",\n  \"address\": \"Office address\",\n  \"google_place_id\": \"ChIJ...\",\n  \"house_flat_no\": \"Suite 12\",\n  \"floor\": \"2nd Floor\",\n  \"building_name\": \"Business Park\",\n  \"nearby_landmark\": \"Near Metro Station\",\n  \"lift_available\": false,\n  \"parking_instructions\": \"Call on arrival\",\n  \"receiver_name\": \"Office Reception\",\n  \"receiver_phone\": \"9876543210\",\n  \"state_id\": 1,\n  \"city_id\": 1,\n  \"pincode\": \"560001\",\n  \"society\": \"Business Park\",\n  \"is_default\": false\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "DELETE /customers/{customer_id}/addresses/{address_id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/customers/{{customer_id}}/addresses/{{address_id}}",
            "description": "Remove a customer address"
          },
          "response": []
        },
        {
          "name": "PATCH /customers/{customer_id}/addresses/{address_id}/default",
          "request": {
            "method": "PATCH",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/customers/{{customer_id}}/addresses/{{address_id}}/default",
            "description": "Set the default customer address"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Mobile Cancellations",
      "item": [
        {
          "name": "GET /mobile/job-cancellation-reasons",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/job-cancellation-reasons",
            "description": "List active Admin-managed cancellation reasons available to customers. Reasons can require an additional note."
          },
          "response": []
        },
        {
          "name": "GET /mobile/jobs/{job_id}/cancellation-preview",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/jobs/{{job_id}}/cancellation-preview",
            "description": "Preview whether the signed-in customer can cancel a job, the Admin-configured cancellation window, any fee, and the Razorpay refund amount. COD cancellations always waive the fee because no payment has been collected."
          },
          "response": []
        },
        {
          "name": "POST /mobile/jobs/{job_id}/cancel",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/jobs/{{job_id}}/cancel",
            "description": "Cancel one eligible customer job. Paid Razorpay bookings receive a refund and, when the request is inside the configured window, a separate cancellation-fee payment link is emailed to the customer. COD cancellations are simply waived and cancelled.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"cancellation_reason_id\": 1,\n  \"note\": \"Plans changed\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        }
      ]
    },
    {
      "name": "Job Cancellation Reasons",
      "item": [
        {
          "name": "GET /job-cancellation-reasons",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/job-cancellation-reasons",
            "description": "List Admin-managed cancellation reasons, including their intended audience and whether a note is required."
          },
          "response": []
        },
        {
          "name": "POST /job-cancellation-reasons",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/job-cancellation-reasons",
            "description": "Create a cancellation reason for customers, experts, Admins, or all users.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"label\": \"Service no longer required\",\n  \"status\": \"Active\",\n  \"applicable_to\": \"Customer\",\n  \"requires_note\": false,\n  \"display_order\": 10\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "PUT /job-cancellation-reasons/{id}",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/job-cancellation-reasons/{{id}}",
            "description": "Update a cancellation reason and its audience.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"label\": \"My reason is not listed\",\n  \"status\": \"Active\",\n  \"applicable_to\": \"Customer\",\n  \"requires_note\": true,\n  \"display_order\": 40\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "DELETE /job-cancellation-reasons/{id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/job-cancellation-reasons/{{id}}",
            "description": "Delete a cancellation reason."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Experience Reason Master",
      "item": [
        {
          "name": "GET /experience-reasons",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/experience-reasons",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "experience-reasons"
              ],
              "query": [
                {
                  "key": "search",
                  "value": "late",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "status",
                  "value": "All",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "10",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "List all experience reasons with optional text search, status filter and pagination. Read x.experience_reasons and x.pagination."
          },
          "response": []
        },
        {
          "name": "POST /experience-reasons",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/experience-reasons",
            "description": "Create a reason with Active or Inactive status. Reason text is unique regardless of case.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"reason\": \"Expert arrived late\",\n  \"status\": \"Active\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /experience-reasons/{id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/experience-reasons/{{id}}",
            "description": "Get one experience reason for editing."
          },
          "response": []
        },
        {
          "name": "PUT /experience-reasons/{id}",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/experience-reasons/{{id}}",
            "description": "Update the reason text and status.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"reason\": \"Expert arrived late\",\n  \"status\": \"Active\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "DELETE /experience-reasons/{id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/experience-reasons/{{id}}",
            "description": "Delete an experience reason."
          },
          "response": []
        },
        {
          "name": "GET /mobile/experience-reasons",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/experience-reasons",
            "description": "List active low-rating feedback choices in x.experience_reasons for the signed-in customer. Each entry contains id, reason and status. This is a lookup only; it does not submit feedback."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "auth": {
                  "type": "bearer",
                  "bearer": [
                    {
                      "key": "token",
                      "value": "{{mobile_token}}",
                      "type": "string"
                    }
                  ]
                },
                "url": "{{base_url}}/mobile/experience-reasons",
                "description": "List active low-rating feedback choices in x.experience_reasons for the signed-in customer. Each entry contains id, reason and status. This is a lookup only; it does not submit feedback."
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": true,\n  \"message\": \"Experience reasons fetched\",\n  \"x\": {\n    \"experience_reasons\": [\n      {\n        \"id\": 1,\n        \"reason\": \"Expert arrived late\",\n        \"status\": \"Active\"\n      }\n    ]\n  },\n  \"errors\": null\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Complaint Reason Master",
      "item": [
        {
          "name": "GET /complaint-reasons",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/complaint-reasons",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "complaint-reasons"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "20",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "search",
                  "value": "service",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "status",
                  "value": "All",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "List complaint reasons with optional text search, status, and pagination."
          },
          "response": []
        },
        {
          "name": "POST /complaint-reasons",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/complaint-reasons",
            "description": "Create a complaint reason.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"reason\": \"Service issue not resolved\",\n  \"status\": \"Active\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /complaint-reasons/{id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/complaint-reasons/{{id}}",
            "description": "Get a complaint reason."
          },
          "response": []
        },
        {
          "name": "PUT /complaint-reasons/{id}",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/complaint-reasons/{{id}}",
            "description": "Update a complaint reason or its visibility.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"reason\": \"Service issue not resolved\",\n  \"status\": \"Active\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "DELETE /complaint-reasons/{id}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/complaint-reasons/{{id}}",
            "description": "Delete a complaint reason. Existing tickets retain their saved reason text."
          },
          "response": []
        },
        {
          "name": "GET /mobile/complaint-reasons",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/complaint-reasons",
            "description": "List active reasons in x.complaint_reasons."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "auth": {
                  "type": "bearer",
                  "bearer": [
                    {
                      "key": "token",
                      "value": "{{mobile_token}}",
                      "type": "string"
                    }
                  ]
                },
                "url": "{{base_url}}/mobile/complaint-reasons",
                "description": "List active reasons in x.complaint_reasons."
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": true,\n  \"message\": \"Complaint reasons fetched\",\n  \"x\": {\n    \"complaint_reasons\": [\n      {\n        \"id\": 1,\n        \"reason\": \"Service issue not resolved\",\n        \"status\": \"Active\"\n      }\n    ]\n  },\n  \"errors\": null\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Mobile Complaints",
      "item": [
        {
          "name": "GET /mobile/complaints/eligible-jobs",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/mobile/complaints/eligible-jobs",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "mobile",
                "complaints",
                "eligible-jobs"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "20",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "List the signed-in customer’s completed or closed jobs for the complaint picker. Returns x.jobs and x.pagination."
          },
          "response": []
        },
        {
          "name": "GET /mobile/complaints",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/mobile/complaints",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "mobile",
                "complaints"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "20",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "tab",
                  "value": "active",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "List the signed-in customer’s complaints. Use tab=active for open tickets or tab=closed for resolved tickets."
          },
          "response": []
        },
        {
          "name": "POST /mobile/complaints",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/complaints",
            "description": "Submit an Open complaint with exactly one of job_id or order_id. Use JSON without files or multipart with up to 3 private attachments. Choose an active reason and provide a description. Use actual IDs from your account.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"job_id\": 42,\n  \"complaint_reason_id\": 1,\n  \"description\": \"The issue returned after service.\",\n  \"preferred_outcome\": \"Service revisit requested\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "auth": {
                  "type": "bearer",
                  "bearer": [
                    {
                      "key": "token",
                      "value": "{{mobile_token}}",
                      "type": "string"
                    }
                  ]
                },
                "url": "{{base_url}}/mobile/complaints",
                "description": "Submit an Open complaint with exactly one of job_id or order_id. Use JSON without files or multipart with up to 3 private attachments. Choose an active reason and provide a description. Use actual IDs from your account.",
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"job_id\": 42,\n  \"complaint_reason_id\": 1,\n  \"description\": \"The issue returned after service.\",\n  \"preferred_outcome\": \"Service revisit requested\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                }
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": true,\n  \"message\": \"Complaint submitted\",\n  \"x\": {\n    \"complaint\": {\n      \"id\": 21,\n      \"code\": \"CMP-0123456789ABCDEF\",\n      \"order_id\": 30,\n      \"order_code\": \"ORD-000030\",\n      \"job_id\": 42,\n      \"job_code\": \"ESJ-000042\",\n      \"status\": \"Open\",\n      \"reason\": \"Service issue not resolved\"\n    }\n  },\n  \"errors\": null\n}"
            },
            {
              "name": "Submit with a photo or video",
              "originalRequest": {
                "method": "POST",
                "header": [],
                "auth": {
                  "type": "bearer",
                  "bearer": [
                    {
                      "key": "token",
                      "value": "{{mobile_token}}",
                      "type": "string"
                    }
                  ]
                },
                "url": "{{base_url}}/mobile/complaints",
                "description": "Submit an Open complaint with exactly one of job_id or order_id. Use JSON without files or multipart with up to 3 private attachments. Choose an active reason and provide a description. Use actual IDs from your account.",
                "body": {
                  "mode": "formdata",
                  "formdata": [
                    {
                      "key": "job_id",
                      "type": "text",
                      "value": "42"
                    },
                    {
                      "key": "complaint_reason_id",
                      "type": "text",
                      "value": "1"
                    },
                    {
                      "key": "description",
                      "type": "text",
                      "value": "The issue returned after service."
                    },
                    {
                      "key": "preferred_outcome",
                      "type": "text",
                      "value": "Service revisit requested"
                    },
                    {
                      "key": "attachments",
                      "type": "file",
                      "src": "",
                      "description": "Select a supported file. Repeat this field for each attachment."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": true,\n  \"message\": \"Complaint submitted\",\n  \"x\": {\n    \"complaint\": {\n      \"id\": 21,\n      \"code\": \"CMP-0123456789ABCDEF\",\n      \"order_id\": 30,\n      \"order_code\": \"ORD-000030\",\n      \"job_id\": 42,\n      \"job_code\": \"ESJ-000042\",\n      \"status\": \"Open\",\n      \"reason\": \"Service issue not resolved\"\n    }\n  },\n  \"errors\": null\n}"
            }
          ]
        },
        {
          "name": "GET /mobile/complaints/{id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/complaints/{{id}}",
            "description": "Get the customer-owned ticket, booking snapshot, attachments, and timestamped updates. Each x.attachments entry includes a full url. Fetch it with the same customer Bearer token; URLs are not public."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [],
                "auth": {
                  "type": "bearer",
                  "bearer": [
                    {
                      "key": "token",
                      "value": "{{mobile_token}}",
                      "type": "string"
                    }
                  ]
                },
                "url": "{{base_url}}/mobile/complaints/{{id}}",
                "description": "Get the customer-owned ticket, booking snapshot, attachments, and timestamped updates. Each x.attachments entry includes a full url. Fetch it with the same customer Bearer token; URLs are not public."
              },
              "status": "OK",
              "code": 200,
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"status\": true,\n  \"message\": \"Complaint fetched\",\n  \"errors\": null,\n  \"x\": {\n    \"complaint\": {\n      \"id\": 21,\n      \"status\": \"Open\"\n    },\n    \"updates\": [],\n    \"attachments\": [\n      {\n        \"id\": 4,\n        \"name\": \"photo.png\",\n        \"mime_type\": \"image/png\",\n        \"size\": 10240,\n        \"url\": \"https://esntlsapi.aquaninjas.in/api/mobile/complaints/21/attachments/4\"\n      },\n      {\n        \"id\": 5,\n        \"name\": \"clip.mp4\",\n        \"mime_type\": \"video/mp4\",\n        \"size\": 204800,\n        \"url\": \"https://esntlsapi.aquaninjas.in/api/mobile/complaints/21/attachments/5\"\n      }\n    ]\n  }\n}"
            }
          ]
        },
        {
          "name": "GET /mobile/complaints/{id}/attachments/{attachment_id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/complaints/{{id}}/attachments/{{attachment_id}}",
            "description": "Download an attachment from the signed-in customer’s own ticket."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Admin Complaints",
      "item": [
        {
          "name": "GET /admin/complaints",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/admin/complaints",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "admin",
                "complaints"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "1",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "limit",
                  "value": "20",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "search",
                  "value": "service",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "status",
                  "value": "Open",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "List complaints with optional search and status filters, pagination, and status totals."
          },
          "response": []
        },
        {
          "name": "GET /admin/complaints/{id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/complaints/{{id}}",
            "description": "Get complaint details, the linked booking, attachments, and status history."
          },
          "response": []
        },
        {
          "name": "PATCH /admin/complaints/{id}/status",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/complaints/{{id}}/status",
            "description": "Advance Open to Under Review to In Progress to Resolved. An optional note is customer-visible; submit the current status with a note to record an update without advancing.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"status\": \"Under Review\",\n  \"note\": \"We are reviewing your complaint.\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /admin/complaints/{id}/attachments/{attachment_id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/complaints/{{id}}/attachments/{{attachment_id}}",
            "description": "Download a private attachment from the given ticket."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Mobile Payments",
      "item": [
        {
          "name": "POST /mobile/orders",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/orders",
            "description": "Create a booking checkout. A cart service line can include add-ons as [{addon_id, quantity}]; the server verifies category relevance and loads every add-on price/details itself. The server calculates pricing, coupon discount, wallet application, and any Razorpay remainder. Set use_wallet true with wallet_amount to reserve up to that amount from the current wallet balance. If the wallet covers the total, x.order is returned immediately and do not call verify-payment. If a Razorpay remainder exists, use the returned amount only; never calculate the remainder on the app. COD is allowed with wallet balance applied to reduce the cash collection amount.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"address_id\": 12,\n  \"payment_method\": \"Razorpay\",\n  \"use_wallet\": true,\n  \"wallet_amount\": 150,\n  \"cart_items\": [\n    {\n      \"service_id\": 1,\n      \"service_variant_id\": null,\n      \"quantity\": 1,\n      \"skill_ids\": [\n        1\n      ],\n      \"scheduled_date\": \"2026-11-05\",\n      \"slot_start\": \"10:00\",\n      \"slot_end\": \"12:00\",\n      \"assignment_mode\": \"selected\",\n      \"expert_id\": 4,\n      \"addons\": [\n        {\n          \"addon_id\": 12,\n          \"quantity\": 1\n        }\n      ]\n    },\n    {\n      \"service_id\": 2,\n      \"service_variant_id\": null,\n      \"quantity\": 1,\n      \"skill_ids\": [],\n      \"scheduled_date\": \"2026-11-06\",\n      \"slot_start\": \"14:00\",\n      \"slot_end\": \"16:00\",\n      \"assignment_mode\": \"auto\",\n      \"addons\": []\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /mobile/orders/verify-payment",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/orders/verify-payment",
            "description": "Verify the Razorpay callback signature and captured remaining payment. Call only when the checkout response says requires_razorpay: true; full-wallet and COD bookings are already created by POST /mobile/orders.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"checkout_session_id\": \"6b685d6a-267a-4a22-b16a-2b30a34e2b1d\",\n  \"razorpay_payment_id\": \"pay_XXXXXXXXXXXXXX\",\n  \"razorpay_order_id\": \"order_XXXXXXXXXXXXXX\",\n  \"razorpay_signature\": \"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        }
      ]
    },
    {
      "name": "Mobile Ratings",
      "item": [
        {
          "name": "POST /mobile/jobs/{job_id}/service-rating",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/jobs/{{job_id}}/service-rating",
            "description": "Submit or update a service rating for the signed-in customer's completed or closed job. For 1-4 stars, send an active experience_reason_id from GET /mobile/experience-reasons and non-blank review (max 2000 characters). For 5 stars, both are optional and no reason is stored. Skip for Now: do not submit.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"rating\": 5,\n  \"review\": \"Fast, professional service.\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /mobile/jobs/{job_id}/expert-rating",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/jobs/{{job_id}}/expert-rating",
            "description": "Submit or update a expert rating for the signed-in customer's completed or closed assigned job. For 1-4 stars, send an active experience_reason_id from GET /mobile/experience-reasons and non-blank review (max 2000 characters). For 5 stars, both are optional and no reason is stored. Skip for Now: do not submit.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"rating\": 4,\n  \"experience_reason_id\": 1,\n  \"review\": \"The expert arrived after the scheduled slot.\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        }
      ]
    },
    {
      "name": "Mobile Wallet",
      "item": [
        {
          "name": "POST /mobile/wallet/top-ups",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/wallet/top-ups",
            "description": "Create a Razorpay checkout to add customer wallet balance. Send an INR amount from 1 to 100000. This endpoint never credits the wallet; open Razorpay using x.checkout and then call the dedicated verification endpoint after payment.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": 500\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /mobile/wallet/top-ups/verify-payment",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/wallet/top-ups/verify-payment",
            "description": "Verify the Razorpay callback signature and captured amount for a wallet top-up, then credit the customer wallet exactly once through the immutable ledger. Do not adjust balance locally and do not use the order verification endpoint for a top-up.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"checkout_session_id\": \"6b685d6a-267a-4a22-b16a-2b30a34e2b1d\",\n  \"razorpay_payment_id\": \"pay_XXXXXXXXXXXXXX\",\n  \"razorpay_order_id\": \"order_XXXXXXXXXXXXXX\",\n  \"razorpay_signature\": \"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        }
      ]
    },
    {
      "name": "Job Operations",
      "item": [
        {
          "name": "GET /jobs",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/jobs",
            "description": "List live jobs for the Admin portal, including start_otp, OTP verification state and payment_total (the job share of the saved checkout total, excluding tips; null if unavailable). Existing total_amount is the job line subtotal. Supports status, expert_id, customer_id, search, page, and limit filters."
          },
          "response": []
        },
        {
          "name": "POST /admin/orders",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/orders",
            "description": "Create an Admin booking using the same catalog, location, availability, category-pause, emergency-pause, and financial rules as mobile checkout. COD creates jobs immediately with Pending Collection; Razorpay creates a 16-minute hosted payment link, keeps it available in the customer app, and sends an ESNTLS booking email with the payment link when the customer has an email address. No SMS notification is requested. Jobs are created only after customer confirmation.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"customer_id\": 18,\n  \"address_id\": 7,\n  \"payment_method\": \"Razorpay\",\n  \"cart_items\": [\n    {\n      \"service_id\": 8,\n      \"service_variant_id\": null,\n      \"quantity\": 1,\n      \"skill_ids\": [],\n      \"scheduled_date\": \"2026-10-08\",\n      \"slot_start\": \"10:00\",\n      \"slot_end\": \"12:00\",\n      \"assignment_mode\": \"selected\",\n      \"expert_id\": 5,\n      \"is_addon\": false\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /jobs/{job_id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/jobs/{{job_id}}",
            "description": "Get job details, start_otp, OTP verification state, and event history. x.job.payment_breakdown itemizes saved base service, add-ons, discounts, GST, platform fee and any checkout adjustment. Its total_amount equals x.job.payment_total. Wallet allocation is informational, and credited tips are listed separately and excluded from the total."
          },
          "response": []
        },
        {
          "name": "GET /jobs/{job_id}/assignment-candidates",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/jobs/{{job_id}}/assignment-candidates",
            "description": "List every expert with assignment eligibility, category and skill coverage, same-slot conflicts, and upcoming jobs for this job."
          },
          "response": []
        },
        {
          "name": "PATCH /jobs/{job_id}/assignment",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/jobs/{{job_id}}/assignment",
            "description": "Assign, change, or remove a job expert. Active status, matching skills/categories, dated unavailable periods, and existing job overlaps are enforced.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"expert_id\": 4,\n  \"note\": \"Assigned after customer request\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "PATCH /jobs/{job_id}/status",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/jobs/{{job_id}}/status",
            "description": "Set any job lifecycle status. Moving to In Progress requires the job four-digit start_otp. Cancellation statuses require an active cancellation reason.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"status\": \"In Progress\",\n  \"start_otp\": \"2452\",\n  \"note\": \"Customer OTP verified at arrival\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "PATCH /jobs/status",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/jobs/status",
            "description": "Set one lifecycle status for multiple jobs. A bulk In Progress update is an explicit Admin override and does not require or verify individual customer OTPs; each affected job event records that override. Cancellation statuses require an active cancellation reason.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"job_ids\": [\n    1,\n    2\n  ],\n  \"status\": \"In Progress\",\n  \"note\": \"Bulk operational start approved by Admin\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        }
      ]
    },
    {
      "name": "Mobile Coupons",
      "item": [
        {
          "name": "POST /mobile/coupons/eligible",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/coupons/eligible",
            "description": "List every coupon eligible for this authenticated customer and current cart/address. The response includes the exact server-calculated discount.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"address_id\": 12,\n  \"cart_items\": [\n    {\n      \"service_id\": 1,\n      \"service_variant_id\": null,\n      \"quantity\": 1\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /mobile/coupons/validate",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/coupons/validate",
            "description": "Validate a customer-entered code or selected coupon for the current cart/address.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"address_id\": 12,\n  \"coupon_code\": \"ESNWELCOME100\",\n  \"cart_items\": [\n    {\n      \"service_id\": 1,\n      \"service_variant_id\": null,\n      \"quantity\": 1\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /mobile/coupons/apply-best",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/coupons/apply-best",
            "description": "Return the highest-value eligible automatic or personalized coupon for the current cart/address.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"address_id\": 12,\n  \"cart_items\": [\n    {\n      \"service_id\": 1,\n      \"service_variant_id\": null,\n      \"quantity\": 1\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /mobile/coupons/remove",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/coupons/remove",
            "description": "Remove a client-selected coupon from the current checkout. Checkout remains server-authoritative.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"coupon_id\": 1\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        }
      ]
    },
    {
      "name": "Coupon Management",
      "item": [
        {
          "name": "GET /admin/coupons",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/coupons",
            "description": "List coupon rules with live redemption and customer-assignment counts."
          },
          "response": []
        },
        {
          "name": "POST /admin/coupons",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/coupons",
            "description": "Create a server-enforced coupon. Percentage discounts cannot exceed 90%. Campaign features are intentionally excluded.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"code\": \"ESNWELCOME100\",\n  \"name\": \"ESN Welcome Rs 100 Off\",\n  \"coupon_type\": \"Code\",\n  \"status\": \"Active\",\n  \"discount_type\": \"Flat\",\n  \"discount_value\": 100,\n  \"min_order_amount\": 499,\n  \"total_usage_limit\": 1000,\n  \"per_customer_limit\": 1,\n  \"budget_amount\": 100000,\n  \"first_order_only\": true,\n  \"audience_type\": \"AllCustomers\",\n  \"customer_ids\": [],\n  \"state_id\": null,\n  \"city_id\": null,\n  \"category_ids\": [],\n  \"service_ids\": [],\n  \"variant_ids\": [],\n  \"start_at\": \"2026-10-09T00:00:00.000Z\",\n  \"end_at\": \"2026-12-31T23:59:59.000Z\",\n  \"terms\": [\n    \"Valid once per customer\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /admin/coupons/report",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/coupons/report",
            "description": "Get basic redeemed/reserved/released coupon totals and invalid attempt count."
          },
          "response": []
        },
        {
          "name": "GET /admin/coupons/dashboard",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": {
              "raw": "{{base_url}}/admin/coupons/dashboard",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "admin",
                "coupons",
                "dashboard"
              ],
              "query": [
                {
                  "key": "start_date",
                  "value": "2026-10-01",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "end_date",
                  "value": "2026-10-31",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "status",
                  "value": "Active",
                  "disabled": true,
                  "description": ""
                },
                {
                  "key": "coupon_type",
                  "value": "Code",
                  "disabled": true,
                  "description": ""
                }
              ]
            },
            "description": "Get live coupon dashboard metrics from stored coupon, redemption, linked-order, and validation-decision records. It intentionally excludes unavailable channel attribution, ROAS, and customer segmentation metrics."
          },
          "response": []
        },
        {
          "name": "GET /admin/coupons/{coupon_id}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/coupons/{{coupon_id}}",
            "description": "Get one coupon including selected-customer assignments."
          },
          "response": []
        },
        {
          "name": "PUT /admin/coupons/{coupon_id}",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/coupons/{{coupon_id}}",
            "description": "Update a coupon rule. Existing redemptions retain their immutable snapshot. Percentage discounts cannot exceed 90%.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"code\": \"ESNWELCOME100\",\n  \"name\": \"ESN Welcome Rs 100 Off\",\n  \"coupon_type\": \"Code\",\n  \"status\": \"Active\",\n  \"discount_type\": \"Flat\",\n  \"discount_value\": 100,\n  \"min_order_amount\": 499,\n  \"audience_type\": \"AllCustomers\",\n  \"customer_ids\": [],\n  \"category_ids\": [],\n  \"service_ids\": [],\n  \"variant_ids\": [],\n  \"start_at\": \"2026-10-09T00:00:00.000Z\",\n  \"terms\": []\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "PATCH /admin/coupons/{coupon_id}/status",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{auth_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/admin/coupons/{{coupon_id}}/status",
            "description": "Activate, pause, archive, or return a coupon to Draft.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"status\": \"Paused\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        }
      ]
    },
    {
      "name": "Expert Job Execution",
      "item": [
        {
          "name": "GET /expert/job-cancellation-reasons",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{expert_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/expert/job-cancellation-reasons",
            "description": "Active expert rejection/cancellation reasons; requires_note controls the existing note field."
          },
          "response": []
        },
        {
          "name": "GET /expert/jobs/{job_id}/execution",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{expert_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/expert/jobs/{{job_id}}/execution",
            "description": "Read durable acceptance, timer, checklist, photo flags, report and additional-work quotes. Response x.execution includes allocated base_amount, base_cash_collected and elapsed_seconds."
          },
          "response": []
        },
        {
          "name": "POST /expert/jobs/{job_id}/actions",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{expert_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/expert/jobs/{{job_id}}/actions",
            "description": "action: accept, reject, start-work, end-work, complete, close or collect-cash. Rejection requires an expert reason and unassigns without cancelling the booking. Work requires verified start OTP. Close requires completed execution and settled payments. collect-cash is explicit receipt confirmation; optional additional_work_id selects an approved quote.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"action\": \"accept\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "PUT /expert/jobs/{job_id}/execution/checklist",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{expert_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/expert/jobs/{{job_id}}/execution/checklist",
            "description": "Persist one checklist key returned by execution. Requires started work; cannot edit after ending work.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"key\": \"Initial inspection\",\n  \"completed\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "PUT /expert/jobs/{job_id}/execution/report",
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{expert_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/expert/jobs/{{job_id}}/execution/report",
            "description": "Save the existing six-field service report after ending work. Enum choices match the existing Expert App form.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"overall\": \"Good\",\n  \"cooling\": \"Good\",\n  \"gas\": \"Good\",\n  \"filter\": \"Clean\",\n  \"coil\": \"Good\",\n  \"drain\": \"Clear\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /expert/jobs/{job_id}/execution/photos",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{expert_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/expert/jobs/{{job_id}}/execution/photos",
            "description": "Upload before/after work photo as base64, maximum 5 MB decoded, JPEG/PNG/WebP. Before photo locks when work starts; all photos lock when work ends.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"stage\": \"before\",\n  \"file_name\": \"before.jpg\",\n  \"file_base64\": \"{{work_photo_base64}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /expert/jobs/{job_id}/execution/photos/{stage}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{expert_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/expert/jobs/{{job_id}}/execution/photos/{{stage}}",
            "description": "Download private photo as binary using the assigned expert or booking-owner token. No public URL."
          },
          "response": []
        },
        {
          "name": "DELETE /expert/jobs/{job_id}/execution/photos/{stage}",
          "request": {
            "method": "DELETE",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{expert_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/expert/jobs/{{job_id}}/execution/photos/{{stage}}",
            "description": "Remove an editable work photo; before photo cannot be deleted after work starts."
          },
          "response": []
        },
        {
          "name": "GET /mobile/jobs/{job_id}/execution/photos/{stage}",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/jobs/{{job_id}}/execution/photos/{{stage}}",
            "description": "Download private photo as binary using the assigned expert or booking-owner token. No public URL."
          },
          "response": []
        },
        {
          "name": "POST /expert/jobs/{job_id}/additional-work",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{expert_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/expert/jobs/{{job_id}}/additional-work",
            "description": "Request a quote; customer approval is mandatory. Does not charge or self-approve. Only one pending quote at a time.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"work_type\": \"Gas refill\",\n  \"description\": \"Additional work found during inspection\",\n  \"amount\": 650,\n  \"duration_minutes\": 45\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "GET /mobile/jobs/{job_id}/execution",
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/jobs/{{job_id}}/execution",
            "description": "Booking owner reads execution and quote UUIDs from x.execution.additional_work. Approval is independent of payment."
          },
          "response": []
        },
        {
          "name": "POST /mobile/jobs/{job_id}/additional-work/{request_id}/decision",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/jobs/{{job_id}}/additional-work/{{request_id}}/decision",
            "description": "Booking owner approves or rejects a pending quote. Approved quote adds the Additional work checklist item. Repeated identical decisions are a no-op.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"status\": \"Approved\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /mobile/jobs/{job_id}/additional-work/{request_id}/payment-order",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/jobs/{{job_id}}/additional-work/{{request_id}}/payment-order",
            "description": "Create/reuse a Razorpay order for approved unpaid work. Read razorpay_order_id, razorpay_key_id and amount from the quote in x.execution. Checkout amount is quote amount times 100. Never use original booking verify-payment for this quote.",
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        },
        {
          "name": "POST /mobile/jobs/{job_id}/additional-work/{request_id}/verify-payment",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "auth": {
              "type": "bearer",
              "bearer": [
                {
                  "key": "token",
                  "value": "{{mobile_token}}",
                  "type": "string"
                }
              ]
            },
            "url": "{{base_url}}/mobile/jobs/{{job_id}}/additional-work/{{request_id}}/verify-payment",
            "description": "Verify quote payment signature AND provider-captured amount/order/currency. Idempotently records capture and ledger; never accept a client-only Paid flag.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"razorpay_order_id\": \"order_example\",\n  \"razorpay_payment_id\": \"pay_example\",\n  \"razorpay_signature\": \"{{razorpay_signature}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": []
        }
      ]
    }
  ]
}
