{"openapi":"3.0.3","info":{"title":"ESNTLS API","version":"1.0.0","description":"Official ESNTLS API reference for the Admin Portal and mobile application. Every response contains status, message, x, and errors."},"servers":[{"url":"https://esntlsapi.aquaninjas.in/api","description":"ESNTLS production API"}],"tags":[{"name":"Super Admin Authentication"},{"name":"Admin Profile"},{"name":"Staff Management"},{"name":"Emergency Controls"},{"name":"Global Search"},{"name":"Category Master"},{"name":"State Master"},{"name":"City Master"},{"name":"Variant Master"},{"name":"Preference Masters"},{"name":"Skill Master"},{"name":"Expert Management"},{"name":"Expert Mobile App"},{"name":"Service Catalog"},{"name":"Service FAQs"},{"name":"Customer 360"},{"name":"Mobile App"},{"name":"Mobile Coupons"},{"name":"Coupon Management"},{"name":"Mobile Orders"},{"name":"Mobile Ratings"},{"name":"Job Operations"},{"name":"Exports"},{"name":"Finance"},{"name":"Public Mobile Data"}],"paths":{"/mobile/jobs/{job_id}/address":{"patch":{"tags":["Mobile Orders"],"summary":"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.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"address_id":37}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"example":{"status":true,"message":"Booking details updated successfully","x":{"job":{"id":40,"job_code":"ESJ-000040","status":"Expert Assigned","address":{"address":"Selected saved service address","pincode":"834001","city":{"id":1,"name":"City"},"state":{"id":2,"name":"State"},"receiver_name":"Service receiver","receiver_phone":"9876543210"}},"changed":true,"payment_unchanged":true},"errors":null}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"404":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"422":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/mobile/jobs/{job_id}/receiver-contact":{"patch":{"tags":["Mobile Orders"],"summary":"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.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"receiver_name":"Service receiver","receiver_phone":"9876543210"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"example":{"status":true,"message":"Booking details updated successfully","x":{"job":{"id":40,"job_code":"ESJ-000040","status":"Expert Assigned","address":{"address":"Selected saved service address","pincode":"834001","city":{"id":1,"name":"City"},"state":{"id":2,"name":"State"},"receiver_name":"Service receiver","receiver_phone":"9876543210"}},"changed":true,"payment_unchanged":true},"errors":null}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"404":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"422":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/mobile/checkout-settings":{"get":{"tags":["Mobile Orders"],"summary":"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.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"example":{"status":true,"message":"Checkout settings fetched successfully","x":{"currency":"INR","gst":{"rate":18,"price_basis":"exclusive","applies_to":"service_subtotal"},"platform_fee":{"amount":49,"type":"fixed","applies_per":"order","included_in_gst_base":false},"calculation":{"service_subtotal_includes_addons":true,"wallet_reduces_taxable_value":false,"final_amount_source":"POST /mobile/orders"}},"errors":null}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"503":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/mobile/push-devices":{"post":{"tags":["Customer Notifications"],"summary":"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.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"fcm_token":"{{fcm_token}}","platform":"android","installation_id":"{{installation_id}}"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"delete":{"tags":["Customer Notifications"],"summary":"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.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"fcm_token":"{{fcm_token}}"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/mobile/notifications":{"get":{"tags":["Customer Notifications"],"summary":"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.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"unread_only","in":"query","schema":{"type":"boolean","default":false}}]}},"/mobile/notifications/unread-count":{"get":{"tags":["Customer Notifications"],"summary":"Return x.unread_count for the current customer bell badge. Opening the list does not automatically mark notifications read.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/mobile/notifications/read-all":{"patch":{"tags":["Customer Notifications"],"summary":"Mark current customer notifications read through an optional ISO before cutoff. Omit before to use server current time. Newer notifications remain unread.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/mobile/notifications/{notification_id}":{"get":{"tags":["Customer Notifications"],"summary":"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.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"notification_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}]}},"/mobile/notifications/{notification_id}/read":{"patch":{"tags":["Customer Notifications"],"summary":"Idempotently mark one owned notification read. Does not change another account or send a push.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"notification_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}]}},"/mobile/wallet":{"get":{"tags":["Customer Wallet"],"summary":"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.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"example":{"status":true,"message":"Wallet fetched successfully","x":{"wallet":{"id":7,"customer_id":32,"available_balance":250,"lifetime_credited":500,"lifetime_debited":250,"currency":"INR","status":"Active"},"transactions":[{"id":14,"direction":"Credit","transaction_type":"Cancellation Refund","amount":250,"balance_before":0,"balance_after":250,"order_id":120,"job_id":441,"reason":"Plans changed","reference":"ESJ-000441","occurred_at":"2026-11-02T12:00:00.000Z"}],"pagination":{"page":1,"limit":20,"total_items":1,"total_pages":1,"has_next":false}},"errors":null}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"transaction_type","in":"query","required":false,"schema":{"type":"string","maxLength":50},"description":"Optional exact wallet transaction type filter."}]}},"/customers/{customer_id}/wallet":{"get":{"tags":["Customer Wallet"],"summary":"Admin Customer 360 wallet balance and immutable ledger for one customer.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"example":{"status":true,"message":"Customer wallet fetched successfully","x":{"customer":{"id":32,"customer_code":"ESC-032","name":"Example Customer","phone":"7811111111"},"wallet":{"id":7,"customer_id":32,"available_balance":250,"lifetime_credited":500,"lifetime_debited":250,"currency":"INR","status":"Active"},"transactions":[],"pagination":{"page":1,"limit":20,"total_items":0,"total_pages":1,"has_next":false}},"errors":null}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"transaction_type","in":"query","required":false,"schema":{"type":"string","maxLength":50},"description":"Optional exact wallet transaction type filter."}]}},"/customers/{customer_id}/wallet/adjustments":{"post":{"tags":["Customer Wallet"],"summary":"Admin-only manual wallet credit or debit. reason and reference are mandatory and every successful change is permanently auditable.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"direction":"Credit","amount":250,"reason":"Approved service recovery credit","reference":"CASE-2026-001","note":"Customer support approval recorded."}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"example":{"status":true,"message":"Wallet adjusted successfully","x":{"wallet":{"id":7,"available_balance":500,"lifetime_credited":750,"lifetime_debited":250,"currency":"INR","status":"Active"},"transaction":{"id":15,"direction":"Credit","transaction_type":"Admin Credit","amount":250,"balance_before":250,"balance_after":500,"reason":"Approved service recovery credit","reference":"CASE-2026-001"}},"errors":null}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/wallet-ledger":{"get":{"tags":["Customer Wallet"],"summary":"Admin-only global wallet ledger with optional customer, direction, transaction type, and date filters. Use page and limit for exports or review.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"customer_id","in":"query","schema":{"type":"integer","minimum":1}},{"name":"direction","in":"query","schema":{"type":"string","enum":["All","Credit","Debit"],"default":"All"}},{"name":"transaction_type","in":"query","schema":{"type":"string"}},{"name":"from","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}]}},"/verify-login-2fa-sa":{"post":{"tags":["Super Admin Authentication"],"summary":"Verify the emailed four-digit login OTP after a two_factor_required response.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"email":"admin@example.com","otp":"1234"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/webhooks/razorpay":{"post":{"tags":["Finance"],"summary":"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.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"event":"payment_link.paid","payload":{}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"x-razorpay-signature","in":"header","required":true,"schema":{"type":"string","example":"{{razorpay_webhook_signature}}"}}]}},"/expert/wallet":{"get":{"tags":["Expert Wallet"],"summary":"Get the signed-in expert wallet and newest-first paginated transaction history, including tip source and booking reference.","security":[{"ExpertBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"example":{"status":true,"message":"Expert wallet fetched","x":{"wallet":{"expert_id":5,"available_balance":20,"available_balance_paise":2000,"currency":"INR"},"transactions":[{"id":"1","type":"tip_credit","amount":20,"amount_paise":2000,"currency":"INR","source":"Customer tip via Razorpay","customer_name":"Example Customer","job_id":54,"job_code":"ESJ-000054","tip_id":"90cbdaf7-6258-491f-99e8-0cc12fa688f8","payment_reference":"pay_XXXXXXXXXXXXXX","created_at":"2026-11-09T10:00:00.000Z"}],"pagination":{"page":1,"limit":20,"total":1,"total_pages":1,"has_next":false}},"errors":null}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"404":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"422":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"503":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"maximum":10000,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}]}},"/experts/{expert_id}/wallet":{"get":{"tags":["Expert Wallet"],"summary":"Read an expert wallet and transaction history in Expert Management. Super Admin only.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"example":{"status":true,"message":"Expert wallet fetched","x":{"wallet":{"expert_id":5,"available_balance":20,"available_balance_paise":2000,"currency":"INR"},"transactions":[{"id":"1","type":"tip_credit","amount":20,"amount_paise":2000,"currency":"INR","source":"Customer tip via Razorpay","customer_name":"Example Customer","job_id":54,"job_code":"ESJ-000054","tip_id":"90cbdaf7-6258-491f-99e8-0cc12fa688f8","payment_reference":"pay_XXXXXXXXXXXXXX","created_at":"2026-11-09T10:00:00.000Z"}],"pagination":{"page":1,"limit":20,"total":1,"total_pages":1,"has_next":false}},"errors":null}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"404":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"422":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"503":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"expert_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"maximum":10000,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}]}},"/mobile/jobs/{job_id}/tips":{"post":{"tags":["Expert Tips"],"summary":"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.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"amount":20,"idempotency_key":"a73a712c-9109-4c4a-b5e4-eb9de230ba1e","expected_expert_id":5}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"example":{"status":true,"message":"Tip checkout ready","x":{"tip":{"id":"90cbdaf7-6258-491f-99e8-0cc12fa688f8","job_id":54,"job_code":"ESJ-000054","expert":{"id":5,"name":"Example Expert"},"amount":20,"amount_paise":2000,"currency":"INR","payment_mode":"live","status":"pending","credited_at":null},"checkout":{"key_id":"rzp_live_EXAMPLE","razorpay_order_id":"order_XXXXXXXXXXXXXX","amount":2000,"currency":"INR"}},"errors":null}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"404":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"422":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"503":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/mobile/jobs/{job_id}/tips/{tip_id}":{"get":{"tags":["Expert Tips"],"summary":"Read an owned tip: pending, credited (real wallet credit), or test_paid (sandbox only; no wallet credit). payment_mode identifies the original gateway mode.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"example":{"status":true,"message":"Tip status fetched","x":{"tip":{"id":"90cbdaf7-6258-491f-99e8-0cc12fa688f8","job_id":54,"job_code":"ESJ-000054","expert":{"id":5,"name":"Example Expert"},"amount":20,"amount_paise":2000,"currency":"INR","payment_mode":"live","status":"pending","credited_at":null}},"errors":null}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"404":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"422":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"503":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"tip_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","example":"90cbdaf7-6258-491f-99e8-0cc12fa688f8"}}]}},"/mobile/jobs/{job_id}/tips/{tip_id}/verify-payment":{"post":{"tags":["Expert Tips"],"summary":"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.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"razorpay_order_id":"order_XXXXXXXXXXXXXX","razorpay_payment_id":"pay_XXXXXXXXXXXXXX","razorpay_signature":"{{razorpay_signature}}"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"example":{"status":true,"message":"Tip credited to the expert wallet","x":{"tip":{"id":"90cbdaf7-6258-491f-99e8-0cc12fa688f8","job_id":54,"job_code":"ESJ-000054","expert":{"id":5,"name":"Example Expert"},"amount":20,"amount_paise":2000,"currency":"INR","payment_mode":"live","status":"credited","credited_at":"2026-11-09T10:00:00.000Z"}},"errors":null}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"404":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"422":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"503":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"tip_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","example":"90cbdaf7-6258-491f-99e8-0cc12fa688f8"}}]}},"/expert/auth/validate-registration-profile":{"post":{"tags":["Expert Mobile App"],"summary":"Validate onboarding profile with its temporary registration token, before verification.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"registration_token":"{{registration_token}}","name":"Example Expert","email":"expert@example.com","address":"Example address","city_name":"Kolkata","pincode":"700001","date_of_birth":"1995-01-01","gender":"Male","is_business_user":false}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/expert/verification/bank/verify":{"post":{"tags":["Expert Mobile App"],"summary":"Verify bank information using a temporary registration token after Aadhaar/PAN verification. Supply consented test details only in provider sandbox.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"registration_token":"{{registration_token}}","bank_name":"","bank_account_holder_name":"","account_number":"","bank_ifsc_code":""}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/profile-sa/razorpay-settings":{"get":{"tags":["Admin Profile"],"summary":"Read masked Razorpay configuration.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"put":{"tags":["Admin Profile"],"summary":"Select live or sandbox mode and optionally replace keys. Supply private values locally; never put real secrets in an exported collection.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"active_mode":"sandbox"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/rbac/modules":{"get":{"tags":["Settings & RBAC"],"summary":"List active permission modules.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/rbac/roles":{"get":{"tags":["Settings & RBAC"],"summary":"List roles and assigned permission modules.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"post":{"tags":["Settings & RBAC"],"summary":"Create a role using real module IDs returned by /rbac/modules.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"name":"Operations role","description":"Operations access","module_ids":[1]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/rbac/roles/{role_id}":{"put":{"tags":["Settings & RBAC"],"summary":"Update a role and its module IDs.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"name":"Operations role","description":"Operations access","module_ids":[1]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"role_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/platform-configurations":{"get":{"tags":["Settings & RBAC"],"summary":"List current platform settings.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/platform-configurations/{configuration_id}":{"put":{"tags":["Settings & RBAC"],"summary":"Update one setting value; supply a value valid for the selected setting key.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"value":"2 hours before"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"configuration_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/platform-configurations/history":{"get":{"tags":["Settings & RBAC"],"summary":"Read configuration change history.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/experts/{expert_id}/status":{"patch":{"tags":["Expert Management"],"summary":"Set expert account Active or Inactive.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"status":"Active"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"expert_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/experts/{expert_id}/documents/{document_type}/{document_index}":{"get":{"tags":["Expert Management"],"summary":"Download an expert document; response is a binary file rather than JSON on success.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"expert_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"document_type","in":"path","required":true,"schema":{"type":"string","enum":["profile-photo","driving-license-front","driving-license-back","certification"]}},{"name":"document_index","in":"path","required":true,"schema":{"type":"integer","minimum":0,"default":0}}]}},"/expert/jobs/{job_id}/status":{"patch":{"tags":["Expert Mobile App"],"summary":"Alias for the expert PUT status endpoint. In Progress requires the customer start OTP; professional cancellations require an active cancellation_reason_id.","security":[{"ExpertBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"status":"In Progress","start_otp":"1234"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"put":{"tags":["Expert Mobile App"],"summary":"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.","security":[{"ExpertBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"status":"In Progress","start_otp":"2452","note":"Work started on site"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/expert/jobs/{job_id}/tracking/start":{"post":{"tags":["Job Tracking"],"summary":"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.","security":[{"ExpertBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/expert/jobs/{job_id}/tracking/location":{"post":{"tags":["Job Tracking"],"summary":"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.","security":[{"ExpertBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"trip_id":"{{trip_id}}","latitude":22.5726,"longitude":88.3639,"accuracy_m":15,"heading":90,"recorded_at":"{{$isoTimestamp}}"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/expert/jobs/{job_id}/tracking/stop":{"post":{"tags":["Job Tracking"],"summary":"Stop trip sharing and clear the point. reason is arrived or stopped. Arrival does not start the service; normal job start OTP still applies.","security":[{"ExpertBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"trip_id":"{{trip_id}}","reason":"arrived"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/mobile/jobs/{job_id}/tracking":{"get":{"tags":["Job Tracking"],"summary":"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.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/mobile/jobs/{job_id}/reschedule":{"post":{"tags":["Mobile Orders"],"summary":"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.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"scheduled_date":"2026-11-05","slot_start":"10:00","slot_end":"11:00","note":"Please move my booking to this slot"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/admin/homepage-banners":{"get":{"tags":["Homepage Banners"],"summary":"List every homepage banner, newest first, with pagination. No fixed total banner limit.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}]},"post":{"tags":["Homepage Banners"],"summary":"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.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"prefix":{"type":"string","maxLength":500,"example":"Let's curate a ","description":"Plain text; trailing spaces are preserved."},"highlight":{"type":"string","maxLength":200,"example":"perfect"},"suffix":{"type":"string","maxLength":500,"example":"\npackage just for you !!","description":"Plain text; actual newlines are preserved."},"image":{"type":"string","format":"binary","description":"Required on create; optional replacement on edit. PNG, JPEG, WebP or safe SVG, max 5 MB."}},"required":["prefix","highlight","suffix","image"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/admin/homepage-banners/{id}":{"get":{"tags":["Homepage Banners"],"summary":"Get one banner for editing.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"put":{"tags":["Homepage Banners"],"summary":"Update all three text fields; omit image to retain it or upload a replacement. Original file is removed after a successful update.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"prefix":{"type":"string","maxLength":500,"example":"Let's curate a ","description":"Plain text; trailing spaces are preserved."},"highlight":{"type":"string","maxLength":200,"example":"perfect"},"suffix":{"type":"string","maxLength":500,"example":"\npackage just for you !!","description":"Plain text; actual newlines are preserved."},"image":{"type":"string","format":"binary","description":"Required on create; optional replacement on edit. PNG, JPEG, WebP or safe SVG, max 5 MB."}},"required":["prefix","highlight","suffix"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"delete":{"tags":["Homepage Banners"],"summary":"Delete one banner and its associated image. Does not affect other CMS content.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/mobile/homepage-banners":{"get":{"tags":["Homepage Banners"],"summary":"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.","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"example":{"status":true,"message":"Homepage banners fetched successfully","x":{"banners":[{"id":1,"prefix":"Let's curate a ","highlight":"perfect","suffix":"\npackage just for you !!","image_name":"homepage-banner-example.png","image_url":"https://esntlsapi.aquaninjas.in/public/homepage-banners/homepage-banner-example.png"}],"pagination":{"page":1,"limit":20,"total":1,"total_pages":1,"has_next":false,"has_previous":false}},"errors":null}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}]}},"/admin/service-banners":{"get":{"tags":["Service Banners"],"summary":"List service banners and linked categories, newest first. Optionally filter by placement.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"placement","in":"query","description":"Filter to home_page or service_page. Omit for both.","schema":{"type":"string","enum":["home_page","service_page"],"example":"home_page","description":"Banner display location."}}]},"post":{"tags":["Service Banners"],"summary":"Create an image-backed service banner linked to one active Category Master record.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"placement":{"type":"string","enum":["home_page","service_page"],"example":"home_page","description":"Banner display location."},"category_id":{"type":"integer","minimum":1,"example":10,"description":"Required active Category Master ID. The mobile app uses this value as the tap destination."},"image":{"type":"string","format":"binary","description":"Required on create; optional replacement on edit. PNG, JPEG, WebP or safe SVG, max 5 MB."}},"required":["category_id","image"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/admin/service-banners/{id}":{"get":{"tags":["Service Banners"],"summary":"Get one service banner for editing.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"put":{"tags":["Service Banners"],"summary":"Update the active linked category and optionally replace the image. Omit image to retain it.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"placement":{"type":"string","enum":["home_page","service_page"],"example":"home_page","description":"Banner display location."},"category_id":{"type":"integer","minimum":1,"example":10,"description":"Required active Category Master ID. The mobile app uses this value as the tap destination."},"image":{"type":"string","format":"binary","description":"Required on create; optional replacement on edit. PNG, JPEG, WebP or safe SVG, max 5 MB."}},"required":["category_id"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"delete":{"tags":["Service Banners"],"summary":"Delete one service banner and its associated image.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/mobile/service-banners":{"get":{"tags":["Service Banners"],"summary":"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.","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"example":{"status":true,"message":"Service banners fetched successfully","x":{"banners":[{"id":1,"category_id":10,"category_name":"AC Service","image_name":"service-banner-example.png","image_url":"https://esntlsapi.aquaninjas.in/public/service-banners/service-banner-example.png"}],"pagination":{"page":1,"limit":20,"total":1,"total_pages":1,"has_next":false,"has_previous":false}},"errors":null}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"placement","in":"query","description":"Filter to home_page or service_page. Omit for both.","schema":{"type":"string","enum":["home_page","service_page"],"example":"home_page","description":"Banner display location."}}]}},"/admin/issue-facings":{"get":{"tags":["Issue Facing"],"summary":"List all configured Issue Facing items and their linked categories, newest first, with pagination.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}]},"post":{"tags":["Issue Facing"],"summary":"Create an Issue Facing item with a short title, icon and one active Category Master destination.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":2,"maxLength":120,"example":"AC not cooling","description":"The short customer-facing issue text."},"category_id":{"type":"integer","minimum":1,"example":10,"description":"Required active Category Master ID. The mobile app uses this value as the tap destination."},"icon":{"type":"string","format":"binary","description":"Required on create; optional replacement on edit. PNG, JPEG, WebP or safe SVG, max 5 MB."}},"required":["title","category_id","icon"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/admin/issue-facings/{id}":{"get":{"tags":["Issue Facing"],"summary":"Get one Issue Facing item for editing.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"put":{"tags":["Issue Facing"],"summary":"Update the issue title, active linked category and optionally replace its icon. Omit icon to retain it.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":2,"maxLength":120,"example":"AC not cooling","description":"The short customer-facing issue text."},"category_id":{"type":"integer","minimum":1,"example":10,"description":"Required active Category Master ID. The mobile app uses this value as the tap destination."},"icon":{"type":"string","format":"binary","description":"Required on create; optional replacement on edit. PNG, JPEG, WebP or safe SVG, max 5 MB."}},"required":["title","category_id"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"delete":{"tags":["Issue Facing"],"summary":"Delete one Issue Facing item and its associated icon.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/mobile/issue-facings":{"get":{"tags":["Issue Facing"],"summary":"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.","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"example":{"status":true,"message":"Issue Facing items fetched successfully","x":{"issues":[{"id":1,"title":"AC not cooling","category_id":10,"category_name":"AC Service","icon_name":"issue-facing-ac-not-cooling.svg","icon_url":"https://esntlsapi.aquaninjas.in/public/issue-facing-icons/issue-facing-ac-not-cooling.svg"}],"pagination":{"page":1,"limit":20,"total":1,"total_pages":1,"has_next":false,"has_previous":false}},"errors":null}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}]}},"/admin/recommended-sessions":{"get":{"tags":["Recommended Session"],"summary":"List all configured items in x.recommendations, newest first, with pagination.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}]},"post":{"tags":["Recommended Session"],"summary":"Create a recommendation with a title, icon, and active category. The saved item is in x.recommendation.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":2,"maxLength":120,"example":"AC maintenance","description":"The short customer-facing recommendation text."},"category_id":{"type":"integer","minimum":1,"example":10,"description":"Required active Category Master ID. The mobile app uses this value as the tap destination."},"icon":{"type":"string","format":"binary","description":"Required on create; optional replacement on edit. PNG, JPEG, WebP or safe SVG, max 5 MB."}},"required":["title","category_id","icon"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/admin/recommended-sessions/{id}":{"get":{"tags":["Recommended Session"],"summary":"Get one item for editing in x.recommendation.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"put":{"tags":["Recommended Session"],"summary":"Update the title, active category, and optionally the icon. Omit icon to retain it.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":2,"maxLength":120,"example":"AC maintenance","description":"The short customer-facing recommendation text."},"category_id":{"type":"integer","minimum":1,"example":10,"description":"Required active Category Master ID. The mobile app uses this value as the tap destination."},"icon":{"type":"string","format":"binary","description":"Required on create; optional replacement on edit. PNG, JPEG, WebP or safe SVG, max 5 MB."}},"required":["title","category_id"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"delete":{"tags":["Recommended Session"],"summary":"Delete a recommendation and its associated icon.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/mobile/recommended-sessions":{"get":{"tags":["Recommended Session"],"summary":"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.","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"example":{"status":true,"message":"Recommended Session items fetched successfully","x":{"recommendations":[{"id":1,"title":"AC maintenance","category_id":10,"category_name":"AC Service","icon_name":"recommended-session-example.svg","icon_url":"https://esntlsapi.aquaninjas.in/public/recommended-session-icons/recommended-session-example.svg","created_at":"2026-11-09T09:30:00.000Z","updated_at":"2026-11-09T09:30:00.000Z"}],"pagination":{"page":1,"limit":20,"total":1,"total_pages":1,"has_next":false,"has_previous":false}},"errors":null}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}]}},"/admin/support-faq-categories":{"get":{"tags":["Help & Support FAQs"],"summary":"List Help & Support FAQ categories for Admin, ordered by display_order then ID.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}]},"post":{"tags":["Help & Support FAQs"],"summary":"Create an icon-backed Help & Support FAQ category. Categories can have unlimited FAQs.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":2,"maxLength":120,"example":"Account related issues"},"status":{"type":"string","enum":["Active","Inactive"],"example":"Active"},"display_order":{"type":"integer","minimum":0,"example":1},"icon":{"type":"string","format":"binary","description":"Required on create; optional replacement on edit. PNG, JPEG, WebP or safe SVG, max 5 MB."}},"required":["title","status","display_order","icon"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/admin/support-faq-categories/{id}":{"get":{"tags":["Help & Support FAQs"],"summary":"Get one FAQ category for editing.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"put":{"tags":["Help & Support FAQs"],"summary":"Update FAQ category text, status, display order and optionally replace its icon.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":2,"maxLength":120,"example":"Account related issues"},"status":{"type":"string","enum":["Active","Inactive"],"example":"Active"},"display_order":{"type":"integer","minimum":0,"example":1},"icon":{"type":"string","format":"binary","description":"Required on create; optional replacement on edit. PNG, JPEG, WebP or safe SVG, max 5 MB."}},"required":["title","status","display_order"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"delete":{"tags":["Help & Support FAQs"],"summary":"Delete one FAQ category and all its FAQs. Its icon is removed after deletion.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/admin/support-faqs":{"get":{"tags":["Help & Support FAQs"],"summary":"List Help & Support FAQs for Admin. Optionally filter by category_id.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"category_id","in":"query","required":false,"schema":{"type":"integer","minimum":1},"example":1}]},"post":{"tags":["Help & Support FAQs"],"summary":"Create a Help & Support FAQ under an existing category.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"category_id":{"type":"integer","minimum":1,"example":1},"question":{"type":"string","minLength":3,"maxLength":500,"example":"I want to change my phone number"},"answer":{"type":"string","minLength":1,"maxLength":20000,"example":"You can change your phone number from the profile section after verifying it with an OTP."},"status":{"type":"string","enum":["Active","Inactive"],"example":"Active"},"display_order":{"type":"integer","minimum":0,"example":1}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/admin/support-faqs/{id}":{"get":{"tags":["Help & Support FAQs"],"summary":"Get one FAQ for editing.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"put":{"tags":["Help & Support FAQs"],"summary":"Update a Help & Support FAQ.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"category_id":{"type":"integer","minimum":1,"example":1},"question":{"type":"string","minLength":3,"maxLength":500,"example":"I want to change my phone number"},"answer":{"type":"string","minLength":1,"maxLength":20000,"example":"You can change your phone number from the profile section after verifying it with an OTP."},"status":{"type":"string","enum":["Active","Inactive"],"example":"Active"},"display_order":{"type":"integer","minimum":0,"example":1}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"delete":{"tags":["Help & Support FAQs"],"summary":"Delete one Help & Support FAQ.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/mobile/support-faq-categories":{"get":{"tags":["Help & Support FAQs"],"summary":"Public active Help & Support category list for the mobile Help screen. Ordered by display_order then ID. No token is required.","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"example":{"status":true,"message":"FAQ categories fetched successfully","x":{"categories":[{"id":1,"title":"Account related issues","icon_name":"support-faq-category-account.svg","icon_url":"https://esntlsapi.aquaninjas.in/public/support-faq-category-icons/support-faq-category-account.svg","status":"Active","display_order":1}],"pagination":{"page":1,"limit":20,"total":1,"total_pages":1,"has_next":false,"has_previous":false}},"errors":null}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}]}},"/mobile/support-faqs":{"get":{"tags":["Help & Support FAQs"],"summary":"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.","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"example":{"status":true,"message":"FAQs fetched successfully","x":{"faqs":[{"id":1,"category_id":1,"category_title":"Account related issues","question":"I want to change my phone number","answer":"You can change your phone number from the profile section after verifying it with an OTP.","status":"Active","display_order":1}],"pagination":{"page":1,"limit":20,"total":1,"total_pages":1,"has_next":false,"has_previous":false}},"errors":null}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"category_id","in":"query","required":false,"schema":{"type":"integer","minimum":1},"example":1}]}},"/admin/cms":{"get":{"tags":["CMS"],"summary":"List the fixed CMS pages (Super Admin only).","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/admin/cms/{slug}":{"get":{"tags":["CMS"],"summary":"Get editable page and paginated subsection summaries.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","enum":["about-us","terms-and-conditions","privacy-policy","cancellation-and-reschedule-policy"]}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}]},"put":{"tags":["CMS"],"summary":"Save page content, visibility and optional banner. About Us has direct Markdown; legal pages use subsections.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"title":{"type":"string","example":"Terms & Conditions"},"banner_heading":{"type":"string","example":"Our terms, your trust"},"banner_description":{"type":"string","example":"Rules for using our services"},"content":{"type":"string","description":"Markdown content for About Us only; empty for legal policy pages."},"status":{"type":"string","enum":["Active","Inactive"]},"remove_banner":{"type":"boolean","default":false},"banner":{"type":"string","format":"binary","description":"Optional SVG, PNG, JPEG or WebP, up to 5 MB."}},"required":["title","status"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","enum":["about-us","terms-and-conditions","privacy-policy","cancellation-and-reschedule-policy"]}}]}},"/admin/cms/{slug}/sections":{"post":{"tags":["CMS"],"summary":"Create an icon-backed legal policy subsection. About Us does not accept subsections.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"title":{"type":"string","example":"Acceptance of terms"},"description":{"type":"string","example":"By using our app, you agree to these terms"},"content":{"type":"string","example":"## User Agreement\n\nEnter approved content here.","description":"Required Markdown, up to 100,000 characters. Render as Markdown, never execute raw HTML."},"display_order":{"type":"integer","minimum":0,"example":1},"status":{"type":"string","enum":["Active","Inactive"]},"icon":{"type":"string","format":"binary","description":"Required on creation. SVG, PNG, JPEG or WebP, up to 5 MB. Omit on edit to retain the current icon."}},"required":["title","content","display_order","status","icon"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","enum":["about-us","terms-and-conditions","privacy-policy","cancellation-and-reschedule-policy"]}}]}},"/admin/cms/{slug}/sections/{id}":{"get":{"tags":["CMS"],"summary":"Get subsection content for editing.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","enum":["about-us","terms-and-conditions","privacy-policy","cancellation-and-reschedule-policy"]}},{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"put":{"tags":["CMS"],"summary":"Edit subsection content, order and visibility; optional icon replacement.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"title":{"type":"string","example":"Acceptance of terms"},"description":{"type":"string","example":"By using our app, you agree to these terms"},"content":{"type":"string","example":"## User Agreement\n\nEnter approved content here.","description":"Required Markdown, up to 100,000 characters. Render as Markdown, never execute raw HTML."},"display_order":{"type":"integer","minimum":0,"example":1},"status":{"type":"string","enum":["Active","Inactive"]},"icon":{"type":"string","format":"binary","description":"Required on creation. SVG, PNG, JPEG or WebP, up to 5 MB. Omit on edit to retain the current icon."}},"required":["title","content","display_order","status"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","enum":["about-us","terms-and-conditions","privacy-policy","cancellation-and-reschedule-policy"]}},{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"delete":{"tags":["CMS"],"summary":"Delete a subsection and its stored icon.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","enum":["about-us","terms-and-conditions","privacy-policy","cancellation-and-reschedule-policy"]}},{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/mobile/cms/{slug}":{"get":{"tags":["CMS"],"summary":"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.","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","enum":["about-us","terms-and-conditions","privacy-policy","cancellation-and-reschedule-policy"]}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}]}},"/mobile/cms/{slug}/sections/{id}":{"get":{"tags":["CMS"],"summary":"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.","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","enum":["about-us","terms-and-conditions","privacy-policy","cancellation-and-reschedule-policy"]}},{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/login-sa":{"post":{"tags":["Super Admin Authentication"],"summary":"Sign in as a super admin","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"email":"admin@example.com","password":"Your password"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/forgot-password-sa":{"post":{"tags":["Super Admin Authentication"],"summary":"Send a password reset OTP","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"email":"admin@example.com"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/verify-forgot-password-otp-sa":{"post":{"tags":["Super Admin Authentication"],"summary":"Verify password reset OTP","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"email":"admin@example.com","otp":"123456"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/reset-password-sa":{"post":{"tags":["Super Admin Authentication"],"summary":"Reset super admin password","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"email":"admin@example.com","otp":"123456","password":"New password"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/profile-sa":{"get":{"tags":["Admin Profile"],"summary":"Get super admin profile","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"put":{"tags":["Admin Profile"],"summary":"Update super admin profile","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"title":"Super Admin","name":"Admin Name","phone":"9876543210"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/profile-sa/activity":{"get":{"tags":["Admin Profile"],"summary":"Get login and logout activity","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/change-password-sa":{"post":{"tags":["Admin Profile"],"summary":"Change password","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"current_password":"Current password","new_password":"New password"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/logout-sa":{"post":{"tags":["Admin Profile"],"summary":"Log out","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/profile-sa/preferences":{"put":{"tags":["Admin Profile"],"summary":"Save the signed-in admin workspace theme, table density, default module, timezone, and date format.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"theme":"System","table_density":"Compact","default_module":"dashboard","timezone":"Asia/Kolkata","date_format":"DD/MM/YYYY"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/departments":{"get":{"tags":["Staff Management"],"summary":"List Department Master records used for Staff assignment.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"post":{"tags":["Staff Management"],"summary":"Create a Department Master record.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"name":"Operations","status":"Active"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/departments/{department_id}":{"put":{"tags":["Staff Management"],"summary":"Update a Department Master record.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"name":"Operations","status":"Active"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"department_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/staff":{"get":{"tags":["Staff Management"],"summary":"List staff with search, Department, RBAC role, State/City location, and status filters.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"post":{"tags":["Staff Management"],"summary":"Create a staff draft or send an invite. Staff use a required name, email, phone, department, RBAC role, State, and City; manager is optional.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"name":"Priya Sharma","email":"priya.sharma@example.com","phone":"+91 9000000000","department_id":1,"role_id":2,"manager_id":null,"state_id":1,"city_id":1,"save_as_draft":false}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/staff/{staff_id}":{"get":{"tags":["Staff Management"],"summary":"Get a staff profile and access details.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"staff_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"put":{"tags":["Staff Management"],"summary":"Update a staff profile, role, manager, or State/City location.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"name":"Priya Sharma","email":"priya.sharma@example.com","phone":"+91 9000000000","department_id":1,"role_id":2,"manager_id":null,"state_id":1,"city_id":1}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"staff_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/staff/{staff_id}/suspension":{"patch":{"tags":["Staff Management"],"summary":"Suspend or resume staff access.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"suspended":true,"reason":"Access review required"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"staff_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/staff/{staff_id}/resend-invite":{"post":{"tags":["Staff Management"],"summary":"Send a fresh one-time account activation link to an invited or draft staff member.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"staff_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/staff/{staff_id}/reset-password":{"post":{"tags":["Staff Management"],"summary":"Send a one-time password reset link to an active staff member.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"staff_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/staff/auth/login":{"post":{"tags":["Staff Management"],"summary":"Sign in an active staff account using its email and password.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"email":"staff@example.com","password":"secure-password"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/staff/auth/complete-access":{"post":{"tags":["Staff Management"],"summary":"Activate a staff account or reset its password using its one-time email link.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"token":"64-character-token","password":"secure-password","confirm_password":"secure-password"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/emergency-service-pauses":{"get":{"tags":["Emergency Controls"],"summary":"List active location-based emergency service pauses. Expired pauses are removed automatically.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"post":{"tags":["Emergency Controls"],"summary":"Pause new service bookings for one active State and City. The entered message is returned to mobile checkout clients.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"state_id":1,"city_id":1,"duration_minutes":60,"communication_template":"Service temporarily unavailable","message":"Service is temporarily unavailable in this city. Please try again shortly."}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/emergency-service-pauses/{pause_id}":{"delete":{"tags":["Emergency Controls"],"summary":"Resume new service bookings immediately and remove the active pause.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"pause_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/admin/global-search":{"get":{"tags":["Global Search"],"summary":"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.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":100},"example":"AC repair"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":20}}]}},"/categories":{"get":{"tags":["Category Master"],"summary":"List categories","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"post":{"tags":["Category Master"],"summary":"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.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"name":{"type":"string"},"parent_category_id":{"type":"integer","nullable":true},"description":{"type":"string"},"status":{"type":"string"},"featured":{"type":"boolean"},"display_order":{"type":"integer","minimum":0},"color":{"type":"string"},"icon":{"type":"string","format":"binary"},"image":{"type":"string","format":"binary"},"banner":{"type":"string","format":"binary"}},"required":["name"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/categories/{category_id}":{"get":{"tags":["Category Master"],"summary":"Get a category","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"put":{"tags":["Category Master"],"summary":"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.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"name":{"type":"string"},"parent_category_id":{"type":"integer","nullable":true},"description":{"type":"string"},"status":{"type":"string"},"featured":{"type":"boolean"},"display_order":{"type":"integer","minimum":0},"color":{"type":"string"},"icon":{"type":"string","format":"binary"},"image":{"type":"string","format":"binary"},"banner":{"type":"string","format":"binary"}},"required":["name"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"delete":{"tags":["Category Master"],"summary":"Delete a category","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/categories/{category_id}/booking-pause":{"patch":{"tags":["Category Master"],"summary":"Pause or resume new bookings for one category without changing its active status. A paused parent blocks new bookings for every descendant category.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"booking_paused":true}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/categories/{category_id}/process":{"put":{"tags":["Category Master"],"summary":"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.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"steps":{"type":"string","example":"[{\"id\":2,\"title\":\"Pre-service check\"},{\"title\":\"Repair done\",\"image_index\":0}]"},"process_images":{"type":"string","format":"binary"}},"required":["steps"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/categories/{category_id}/policies":{"put":{"tags":["Category Master"],"summary":"Replace grouped Warranty, Cancellation Policy, and Safety & Trust points for one category.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"points":[{"policy_type":"warranty","content":"30 days warranty on repair workmanship"},{"policy_type":"cancellation_policy","content":"Cancellation is subject to the service terms."},{"policy_type":"safety_trust","content":"Professionals follow safety checks."}]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/categories/{category_id}/warranty":{"put":{"tags":["Category Master"],"summary":"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.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"warranty":{"type":"string","example":"{\"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\"}]}]}"},"warranty_images":{"type":"string","format":"binary"}},"required":["warranty"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/categories/{category_id}/addons":{"get":{"tags":["Category Add-ons"],"summary":"List all category add-ons with structured key-value attributes and image URLs.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"post":{"tags":["Category Add-ons"],"summary":"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.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"title":{"type":"string","example":"AC Gas refill"},"price":{"type":"number","example":799},"attributes":{"type":"string","example":"[{\"key\":\"Gas type\",\"value\":\"R32\"}]"},"image":{"type":"string","format":"binary"}},"required":["title","price","image"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/categories/{category_id}/addons/{addon_id}":{"get":{"tags":["Category Add-ons"],"summary":"Get one category add-on for editing.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"addon_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"put":{"tags":["Category Add-ons"],"summary":"Update an add-on. Omit image to retain the current image; attributes replaces the detail list.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"title":{"type":"string","example":"AC Gas refill"},"price":{"type":"number","example":799},"attributes":{"type":"string","example":"[{\"key\":\"Gas type\",\"value\":\"R32\"}]"},"image":{"type":"string","format":"binary"}},"required":["title","price"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"addon_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"delete":{"tags":["Category Add-ons"],"summary":"Delete one category add-on and its uploaded image.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"addon_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/services/{service_id}/reviews":{"get":{"tags":["Service Catalog"],"summary":"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.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}]}},"/mobile/categories/{category_id}/addons":{"get":{"tags":["Mobile App"],"summary":"Get active add-ons for one category, including public image URLs and structured key-value attributes.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/public/categories/by-level":{"get":{"tags":["Public Mobile Data"],"summary":"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.","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"level","in":"query","required":true,"schema":{"type":"integer","minimum":1,"maximum":50},"example":1}]}},"/states":{"get":{"tags":["State Master"],"summary":"List states","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"post":{"tags":["State Master"],"summary":"Create states","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"name":"Karnataka","status":"Active"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/states/{state_id}":{"get":{"tags":["State Master"],"summary":"Get states by ID","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"state_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"put":{"tags":["State Master"],"summary":"Update states","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"name":"Karnataka","status":"Active"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"state_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"delete":{"tags":["State Master"],"summary":"Delete states","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"state_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/states/code-preview":{"get":{"tags":["State Master"],"summary":"Preview generated state code","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/cities":{"get":{"tags":["City Master"],"summary":"List cities","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"post":{"tags":["City Master"],"summary":"Create cities","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"name":"Bengaluru","state_id":1,"status":"Active"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/cities/{city_id}":{"get":{"tags":["City Master"],"summary":"Get cities by ID","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"city_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"put":{"tags":["City Master"],"summary":"Update cities","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"name":"Bengaluru","state_id":1,"status":"Active"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"city_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"delete":{"tags":["City Master"],"summary":"Delete cities","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"city_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/variants":{"get":{"tags":["Variant Master"],"summary":"List variant mappings","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"post":{"tags":["Variant Master"],"summary":"Create variant mappings","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"category_id":1,"subcategory_id":2,"variant_label":"Service Type","option_values":["Standard","Premium"],"status":"Active"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/variants/{variant_id}":{"get":{"tags":["Variant Master"],"summary":"Get variant mappings by ID","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"variant_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"put":{"tags":["Variant Master"],"summary":"Update variant mappings","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"category_id":1,"subcategory_id":2,"variant_label":"Service Type","option_values":["Standard","Premium"],"status":"Active"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"variant_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"delete":{"tags":["Variant Master"],"summary":"Delete variant mappings","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"variant_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/home-types":{"get":{"tags":["Preference Masters"],"summary":"List home types","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"post":{"tags":["Preference Masters"],"summary":"Create home types with an optional uploaded image.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"label":{"type":"string"},"display_order":{"type":"integer","minimum":1,"example":1,"description":"Lower positions are returned first. Omit this when creating a record to add it at the end."},"status":{"type":"string","enum":["Active","Inactive"]},"image":{"type":"string","format":"binary"}},"required":["label"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/home-types/{id}":{"get":{"tags":["Preference Masters"],"summary":"Get home types by ID","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"put":{"tags":["Preference Masters"],"summary":"Update home types and optionally replace its uploaded image.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"label":{"type":"string"},"display_order":{"type":"integer","minimum":1,"example":1,"description":"Lower positions are returned first. Omit this when creating a record to add it at the end."},"status":{"type":"string","enum":["Active","Inactive"]},"image":{"type":"string","format":"binary"}},"required":["label"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"delete":{"tags":["Preference Masters"],"summary":"Delete home types","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/family-types":{"get":{"tags":["Preference Masters"],"summary":"List family types","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"post":{"tags":["Preference Masters"],"summary":"Create family types with an optional uploaded image.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"label":{"type":"string"},"display_order":{"type":"integer","minimum":1,"example":1,"description":"Lower positions are returned first. Omit this when creating a record to add it at the end."},"status":{"type":"string","enum":["Active","Inactive"]},"image":{"type":"string","format":"binary"}},"required":["label"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/family-types/{id}":{"get":{"tags":["Preference Masters"],"summary":"Get family types by ID","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"put":{"tags":["Preference Masters"],"summary":"Update family types and optionally replace its uploaded image.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"label":{"type":"string"},"display_order":{"type":"integer","minimum":1,"example":1,"description":"Lower positions are returned first. Omit this when creating a record to add it at the end."},"status":{"type":"string","enum":["Active","Inactive"]},"image":{"type":"string","format":"binary"}},"required":["label"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"delete":{"tags":["Preference Masters"],"summary":"Delete family types","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/preferred-timings":{"get":{"tags":["Preference Masters"],"summary":"List preferred timings","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"post":{"tags":["Preference Masters"],"summary":"Create preferred timings with an optional uploaded image.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"label":{"type":"string"},"display_order":{"type":"integer","minimum":1,"example":1,"description":"Lower positions are returned first. Omit this when creating a record to add it at the end."},"status":{"type":"string","enum":["Active","Inactive"]},"image":{"type":"string","format":"binary"},"start_time":{"type":"string","example":"09:00"},"end_time":{"type":"string","example":"12:00"}},"required":["label","start_time","end_time"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/preferred-timings/{id}":{"get":{"tags":["Preference Masters"],"summary":"Get preferred timings by ID","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"put":{"tags":["Preference Masters"],"summary":"Update preferred timings and optionally replace its uploaded image.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"label":{"type":"string"},"display_order":{"type":"integer","minimum":1,"example":1,"description":"Lower positions are returned first. Omit this when creating a record to add it at the end."},"status":{"type":"string","enum":["Active","Inactive"]},"image":{"type":"string","format":"binary"},"start_time":{"type":"string","example":"09:00"},"end_time":{"type":"string","example":"12:00"}},"required":["label","start_time","end_time"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"delete":{"tags":["Preference Masters"],"summary":"Delete preferred timings","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/appliances-owned":{"get":{"tags":["Preference Masters"],"summary":"List appliances owned","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"post":{"tags":["Preference Masters"],"summary":"Create appliances owned with an optional uploaded image.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"label":{"type":"string"},"display_order":{"type":"integer","minimum":1,"example":1,"description":"Lower positions are returned first. Omit this when creating a record to add it at the end."},"status":{"type":"string","enum":["Active","Inactive"]},"image":{"type":"string","format":"binary"}},"required":["label"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/appliances-owned/{id}":{"get":{"tags":["Preference Masters"],"summary":"Get appliances owned by ID","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"put":{"tags":["Preference Masters"],"summary":"Update appliances owned and optionally replace its uploaded image.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"label":{"type":"string"},"display_order":{"type":"integer","minimum":1,"example":1,"description":"Lower positions are returned first. Omit this when creating a record to add it at the end."},"status":{"type":"string","enum":["Active","Inactive"]},"image":{"type":"string","format":"binary"}},"required":["label"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"delete":{"tags":["Preference Masters"],"summary":"Delete appliances owned","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/skills":{"get":{"tags":["Skill Master"],"summary":"List skills","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"post":{"tags":["Skill Master"],"summary":"Create skills","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"skill_names":"AC repair, Plumbing","status":"Active"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/skills/{skill_id}":{"get":{"tags":["Skill Master"],"summary":"Get skills by ID","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"skill_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"put":{"tags":["Skill Master"],"summary":"Update skills","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"skill_names":"AC repair, Plumbing","status":"Active"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"skill_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"delete":{"tags":["Skill Master"],"summary":"Delete skills","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"skill_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/experts":{"get":{"tags":["Expert Management"],"summary":"List experts","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"post":{"tags":["Expert Management"],"summary":"Create experts","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"name":"Ramesh Kumar","gender":"Male","phone_no_country_code":"+91","phone":"9876543210","city_name":"Ranchi","category_ids":[1],"skill_ids":[1],"availability":"Online","unavailable_slots":[{"day":"Mon","start_time":"10:00","end_time":"16:00"}],"weekly_schedule":[{"day":"Mon","is_working":true,"start_time":"00:00","end_time":"23:59"},{"day":"Tue","is_working":true,"start_time":"00:00","end_time":"23:59"},{"day":"Wed","is_working":true,"start_time":"00:00","end_time":"23:59"},{"day":"Thu","is_working":true,"start_time":"00:00","end_time":"23:59"},{"day":"Fri","is_working":true,"start_time":"00:00","end_time":"23:59"},{"day":"Sat","is_working":true,"start_time":"00:00","end_time":"23:59"},{"day":"Sun","is_working":true,"start_time":"00:00","end_time":"23:59"}]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/experts/{expert_id}":{"get":{"tags":["Expert Management"],"summary":"Get experts by ID","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"expert_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"put":{"tags":["Expert Management"],"summary":"Update experts","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"name":"Ramesh Kumar","gender":"Male","phone_no_country_code":"+91","phone":"9876543210","city_name":"Ranchi","category_ids":[1],"skill_ids":[1],"availability":"Online","unavailable_slots":[{"day":"Mon","start_time":"10:00","end_time":"16:00"}],"weekly_schedule":[{"day":"Mon","is_working":true,"start_time":"00:00","end_time":"23:59"},{"day":"Tue","is_working":true,"start_time":"00:00","end_time":"23:59"},{"day":"Wed","is_working":true,"start_time":"00:00","end_time":"23:59"},{"day":"Thu","is_working":true,"start_time":"00:00","end_time":"23:59"},{"day":"Fri","is_working":true,"start_time":"00:00","end_time":"23:59"},{"day":"Sat","is_working":true,"start_time":"00:00","end_time":"23:59"},{"day":"Sun","is_working":true,"start_time":"00:00","end_time":"23:59"}]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"expert_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"delete":{"tags":["Expert Management"],"summary":"Delete experts","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"expert_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/experts/{expert_id}/availability":{"patch":{"tags":["Expert Management"],"summary":"Update an expert's availability status and dated unavailable periods without editing the rest of the profile.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"availability":"Online","unavailable_slots":[{"date":"2026-10-06","day":"Tue","start_time":"10:00","end_time":"12:00"}]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"expert_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/experts/{expert_id}/suspension":{"patch":{"tags":["Expert Management"],"summary":"Suspend an Expert account with a required reason, or resume it to its previous approval state. Suspended Experts cannot use protected Expert mobile APIs.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"action":"suspend","reason":"Repeated breach of platform conduct policy"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"expert_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/ops-command/expert-workload":{"get":{"tags":["Operations Command"],"summary":"List every expert with live availability, average rating, active count, inactive count, and total assigned-job count.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/exports/experts":{"get":{"tags":["Exports"],"summary":"Download every Expert Management record as an Excel workbook. This ignores listing filters and pagination.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/experts/{expert_id}/notes":{"get":{"tags":["Expert Management"],"summary":"List internal notes for one Expert","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"expert_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"post":{"tags":["Expert Management"],"summary":"Add an internal note to one Expert","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"note":"Strong performance during the festival period; consider for priority assignments."}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"expert_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/experts/{expert_id}/notes/{note_id}":{"delete":{"tags":["Expert Management"],"summary":"Delete an internal Expert note","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"expert_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/experts/{expert_id}/training-attempts":{"get":{"tags":["Expert Training"],"summary":"View every server-scored onboarding attempt, including selected and correct answers.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"expert_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/training-questions":{"get":{"tags":["Expert Training"],"summary":"List Admin-managed expert training questions.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"post":{"tags":["Expert Training"],"summary":"Create a single-choice question for one exact Category Master item.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"category_id":29,"question":"What should be checked before beginning service?","marks":10,"status":"Active","sort_order":0,"options":[{"option_text":"Confirm the issue and safety conditions","is_correct":true},{"option_text":"Start work without inspection","is_correct":false}]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/training-questions/{question_id}":{"put":{"tags":["Expert Training"],"summary":"Update a training question and its answer options.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"category_id":29,"question":"What should be checked before beginning service?","marks":10,"status":"Active","sort_order":0,"options":[{"option_text":"Confirm the issue and safety conditions","is_correct":true},{"option_text":"Start work without inspection","is_correct":false}]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"question_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"delete":{"tags":["Expert Training"],"summary":"Delete a training question. Existing answer snapshots remain available in attempt history.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"question_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/services":{"get":{"tags":["Service Catalog"],"summary":"List services","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"post":{"tags":["Service Catalog"],"summary":"Create services","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"name":"AC Repair","category_id":1,"subcategory_id":2,"service_type":"standard","vendor_price":250,"selling_price":499,"duration":"30-90 mins","description":"Complete AC inspection and repair service.","inclusions":["Service visit"],"exclusions":[],"instructions":"","complaint_window":"48 hours","tax_mode":"marketplace","expert_gender_requirement":"Any","tags":[],"image_urls":[],"video_urls":[],"transformation_image_urls":[],"active_city_ids":[1],"service_variants":[],"status":"Draft"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/services/{service_id}":{"get":{"tags":["Service Catalog"],"summary":"Get services by ID","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"put":{"tags":["Service Catalog"],"summary":"Update services","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"name":"AC Repair","category_id":1,"subcategory_id":2,"service_type":"standard","vendor_price":250,"selling_price":499,"duration":"30-90 mins","description":"Complete AC inspection and repair service.","inclusions":["Service visit"],"exclusions":[],"instructions":"","complaint_window":"48 hours","tax_mode":"marketplace","expert_gender_requirement":"Any","tags":[],"image_urls":[],"video_urls":[],"transformation_image_urls":[],"active_city_ids":[1],"service_variants":[],"status":"Draft"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"delete":{"tags":["Service Catalog"],"summary":"Delete services","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/services/{service_id}/duplicate":{"post":{"tags":["Service Catalog"],"summary":"Create a Draft copy of a service, including saved city and variant mappings.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/audit-logs":{"get":{"tags":["Admin Audit Logs"],"summary":"List server-generated Admin Portal create, update, and delete actions. Only Super Admin accounts can access audit records.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/audit-logs/{audit_log_id}":{"get":{"tags":["Admin Audit Logs"],"summary":"View immutable previous and current values for one audit record.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"audit_log_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/audit-logs/export":{"get":{"tags":["Admin Audit Logs"],"summary":"Export all matching audit logs to Excel, including previous and current values.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/services/{service_id}/status":{"patch":{"tags":["Service Catalog"],"summary":"Set a service to Active or Inactive without changing its configuration.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"status":"Inactive"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/services/{service_id}/faqs":{"get":{"tags":["Service FAQs"],"summary":"List service FAQs","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"post":{"tags":["Service FAQs"],"summary":"Create service FAQ","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"question":"What is included?","answer":"Service visit and inspection","status":"Active"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/services/{service_id}/faqs/{faq_id}":{"put":{"tags":["Service FAQs"],"summary":"Update service FAQ","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"question":"What is included?","answer":"Service visit and inspection","status":"Active"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"faq_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"delete":{"tags":["Service FAQs"],"summary":"Delete service FAQ","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"faq_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/customers":{"get":{"tags":["Customer 360"],"summary":"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%.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"post":{"tags":["Customer 360"],"summary":"Create customers","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"name":"Customer Name","phone":"9876543210","email":"customer@example.com"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/customers/{customer_id}":{"get":{"tags":["Customer 360"],"summary":"Get customers by ID","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"put":{"tags":["Customer 360"],"summary":"Update customers","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"name":"Customer Name","phone":"9876543210","email":"customer@example.com"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"delete":{"tags":["Customer 360"],"summary":"Delete customers","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/exports/customers":{"get":{"tags":["Exports"],"summary":"Download every Customer 360 record as an Excel workbook. This ignores listing filters and pagination.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/customers/{customer_id}/notes":{"get":{"tags":["Customer 360"],"summary":"List internal notes for one customer","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"post":{"tags":["Customer 360"],"summary":"Add an internal note to one customer","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"note":"Customer requested an afternoon appointment for future bookings."}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/customers/{customer_id}/notes/{note_id}":{"delete":{"tags":["Customer 360"],"summary":"Delete an internal customer note","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"note_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/customers/{customer_id}/settings":{"get":{"tags":["Customer 360"],"summary":"Get customer notification settings","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"put":{"tags":["Customer 360"],"summary":"Update customer notification settings","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"settings":{"whatsapp_updates":true,"push_notifications":true,"voice_calls":false,"email_updates":true,"sms_updates":true}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/customers/{customer_id}/addresses":{"get":{"tags":["Customer 360"],"summary":"List all saved addresses for one customer","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"post":{"tags":["Customer 360"],"summary":"Add a customer address. Send google_place_id after selecting an address; the API resolves and stores the exact latitude and longitude.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"address_type":"Home","address_name":"Home","address":"Street and locality","google_place_id":"ChIJ...","house_flat_no":"Flat 402","floor":"4th Floor","building_name":"Example Residency","nearby_landmark":"Near City Mall","lift_available":true,"parking_instructions":"Use visitor parking near Gate 2","receiver_name":"Receiver Name","receiver_phone":"9876543210","state_id":1,"city_id":1,"pincode":"560001","society":"Example Society","is_default":false}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/customers/{customer_id}/addresses/{address_id}":{"put":{"tags":["Customer 360"],"summary":"Update a customer address. Send google_place_id after selecting an address; the API resolves and stores the exact latitude and longitude.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"address_type":"Work","address_name":"Main Office","address":"Office address","google_place_id":"ChIJ...","house_flat_no":"Suite 12","floor":"2nd Floor","building_name":"Business Park","nearby_landmark":"Near Metro Station","lift_available":false,"parking_instructions":"Call on arrival","receiver_name":"Office Reception","receiver_phone":"9876543210","state_id":1,"city_id":1,"pincode":"560001","society":"Business Park","is_default":false}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"address_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"delete":{"tags":["Customer 360"],"summary":"Remove a customer address","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"address_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/customers/{customer_id}/addresses/{address_id}/default":{"patch":{"tags":["Customer 360"],"summary":"Set the default customer address","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"customer_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"address_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/mobile/auth/request-otp":{"post":{"tags":["Mobile App"],"summary":"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.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"phone":"9876543210"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/mobile/auth/verify-otp":{"post":{"tags":["Mobile App"],"summary":"Verify OTP using x.challenge_token from the request step.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"challenge_token":"Challenge token from request OTP","otp":"123456","fcm_token":"Firebase token"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/mobile/auth/complete-registration":{"post":{"tags":["Mobile App"],"summary":"Complete new customer registration. Include google_place_id after an address selection to store the Google-resolved latitude and longitude.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"registration_token":"Registration token","fcm_token":"Firebase token","name":"Customer Name","gender":"Female","email":"customer@example.com","address_name":"Home","address":"Street and locality","google_place_id":"ChIJ...","house_flat_no":"Flat 402","floor":"4th Floor","building_name":"Example Residency","nearby_landmark":"Near City Mall","lift_available":true,"parking_instructions":"Use visitor parking near Gate 2","receiver_name":"Receiver Name","receiver_phone":"9876543210","state_id":1,"city_id":1,"pincode":"560001","home_type":"Apartment / Flat","family_type":"Couple household","preferred_timings":["Morning"],"appliances_owned":["AC"],"services":["Home Services"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/mobile/payment-links":{"get":{"tags":["Mobile App"],"summary":"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.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/mobile/payment-links/{checkout_session_id}/confirm":{"post":{"tags":["Mobile App"],"summary":"Confirm a paid Admin-created Razorpay link and create the order.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"checkout_session_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/mobile/job-cancellation-reasons":{"get":{"tags":["Mobile Cancellations"],"summary":"List active Admin-managed cancellation reasons available to customers. Reasons can require an additional note.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/mobile/jobs/{job_id}/cancellation-preview":{"get":{"tags":["Mobile Cancellations"],"summary":"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.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/mobile/jobs/{job_id}/cancel":{"post":{"tags":["Mobile Cancellations"],"summary":"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.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"cancellation_reason_id":1,"note":"Plans changed"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/job-cancellation-reasons":{"get":{"tags":["Job Cancellation Reasons"],"summary":"List Admin-managed cancellation reasons, including their intended audience and whether a note is required.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"post":{"tags":["Job Cancellation Reasons"],"summary":"Create a cancellation reason for customers, experts, Admins, or all users.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"label":"Service no longer required","status":"Active","applicable_to":"Customer","requires_note":false,"display_order":10}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/job-cancellation-reasons/{id}":{"put":{"tags":["Job Cancellation Reasons"],"summary":"Update a cancellation reason and its audience.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"label":"My reason is not listed","status":"Active","applicable_to":"Customer","requires_note":true,"display_order":40}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"delete":{"tags":["Job Cancellation Reasons"],"summary":"Delete a cancellation reason.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/experience-reasons":{"get":{"tags":["Experience Reason Master"],"summary":"List all experience reasons with optional text search, status filter and pagination. Read x.experience_reasons and x.pagination.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"search","in":"query","required":false,"schema":{"type":"string","maxLength":150},"example":"late"},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["All","Active","Inactive"],"default":"All"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100000,"default":1}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":10}}]},"post":{"tags":["Experience Reason Master"],"summary":"Create a reason with Active or Inactive status. Reason text is unique regardless of case.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"reason":"Expert arrived late","status":"Active"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/experience-reasons/{id}":{"get":{"tags":["Experience Reason Master"],"summary":"Get one experience reason for editing.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"put":{"tags":["Experience Reason Master"],"summary":"Update the reason text and status.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"reason":"Expert arrived late","status":"Active"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"delete":{"tags":["Experience Reason Master"],"summary":"Delete an experience reason.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/mobile/experience-reasons":{"get":{"tags":["Experience Reason Master"],"summary":"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.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"example":{"status":true,"message":"Experience reasons fetched","x":{"experience_reasons":[{"id":1,"reason":"Expert arrived late","status":"Active"}]},"errors":null}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/complaint-reasons":{"get":{"tags":["Complaint Reason Master"],"summary":"List complaint reasons with optional text search, status, and pagination.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"404":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"422":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100000,"default":1}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"search","in":"query","required":false,"schema":{"type":"string","maxLength":150},"example":"service"},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["All","Active","Inactive"]}}]},"post":{"tags":["Complaint Reason Master"],"summary":"Create a complaint reason.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"reason":"Service issue not resolved","status":"Active"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"404":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"422":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/complaint-reasons/{id}":{"get":{"tags":["Complaint Reason Master"],"summary":"Get a complaint reason.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"404":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"422":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"put":{"tags":["Complaint Reason Master"],"summary":"Update a complaint reason or its visibility.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"reason":"Service issue not resolved","status":"Active"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"404":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"422":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"delete":{"tags":["Complaint Reason Master"],"summary":"Delete a complaint reason. Existing tickets retain their saved reason text.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"404":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"422":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/mobile/complaint-reasons":{"get":{"tags":["Complaint Reason Master"],"summary":"List active reasons in x.complaint_reasons.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"example":{"status":true,"message":"Complaint reasons fetched","x":{"complaint_reasons":[{"id":1,"reason":"Service issue not resolved","status":"Active"}]},"errors":null}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"404":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"422":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/mobile/complaints/eligible-jobs":{"get":{"tags":["Mobile Complaints"],"summary":"List the signed-in customer’s completed or closed jobs for the complaint picker. Returns x.jobs and x.pagination.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"404":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"422":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100000,"default":1}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}]}},"/mobile/complaints":{"get":{"tags":["Mobile Complaints"],"summary":"List the signed-in customer’s complaints. Use tab=active for open tickets or tab=closed for resolved tickets.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"404":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"422":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100000,"default":1}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"tab","in":"query","required":false,"schema":{"type":"string","enum":["active","closed"]}}]},"post":{"tags":["Mobile Complaints"],"summary":"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.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"job_id":42,"complaint_reason_id":1,"description":"The issue returned after service.","preferred_outcome":"Service revisit requested"}},"multipart/form-data":{"schema":{"type":"object","properties":{"job_id":{"type":"integer","example":42},"order_id":{"type":"integer","description":"Use instead of job_id for a wholly completed booking."},"complaint_reason_id":{"type":"integer","example":1},"description":{"type":"string","example":"The issue returned after service."},"preferred_outcome":{"type":"string","example":"Service revisit requested"},"attachments":{"type":"array","items":{"type":"string","format":"binary"},"maxItems":3,"description":"Repeat attachments for each JPG, PNG, WebP, MP4 or MOV file, up to 8 MB each."}},"required":["complaint_reason_id","description"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"example":{"status":true,"message":"Complaint submitted","x":{"complaint":{"id":21,"code":"CMP-0123456789ABCDEF","order_id":30,"order_code":"ORD-000030","job_id":42,"job_code":"ESJ-000042","status":"Open","reason":"Service issue not resolved"}},"errors":null}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"404":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"422":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/mobile/complaints/{id}":{"get":{"tags":["Mobile Complaints"],"summary":"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.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"example":{"status":true,"message":"Complaint fetched","errors":null,"x":{"complaint":{"id":21,"status":"Open"},"updates":[],"attachments":[{"id":4,"name":"photo.png","mime_type":"image/png","size":10240,"url":"https://esntlsapi.aquaninjas.in/api/mobile/complaints/21/attachments/4"},{"id":5,"name":"clip.mp4","mime_type":"video/mp4","size":204800,"url":"https://esntlsapi.aquaninjas.in/api/mobile/complaints/21/attachments/5"}]}}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"404":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"422":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/mobile/complaints/{id}/attachments/{attachment_id}":{"get":{"tags":["Mobile Complaints"],"summary":"Download an attachment from the signed-in customer’s own ticket.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Private attachment bytes","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"404":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"422":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"attachment_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/admin/complaints":{"get":{"tags":["Admin Complaints"],"summary":"List complaints with optional search and status filters, pagination, and status totals.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"404":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"422":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100000,"default":1}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"search","in":"query","required":false,"schema":{"type":"string","maxLength":150},"example":"service"},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["Open","Under Review","In Progress","Resolved"]}}]}},"/admin/complaints/{id}":{"get":{"tags":["Admin Complaints"],"summary":"Get complaint details, the linked booking, attachments, and status history.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"404":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"422":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/admin/complaints/{id}/status":{"patch":{"tags":["Admin Complaints"],"summary":"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.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"status":"Under Review","note":"We are reviewing your complaint."}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"404":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"422":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/admin/complaints/{id}/attachments/{attachment_id}":{"get":{"tags":["Admin Complaints"],"summary":"Download a private attachment from the given ticket.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Private attachment bytes","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"404":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"422":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"attachment_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/expert/auth/request-otp":{"post":{"tags":["Expert Mobile App"],"summary":"Request an Expert sign-in or registration OTP.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"phone":"9876543210"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/expert/auth/verify-otp":{"post":{"tags":["Expert Mobile App"],"summary":"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.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"challenge_token":"Challenge token from request OTP","otp":"123456"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/expert/verification/aadhaar/request-otp":{"post":{"tags":["Expert Mobile App"],"summary":"Request Cashfree Aadhaar OTP during registration.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"registration_token":"Registration token","aadhaar_number":"123412341234"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/expert/verification/aadhaar/verify-otp":{"post":{"tags":["Expert Mobile App"],"summary":"Verify Cashfree Aadhaar OTP. PAN is allowed only after success.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"registration_token":"Registration token","otp":"111000"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/expert/verification/pan/verify":{"post":{"tags":["Expert Mobile App"],"summary":"Verify Cashfree PAN after Aadhaar succeeds.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"registration_token":"Registration token","pan":"ABCPV1234D","name":"Ramesh Kumar"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/expert/training/questions":{"post":{"tags":["Expert Mobile App"],"summary":"Load active questions for the exact selected categories. Correct answers are deliberately omitted.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"registration_token":"Registration token","category_ids":[29]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/expert/training/attempts":{"post":{"tags":["Expert Mobile App"],"summary":"Submit one complete training attempt for server-side scoring. Every attempt is retained; score never blocks registration.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"registration_token":"Registration token","category_ids":[29],"answers":[{"question_id":1,"option_id":2}]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/expert/auth/complete-registration":{"post":{"tags":["Expert Mobile App"],"summary":"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.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"registration_token":"Registration token from verify OTP","training_attempt_id":4,"name":"Ramesh Kumar","email":"ramesh@example.com","address":"Ashok Nagar","address_line_2":"Near Main Road","city_name":"Ranchi","pincode":"834001","date_of_birth":"1993-06-18","is_business_user":false,"gst_number":"","vehicle_type":"Bike","vehicle_owner_name":"Ramesh Kumar","languages":["Hindi","English"],"category_ids":[29],"requested_categories":["Home services"],"requested_skills":["AC Repair"],"weekly_schedule":[{"day":"Mon","is_working":true,"start_time":"09:00","end_time":"18:00"},{"day":"Tue","is_working":true,"start_time":"09:00","end_time":"18:00"},{"day":"Wed","is_working":true,"start_time":"09:00","end_time":"18:00"},{"day":"Thu","is_working":true,"start_time":"09:00","end_time":"18:00"},{"day":"Fri","is_working":true,"start_time":"09:00","end_time":"18:00"},{"day":"Sat","is_working":true,"start_time":"09:00","end_time":"18:00"},{"day":"Sun","is_working":false,"start_time":"","end_time":""}],"bank_name":"HDFC Bank","bank_account_holder_name":"Ramesh Kumar","account_number":"1234567890123456","bank_ifsc_code":"HDFC0001234"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/expert/onboarding-options":{"get":{"tags":["Expert Mobile App"],"summary":"Get active Admin City Master entries, categories, and skills for Expert onboarding.","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/expert/address-autocomplete":{"get":{"tags":["Expert Mobile App"],"summary":"Search Indian addresses through the configured Google Places service.","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"input","in":"query","required":true,"schema":{"type":"string","minLength":3},"example":"Ashok Nagar Ranchi"}]}},"/expert/address-details/{place_id}":{"get":{"tags":["Expert Mobile App"],"summary":"Get a selected Google address and its city and pincode values.","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"place_id","in":"path","required":true,"schema":{"type":"string"},"example":"ChIJ..."}]}},"/expert/profile":{"get":{"tags":["Expert Mobile App"],"summary":"Get the signed-in Expert profile.","security":[{"ExpertBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"put":{"tags":["Expert Mobile App"],"summary":"Update editable Expert profile fields and optionally replace the private profile photo. Phone cannot be changed here because it is the OTP login identity.","security":[{"ExpertBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"name":"Ramesh Kumar","email":"ramesh@example.com","address":"Ashok Nagar","address_line_2":"Near Main Road","city_name":"Ranchi","pincode":"834001","date_of_birth":"1993-06-18","is_business_user":false,"gst_number":"","languages":["Hindi","English"],"profile_image_file":{"name":"profile.jpg","data":"data:image/jpeg;base64,..."}}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/expert/jobs":{"get":{"tags":["Expert Mobile App"],"summary":"List jobs assigned to the signed-in Expert. Supports status, page, and limit filters.","security":[{"ExpertBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/expert/jobs/{job_id}":{"get":{"tags":["Expert Mobile App"],"summary":"Get one job assigned to the signed-in Expert, including customer, address, service, payment, and job-history details.","security":[{"ExpertBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/expert/profile/documents/{document_type}/{document_index}":{"get":{"tags":["Expert Mobile App"],"summary":"Download the signed-in Expert's private profile photo, driving licence, or certificate.","security":[{"ExpertBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"document_type","in":"path","required":true,"schema":{"type":"string","enum":["profile-photo","driving-license-front","driving-license-back","certification"]}},{"name":"document_index","in":"path","required":true,"schema":{"type":"integer","minimum":0}}]}},"/expert/profile/phone/request-otp":{"post":{"tags":["Expert Mobile App"],"summary":"Request an account-bound phone-change code. Currently supports test OTP mode; SMS delivery is not configured.","security":[{"ExpertBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"phone":"9000000002"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/expert/profile/phone/verify-otp":{"post":{"tags":["Expert Mobile App"],"summary":"Verify a one-time code and update the authenticated expert phone.","security":[{"ExpertBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"challenge_token":"request-response-challenge","otp":"123456"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/expert/profile/bank":{"put":{"tags":["Expert Mobile App"],"summary":"Verify a replacement payout account with Cashfree before updating the signed-in Expert profile. The existing bank account is retained if verification fails.","security":[{"ExpertBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"bank_name":"HDFC Bank","bank_account_holder_name":"Ramesh Kumar","account_number":"1234567890123456","bank_ifsc_code":"HDFC0001234"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/expert/profile/availability":{"put":{"tags":["Expert Mobile App"],"summary":"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.","security":[{"ExpertBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"availability":"Online","unavailable_slots":[{"date":"2026-09-12","day":"Sat","start_time":"10:00","end_time":"12:00"}]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/expert/profile/vehicle":{"put":{"tags":["Expert Mobile App"],"summary":"Create or update the authenticated Expert vehicle profile. Licence uploads are optional and replace the corresponding existing file only when supplied.","security":[{"ExpertBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"vehicle_type":"Bike","vehicle_owner_name":"Ramesh Kumar","driving_license_front_file":{"name":"licence-front.jpg","data":"data:image/jpeg;base64,..."},"driving_license_back_file":null}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/mobile/settings":{"get":{"tags":["Mobile App"],"summary":"Get customer settings","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"put":{"tags":["Mobile App"],"summary":"Update customer settings","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/mobile/preferences":{"get":{"tags":["Mobile App"],"summary":"Get customer preferences","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"put":{"tags":["Mobile App"],"summary":"Update customer preferences","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/mobile/profile":{"get":{"tags":["Mobile App"],"summary":"Get signed-in customer profile. The response includes a profile_completion_percentage and completed/missing profile-field breakdown; bookings, preferences, and payments are excluded.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"put":{"tags":["Mobile App"],"summary":"Partially update the signed-in customer profile. Address fields are required only when an address is being changed.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"name":"Example Customer","email":"customer@example.com","gender":"Other","date_of_birth":"1993-06-18","preferred_languages":["Hindi"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/mobile/profile/photo":{"get":{"tags":["Mobile App"],"summary":"Download the signed-in customer's private profile photo. Send the Customer bearer token; the response is image bytes.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"post":{"tags":["Mobile App"],"summary":"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.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"profile_image":{"type":"string","format":"binary"}},"required":["profile_image"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/mobile/addresses":{"get":{"tags":["Mobile App"],"summary":"List customer addresses, including stored google_place_id, latitude, and longitude when available.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"post":{"tags":["Mobile App"],"summary":"Create customer address. Include google_place_id after an address selection; the API resolves and stores the exact latitude and longitude.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"address_type":"Home","address_name":"Home","address":"Street and locality","google_place_id":"ChIJ...","house_flat_no":"Flat 402","floor":"4th Floor","building_name":"Example Residency","nearby_landmark":"Near City Mall","lift_available":true,"parking_instructions":"Use visitor parking near Gate 2","receiver_name":"Receiver Name","receiver_phone":"9876543210","state_id":1,"city_id":1,"pincode":"560001"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/mobile/addresses/{address_id}":{"put":{"tags":["Mobile App"],"summary":"Update customer address. Include google_place_id after an address selection; the API resolves and stores the exact latitude and longitude.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"address_type":"Work","address_name":"Main Office","address":"Street and locality","google_place_id":"ChIJ...","house_flat_no":"Suite 12","floor":"2nd Floor","building_name":"Business Park","nearby_landmark":"Near Metro Station","lift_available":false,"parking_instructions":"Call on arrival","receiver_name":"Office Reception","receiver_phone":"9876543210","state_id":1,"city_id":1,"pincode":"560001"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"address_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"delete":{"tags":["Mobile App"],"summary":"Delete customer address","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"address_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/mobile/addresses/{address_id}/default":{"patch":{"tags":["Mobile App"],"summary":"Set default address","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"address_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/mobile/services/search":{"get":{"tags":["Mobile App"],"summary":"Search active, city-eligible services and variants. Exact matching runs first; only an empty exact result uses server-side typo tolerance.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":120},"example":"ac maintenanxe","description":"The typed customer search text. The API handles typo tolerance after an empty exact search."},{"name":"city_id","in":"query","required":false,"schema":{"type":"integer","minimum":1},"example":1,"description":"Optional active city. Omit to use the customer profile city."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1},"example":1},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":20},"example":20}]}},"/mobile/recommendations":{"get":{"tags":["Mobile App"],"summary":"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.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"example":{"status":true,"message":"Recommendations fetched successfully","x":{"recommendations":[{"id":1,"service_code":"SVC-001","name":"AC Maintenance","selling_price":199,"total_price":199,"currency":"INR","rating":4.7,"rating_count":24,"primary_image_url":"https://esntlsapi.aquaninjas.in/public/service-media/ac-maintenance.jpg","category":{"id":29,"name":"Home Services"},"subcategory":{"id":40,"name":"AC Maintenance"},"policy_category":{"id":35,"name":"Air Conditioner Services","policies":{"warranty":[{"id":11,"content":"30 days warranty on repair workmanship","display_order":0}],"cancellation_policy":[{"id":12,"content":"Cancellation is subject to the service terms.","display_order":0}],"safety_trust":[]}},"policy_response":{"warranty":[{"id":11,"content":"30 days warranty on repair workmanship","display_order":0}],"cancellation_policy":[{"id":12,"content":"Cancellation is subject to the service terms.","display_order":0}],"safety_trust":[]},"faqs":[{"id":1,"question":"What is included?","answer":"Service visit and basic inspection."}],"cart_defaults":{"service_id":1,"service_variant_id":null,"quantity":1,"skill_ids":[]},"previous_service":{"job_id":48,"job_code":"ESJ-000048","completed_at":"2026-10-01T09:30:00.000Z","quantity":1,"total_price":199}}],"pagination":{"page":1,"limit":20,"total":1,"total_pages":1}},"errors":null}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1},"example":1},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50},"example":20}]}},"/mobile/service-catalog":{"post":{"tags":["Mobile App"],"summary":"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.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"category_id":29,"subcategory_id":40,"rating":4,"min_price":500,"max_price":2500,"page":1,"limit":20}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"example":{"status":true,"message":"Service catalog fetched successfully","x":{"root_category":{"id":29,"name":"Home Services","image_name":"home-services.png","image_url":"https://esntlsapi.aquaninjas.in/public/category-images/home-services.png","banner_name":"home-services-banner.png","banner_url":"https://esntlsapi.aquaninjas.in/public/category-banners/home-services-banner.png"},"final_subcategory":{"id":40,"name":"Window AC Repair","image_name":"window-ac-repair.png","image_url":"https://esntlsapi.aquaninjas.in/public/category-images/window-ac-repair.png","banner_name":"window-ac-repair-banner.png","banner_url":"https://esntlsapi.aquaninjas.in/public/category-banners/window-ac-repair-banner.png"},"category_chain":[{"id":29,"name":"Home Services","level":1},{"id":40,"name":"Window AC Repair","level":2}],"services":[{"id":1,"service_code":"SVC-001","name":"Window AC Repair","service_type":"Variant Service","selling_price":499,"currency":"INR","whats_included":["Service visit","Basic inspection"],"not_included":["Spare parts","Additional repairs"],"faqs":[{"id":1,"question":"What is included?","answer":"Service visit and basic inspection."}],"image_names":["window-ac-repair.jpg"],"image_urls":["https://esntlsapi.aquaninjas.in/public/service-media/window-ac-repair.jpg"],"transformation_image_names":["ac-before-after.jpg"],"transformation_image_urls":["https://esntlsapi.aquaninjas.in/public/service-media/ac-before-after.jpg"],"primary_image_url":"https://esntlsapi.aquaninjas.in/public/service-media/window-ac-repair.jpg","rating":null,"rating_count":0,"completed_booking_count":0,"variant_count":2,"variants":[{"id":1,"variant_name":"Standard","selling_price":499}],"reviews_and_ratings":{"average_rating":null,"rating_count":0,"reviews":[],"preview_limit":5,"has_more":false}}],"pagination":{"page":1,"limit":20,"total":1,"total_pages":1},"reviews_and_ratings":{"average_rating":null,"rating_count":0,"reviews":[],"preview_limit":5,"has_more":false}},"errors":null}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/mobile/cart/eligible-experts":{"post":{"tags":["Mobile App"],"summary":"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.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"cart_items":[{"service_id":1,"skill_ids":[1],"scheduled_date":"2026-09-15","slot_start":"10:00","slot_end":"12:00"},{"service_id":2,"skill_ids":[],"scheduled_date":"2026-09-15","slot_start":"10:00","slot_end":"12:00"}],"availability":["Online","On Job"],"page":1,"limit":20}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"example":{"status":true,"message":"Eligible experts fetched successfully","x":{"cart_items":[{"service_id":1,"service_code":"SVC-001","service_name":"Spa Therapy","category_id":10,"subcategory_id":12,"required_skill_ids":[1],"expert_gender_requirement":"Same Gender"}],"gender_matching":{"required":true,"customer_gender_used":"Female","note":"Only Female experts are shown because this cart includes a same-gender service."},"previous_experts":[{"id":4,"expert_code":"ESE-004","name":"Ravi Kumar","gender":"Female","vehicle_type":"Bike","languages":["Hindi","English"],"availability":"Online","unavailable_slots":[],"profile_image_url":null,"rating":null,"completed_jobs":null}],"previous_expert_count":1,"experts":[{"id":4,"expert_code":"ESE-004","name":"Ravi Kumar","gender":"Female","vehicle_type":"Bike","languages":["Hindi","English"],"availability":"Online","unavailable_slots":[],"profile_image_url":null,"rating":null,"completed_jobs":null}],"pagination":{"page":1,"limit":20,"total":1,"total_pages":1}},"errors":null}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/mobile/coupons":{"get":{"tags":["Public Mobile Data"],"summary":"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.","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/mobile/categories":{"get":{"tags":["Mobile App"],"summary":"Get root categories. Each result includes image_name, image_url, banner_name, banner_url, warranty, and variant_count.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/mobile/categories/{category_id}/children":{"get":{"tags":["Mobile App"],"summary":"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.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"rating","in":"query","required":false,"schema":{"type":"number","minimum":1,"maximum":5},"example":4},{"name":"min_price","in":"query","required":false,"schema":{"type":"number","minimum":0},"example":500},{"name":"max_price","in":"query","required":false,"schema":{"type":"number","minimum":0},"example":2500}]}},"/mobile/categories/{category_id}/subcategories/{subcategory_id}/variants":{"get":{"tags":["Mobile App"],"summary":"Get variants for selected category and leaf category, including public category image and banner URLs.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"category_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"subcategory_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/mobile/orders":{"post":{"tags":["Mobile Payments"],"summary":"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.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"address_id":12,"payment_method":"Razorpay","use_wallet":true,"wallet_amount":150,"cart_items":[{"service_id":1,"service_variant_id":null,"quantity":1,"skill_ids":[1],"scheduled_date":"2026-11-05","slot_start":"10:00","slot_end":"12:00","assignment_mode":"selected","expert_id":4,"addons":[{"addon_id":12,"quantity":1}]},{"service_id":2,"service_variant_id":null,"quantity":1,"skill_ids":[],"scheduled_date":"2026-11-06","slot_start":"14:00","slot_end":"16:00","assignment_mode":"auto","addons":[]}]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"example":{"status":true,"message":"Razorpay checkout created successfully","x":{"checkout":{"checkout_session_id":"6b685d6a-267a-4a22-b16a-2b30a34e2b1d","key_id":"rzp_test_...","razorpay_order_id":"order_XXXXXXXXXXXXXX","amount":39800,"currency":"INR","expires_at":"2026-09-20T10:15:00.000Z","prefill":{"name":"Customer name","email":"customer@example.com","contact":"9999999999"}}},"errors":null}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"get":{"tags":["Mobile Orders"],"summary":"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.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"example":{"status":true,"message":"Orders fetched successfully","x":{"orders":[{"id":null,"checkout_session_id":"6b685d6a-267a-4a22-b16a-2b30a34e2b1d","order_code":null,"order_source":"Admin","is_pending_payment":true,"total_amount":1395.82,"payment_method":"Razorpay","payment_status":"Pending Payment","status":"Pending Payment","expires_at":"2026-10-10T12:16:00.000Z","payment_link":{"checkout_session_id":"6b685d6a-267a-4a22-b16a-2b30a34e2b1d","url":"https://rzp.io/i/example","amount":1395.82,"currency":"INR","status":"Created","expires_at":"2026-10-10T12:16:00.000Z","items":[{"service_name":"AC Installation","scheduled_date":"2026-10-10","slot_start":"04:00","slot_end":"05:00"}]},"jobs":[{"id":null,"job_code":null,"status":"Pending Payment","scheduled_date":"2026-10-10","slot_start":"04:00","slot_end":"05:00","catalog_service":{"id":1,"service_code":"SVC-001","name":"AC Installation","image_urls":["https://esntlsapi.aquaninjas.in/public/service-media/ac-installation.jpg"],"primary_image_url":"https://esntlsapi.aquaninjas.in/public/service-media/ac-installation.jpg"}}]},{"id":1,"order_code":"ORD-000001","payment_method":"Razorpay","payment_status":"Paid","status":"Confirmed","total_amount":398,"jobs":[{"id":1,"job_code":"ESJ-000001","status":"Expert Assigned","start_otp":"2452","expert":{"id":4,"expert_code":"ESE-004","name":"Ravi Kumar","phone":"9876543210","availability":"Online","profile_image_url":"https://esntlsapi.aquaninjas.in/public/expert-documents/expert-4-profile.jpg"},"catalog_service":{"service_code":"SVC-001","name":"AC Maintenance","image_names":["ac-maintenance.jpg"],"image_urls":["https://esntlsapi.aquaninjas.in/public/service-media/ac-maintenance.jpg"],"primary_image_url":"https://esntlsapi.aquaninjas.in/public/service-media/ac-maintenance.jpg"}}]}],"filters":{"booking_time":null},"pagination":{"page":1,"limit":5,"total":2,"total_pages":1,"has_next":false,"has_previous":false}},"errors":null}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"booking_time","in":"query","required":false,"schema":{"type":"string","pattern":"^(last_7_days|last_30_days|older|\\d{4})$"},"example":"last_30_days"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":10000},"example":1},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100},"example":5}],"description":"Optional page/limit paginate confirmed and pending-payment bookings together, newest first. Supplying either enables pagination (page defaults to 1, limit to 20); omitting both preserves the full list without pagination metadata. booking_time applies before pagination. One entry is a booking, including all its jobs. See docs/mobile-order-pagination.md."}},"/mobile/jobs/{job_id}/service-rating":{"post":{"tags":["Mobile Ratings"],"summary":"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.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"rating":5,"review":"Fast, professional service."}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/mobile/jobs/{job_id}/expert-rating":{"post":{"tags":["Mobile Ratings"],"summary":"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.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"rating":4,"experience_reason_id":1,"review":"The expert arrived after the scheduled slot."}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/mobile/orders/verify-payment":{"post":{"tags":["Mobile Payments"],"summary":"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.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"checkout_session_id":"6b685d6a-267a-4a22-b16a-2b30a34e2b1d","razorpay_payment_id":"pay_XXXXXXXXXXXXXX","razorpay_order_id":"order_XXXXXXXXXXXXXX","razorpay_signature":"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"example":{"status":true,"message":"Payment verified and order created successfully","x":{"order":{"id":1,"order_code":"ORD-000001","payment_method":"Razorpay","payment_status":"Paid","subtotal":398,"total_amount":398,"jobs":[{"id":1,"job_code":"ESJ-000001","status":"Expert Assigned","start_otp":"2452","start_otp_verified":false}]}},"errors":null}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/mobile/wallet/top-ups":{"post":{"tags":["Mobile Wallet"],"summary":"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.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"amount":500}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/mobile/wallet/top-ups/verify-payment":{"post":{"tags":["Mobile Wallet"],"summary":"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.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"checkout_session_id":"6b685d6a-267a-4a22-b16a-2b30a34e2b1d","razorpay_payment_id":"pay_XXXXXXXXXXXXXX","razorpay_order_id":"order_XXXXXXXXXXXXXX","razorpay_signature":"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/mobile/orders/{order_id}":{"get":{"tags":["Mobile Orders"],"summary":"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.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"example":{"status":true,"message":"Order fetched successfully","x":{"order":{"id":1,"order_code":"ORD-000001","payment_method":"Razorpay","payment_status":"Paid","status":"Confirmed","total_amount":398,"jobs":[{"id":1,"job_code":"ESJ-000001","status":"Expert Assigned","start_otp":"2452","expert":{"id":4,"expert_code":"ESE-004","name":"Ravi Kumar","phone":"9876543210","availability":"Online","profile_image_url":"https://esntlsapi.aquaninjas.in/public/expert-documents/expert-4-profile.jpg"},"catalog_service":{"service_code":"SVC-001","name":"AC Maintenance","image_names":["ac-maintenance.jpg"],"image_urls":["https://esntlsapi.aquaninjas.in/public/service-media/ac-maintenance.jpg"],"primary_image_url":"https://esntlsapi.aquaninjas.in/public/service-media/ac-maintenance.jpg"}}],"wallet_applied_amount":100,"remaining_amount":298,"payment_breakdown":{"currency":"INR","base_service_amount":300,"addons":[{"id":3,"job_id":1,"title":"Hose","quantity":1,"amount":50}],"addons_subtotal":50,"subtotal":350,"discount_amount":30,"coupon_code":"SAVE30","gst_amount":57.6,"platform_fee_amount":20.4,"checkout_adjustment_amount":0,"total_amount":398,"wallet_applied_amount":100,"amount_after_wallet":298,"tips":{"total_amount":0,"entries":[]}}}},"errors":null}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/jobs":{"get":{"tags":["Job Operations"],"summary":"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.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/admin/orders":{"post":{"tags":["Job Operations"],"summary":"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.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"customer_id":18,"address_id":7,"payment_method":"Razorpay","cart_items":[{"service_id":8,"service_variant_id":null,"quantity":1,"skill_ids":[],"scheduled_date":"2026-10-08","slot_start":"10:00","slot_end":"12:00","assignment_mode":"selected","expert_id":5,"is_addon":false}]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/finance/dashboard":{"get":{"tags":["Finance"],"summary":"Get live payment, transaction, finance-ledger, GST, and current payout analytics for the Admin Payments page.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/exports/jobs":{"get":{"tags":["Exports"],"summary":"Download every Jobs record as an Excel workbook. This ignores listing filters and pagination.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/jobs/{job_id}":{"get":{"tags":["Job Operations"],"summary":"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.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/jobs/{job_id}/assignment-candidates":{"get":{"tags":["Job Operations"],"summary":"List every expert with assignment eligibility, category and skill coverage, same-slot conflicts, and upcoming jobs for this job.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/jobs/{job_id}/assignment":{"patch":{"tags":["Job Operations"],"summary":"Assign, change, or remove a job expert. Active status, matching skills/categories, dated unavailable periods, and existing job overlaps are enforced.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"expert_id":4,"note":"Assigned after customer request"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/jobs/{job_id}/status":{"patch":{"tags":["Job Operations"],"summary":"Set any job lifecycle status. Moving to In Progress requires the job four-digit start_otp. Cancellation statuses require an active cancellation reason.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"status":"In Progress","start_otp":"2452","note":"Customer OTP verified at arrival"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/jobs/status":{"patch":{"tags":["Job Operations"],"summary":"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.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"job_ids":[1,2],"status":"In Progress","note":"Bulk operational start approved by Admin"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/mobile/coupons/eligible":{"post":{"tags":["Mobile Coupons"],"summary":"List every coupon eligible for this authenticated customer and current cart/address. The response includes the exact server-calculated discount.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"address_id":12,"cart_items":[{"service_id":1,"service_variant_id":null,"quantity":1}]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/mobile/coupons/validate":{"post":{"tags":["Mobile Coupons"],"summary":"Validate a customer-entered code or selected coupon for the current cart/address.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"address_id":12,"coupon_code":"ESNWELCOME100","cart_items":[{"service_id":1,"service_variant_id":null,"quantity":1}]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/mobile/coupons/apply-best":{"post":{"tags":["Mobile Coupons"],"summary":"Return the highest-value eligible automatic or personalized coupon for the current cart/address.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"address_id":12,"cart_items":[{"service_id":1,"service_variant_id":null,"quantity":1}]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/mobile/coupons/remove":{"post":{"tags":["Mobile Coupons"],"summary":"Remove a client-selected coupon from the current checkout. Checkout remains server-authoritative.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"coupon_id":1}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/admin/coupons":{"get":{"tags":["Coupon Management"],"summary":"List coupon rules with live redemption and customer-assignment counts.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"post":{"tags":["Coupon Management"],"summary":"Create a server-enforced coupon. Percentage discounts cannot exceed 90%. Campaign features are intentionally excluded.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"code":"ESNWELCOME100","name":"ESN Welcome Rs 100 Off","coupon_type":"Code","status":"Active","discount_type":"Flat","discount_value":100,"min_order_amount":499,"total_usage_limit":1000,"per_customer_limit":1,"budget_amount":100000,"first_order_only":true,"audience_type":"AllCustomers","customer_ids":[],"state_id":null,"city_id":null,"category_ids":[],"service_ids":[],"variant_ids":[],"start_at":"2026-10-09T00:00:00.000Z","end_at":"2026-12-31T23:59:59.000Z","terms":["Valid once per customer"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/admin/coupons/report":{"get":{"tags":["Coupon Management"],"summary":"Get basic redeemed/reserved/released coupon totals and invalid attempt count.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/admin/coupons/dashboard":{"get":{"tags":["Coupon Management"],"summary":"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.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"type":"string","format":"date"},"example":"2026-10-01"},{"name":"end_date","in":"query","required":false,"schema":{"type":"string","format":"date"},"example":"2026-10-31"},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["Draft","Active","Paused","Expired","Archived"]},"example":"Active"},{"name":"coupon_type","in":"query","required":false,"schema":{"type":"string","enum":["Code","Automatic","Personalized"]},"example":"Code"}]}},"/admin/coupons/{coupon_id}":{"get":{"tags":["Coupon Management"],"summary":"Get one coupon including selected-customer assignments.","security":[{"SuperAdminBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"coupon_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]},"put":{"tags":["Coupon Management"],"summary":"Update a coupon rule. Existing redemptions retain their immutable snapshot. Percentage discounts cannot exceed 90%.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"code":"ESNWELCOME100","name":"ESN Welcome Rs 100 Off","coupon_type":"Code","status":"Active","discount_type":"Flat","discount_value":100,"min_order_amount":499,"audience_type":"AllCustomers","customer_ids":[],"category_ids":[],"service_ids":[],"variant_ids":[],"start_at":"2026-10-09T00:00:00.000Z","terms":[]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"coupon_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/admin/coupons/{coupon_id}/status":{"patch":{"tags":["Coupon Management"],"summary":"Activate, pause, archive, or return a coupon to Draft.","security":[{"SuperAdminBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"status":"Paused"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"coupon_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/mobile/services/frequently-added":{"post":{"tags":["Mobile App"],"summary":"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.","security":[{"CustomerBearer":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"allOf":[{"anyOf":[{"not":{"required":["subcategory_id"]}},{"required":["category_id"]}]}],"properties":{"category_id":{"type":"integer","minimum":1,"description":"Explicit parent branch; may be an intermediate AC category rather than the catalog root."},"subcategory_id":{"type":"integer","minimum":1,"description":"Optional context validation only, never narrows the parent scope."},"service_ids":{"type":"array","maxItems":100,"uniqueItems":true,"items":{"type":"integer","minimum":1},"default":[]},"exclude_service_ids":{"type":"array","maxItems":100,"uniqueItems":true,"items":{"type":"integer","minimum":1},"default":[]},"city_id":{"type":"integer","minimum":1},"page":{"type":"integer","minimum":1,"maximum":10000,"default":1},"limit":{"type":"integer","minimum":1,"maximum":50,"default":20}}},"example":{"category_id":35,"subcategory_id":40,"service_ids":[10],"exclude_service_ids":[],"page":1,"limit":20}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"},"examples":{"mostBooked":{"summary":"Most booked services (no request body)","value":{"status":true,"message":"Frequently added services fetched successfully","x":{"parent_category":null,"ranking_mode":"most_booked","services":[{"id":11,"service_code":"SVC-011","name":"AC Gas Refill","service_type":"standard","selling_price":199,"vendor_price":150,"duration":"45 minutes","currency":"INR","image_names":["gas-refill.jpg"],"image_urls":["https://esntlsapi.aquaninjas.in/public/service-media/gas-refill.jpg"],"primary_image_url":"https://esntlsapi.aquaninjas.in/public/service-media/gas-refill.jpg","rating":null,"rating_count":0,"completed_booking_count":4,"faqs":[],"variants":[],"variant_count":0,"requires_variant_selection":false,"cart_defaults":{"service_id":11,"service_variant_id":null,"quantity":1,"skill_ids":[]},"booking_count":7}],"applied_filters":{"category_id":null,"subcategory_id":null,"city_id":null,"excluded_service_ids":[]},"pagination":{"page":1,"limit":20,"total":1,"total_pages":1,"has_next":false,"has_previous":false}},"errors":null}},"related":{"summary":"Related services (with category payload)","value":{"status":true,"message":"Frequently added services fetched successfully","x":{"parent_category":{"id":35,"name":"AC Services"},"ranking_mode":"related_services","services":[{"id":11,"service_code":"SVC-011","name":"AC Gas Refill","service_type":"standard","selling_price":199,"vendor_price":150,"duration":"45 minutes","currency":"INR","image_names":["gas-refill.jpg"],"image_urls":["https://esntlsapi.aquaninjas.in/public/service-media/gas-refill.jpg"],"primary_image_url":"https://esntlsapi.aquaninjas.in/public/service-media/gas-refill.jpg","rating":null,"rating_count":0,"completed_booking_count":null,"faqs":[],"variants":[],"variant_count":0,"requires_variant_selection":false,"cart_defaults":{"service_id":11,"service_variant_id":null,"quantity":1,"skill_ids":[]}}],"applied_filters":{"category_id":35,"subcategory_id":40,"city_id":null,"excluded_service_ids":[10]},"pagination":{"page":1,"limit":20,"total":1,"total_pages":1,"has_next":false,"has_previous":false}},"errors":null}}}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"404":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"422":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/public/home-types":{"get":{"tags":["Public Mobile Data"],"summary":"Get active home types","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/public/family-types":{"get":{"tags":["Public Mobile Data"],"summary":"Get active family types","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/public/preferred-timings":{"get":{"tags":["Public Mobile Data"],"summary":"Get active preferred timings","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/public/appliances-owned":{"get":{"tags":["Public Mobile Data"],"summary":"Get active appliances owned","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/public/states":{"get":{"tags":["Public Mobile Data"],"summary":"Get active states","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/public/cities":{"get":{"tags":["Public Mobile Data"],"summary":"Get active cities","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/public/service-categories":{"get":{"tags":["Public Mobile Data"],"summary":"Get active service categories","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/public/services":{"get":{"tags":["Public Mobile Data"],"summary":"Get active services","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/public/services/{service_id}/faqs":{"get":{"tags":["Public Mobile Data"],"summary":"Get public service FAQs","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"service_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/expert/job-cancellation-reasons":{"get":{"tags":["Expert Job Execution"],"summary":"Active expert rejection/cancellation reasons; requires_note controls the existing note field.","security":[{"ExpertBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/expert/jobs/{job_id}/tracking":{"get":{"tags":["Job Tracking"],"summary":"Assigned expert reads their current trip session; resume GPS only for an active sharing session.","security":[{"ExpertBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/expert/jobs/{job_id}/execution":{"get":{"tags":["Expert Job Execution"],"summary":"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.","security":[{"ExpertBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"description":"Read durable execution progress. x.execution includes start_otp_verified_at and verified_start_otp (null before verification, confirmed four-digit code only for the assigned expert afterward), before_photo/after_photo flags, work_started_at/work_ended_at, elapsed_seconds, checklist, report, additional_work, base_amount and base_cash_collected. Upload a real before photo after OTP verification before start-work. No sample file is preloaded."}},"/expert/jobs/{job_id}/actions":{"post":{"tags":["Expert Job Execution"],"summary":"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.","security":[{"ExpertBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"action":"accept"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/expert/jobs/{job_id}/execution/checklist":{"put":{"tags":["Expert Job Execution"],"summary":"Persist one checklist key returned by execution. Requires started work; cannot edit after ending work.","security":[{"ExpertBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"key":"Initial inspection","completed":true}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/expert/jobs/{job_id}/execution/report":{"put":{"tags":["Expert Job Execution"],"summary":"Save the existing six-field service report after ending work. Enum choices match the existing Expert App form.","security":[{"ExpertBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"overall":"Good","cooling":"Good","gas":"Good","filter":"Clean","coil":"Good","drain":"Clear"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/expert/jobs/{job_id}/execution/photos":{"post":{"tags":["Expert Job Execution"],"summary":"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.","security":[{"ExpertBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"stage":"before","file_name":"before.jpg","file_base64":"{{work_photo_base64}}"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/expert/jobs/{job_id}/execution/photos/{stage}":{"get":{"tags":["Expert Job Execution"],"summary":"Download private photo as binary using the assigned expert or booking-owner token. No public URL.","security":[{"ExpertBearer":[]}],"responses":{"200":{"description":"Authenticated work photo","content":{"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/png":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"stage","in":"path","required":true,"schema":{"type":"string","enum":["before","after"]}}]},"delete":{"tags":["Expert Job Execution"],"summary":"Remove an editable work photo; before photo cannot be deleted after work starts.","security":[{"ExpertBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"stage","in":"path","required":true,"schema":{"type":"string","enum":["before","after"]}}]}},"/mobile/jobs/{job_id}/execution/photos/{stage}":{"get":{"tags":["Expert Job Execution"],"summary":"Download private photo as binary using the assigned expert or booking-owner token. No public URL.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Authenticated work photo","content":{"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/png":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"stage","in":"path","required":true,"schema":{"type":"string","enum":["before","after"]}}]}},"/expert/jobs/{job_id}/additional-work":{"post":{"tags":["Expert Job Execution"],"summary":"Request a quote; customer approval is mandatory. Does not charge or self-approve. Only one pending quote at a time.","security":[{"ExpertBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"work_type":"Gas refill","description":"Additional work found during inspection","amount":650,"duration_minutes":45}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/mobile/jobs/{job_id}/execution":{"get":{"tags":["Expert Job Execution"],"summary":"Booking owner reads execution and quote UUIDs from x.execution.additional_work. Approval is independent of payment.","security":[{"CustomerBearer":[]}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}}]}},"/mobile/jobs/{job_id}/additional-work/{request_id}/decision":{"post":{"tags":["Expert Job Execution"],"summary":"Booking owner approves or rejects a pending quote. Approved quote adds the Additional work checklist item. Repeated identical decisions are a no-op.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"status":"Approved"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}]}},"/mobile/jobs/{job_id}/additional-work/{request_id}/payment-order":{"post":{"tags":["Expert Job Execution"],"summary":"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.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}]}},"/mobile/jobs/{job_id}/additional-work/{request_id}/verify-payment":{"post":{"tags":["Expert Job Execution"],"summary":"Verify quote payment signature AND provider-captured amount/order/currency. Idempotently records capture and ledger; never accept a client-only Paid flag.","security":[{"CustomerBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object"},"example":{"razorpay_order_id":"order_example","razorpay_payment_id":"pay_example","razorpay_signature":"{{razorpay_signature}}"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"201":{"description":"Successful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"400":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"401":{"description":"Request could not be completed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}},"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}]}}},"components":{"securitySchemes":{"SuperAdminBearer":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Use the token from super admin login."},"CustomerBearer":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Use the customer token from mobile OTP verification."},"ExpertBearer":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Use the Expert token from Expert OTP verification."}},"schemas":{"ApiResponse":{"type":"object","properties":{"status":{"type":"boolean"},"message":{"type":"string"},"x":{"nullable":true},"errors":{"type":"object","nullable":true,"additionalProperties":{"type":"string"}}}}}}}