Shop It Docs
Developer Resourcesconsultation

Consultation Module API & Integration Guide

Consultation API contracts for admin slot and booking operations plus customer booking flows.

Audience: Mobile/web frontend developers Scope: Booking endpoints, error codes

1. How to Read / Quick Metadata

  • Module: Consultation
  • Auth models:
    • Customer slot list + booking create: public (@Public) with optional JWT for book
    • Customer booking history: JwtAuthGuard
    • Admin routes: JwtAuthGuard + RoleGuard + @Permissions(...)
  • Primary base URLs:
    • Customer: /api/consultations
    • Mobile-composed customer: /api/mobile/consultations
    • Admin slots: /api/admin/consultations/slots
    • Admin bookings: /api/admin/consultations/bookings
  • Response envelope: successful endpoints return ResponseDto<T>
  • Swagger tags used by controllers:
    • Consultation (Mobile)
    • Consultation Slots (Admin)
    • Consultation Bookings (Admin)

2. High-Level Overview

Consultation API is split into:

  • admin slot inventory management
  • admin booking management and contacted-state updates
  • public/customer slot discovery and booking submission
  • authenticated customer booking history

Booking creation immediately persists the booking and queues notifications asynchronously.

3. Core Concepts and Terminology

  • slot: consultation availability record in consultation_slot
  • booking: customer consultation request in consultation_booking
  • booking status: pending or contacted
  • isBooked flag: derived field on slot list to indicate booking existence
  • bulk slot generation: interval-based slot creation from weekday/date rules
  • notification fanout: booking success queues notification.send_email and optional notification.send_push

4. Route Summary

4.1 Customer / Mobile

MethodPathBehavior
GET/api/consultations/slotsLists available slots (public)
POST/api/consultations/bookBooks a slot (public, optional auth link)
GET/api/consultations/bookingsLists own bookings (JWT required)

Mobile-composed equivalents are available under /api/mobile/consultations/....

4.2 Admin Slots

MethodPathPermission
GET/api/admin/consultations/slotsConsultationSlots_READ
GET/api/admin/consultations/slots/:idConsultationSlots_READ
POST/api/admin/consultations/slotsConsultationSlots_CREATE
PATCH/api/admin/consultations/slots/:idConsultationSlots_UPDATE
DELETE/api/admin/consultations/slots/:idConsultationSlots_DELETE

4.3 Admin Bookings

MethodPathPermission
GET/api/admin/consultations/bookingsConsultationBookings_READ
GET/api/admin/consultations/bookings/:idConsultationBookings_READ
PATCH/api/admin/consultations/bookings/:id/statusConsultationBookings_UPDATE

Route Details

List Slots

AspectDetails
EndpointGET /api/consultations/slots or /api/mobile/consultations/slots
AuthPublic
Requestquery params: date, isActive
ResponseResponseDto<SlotDto[]>
Errors-

Book Slot

AspectDetails
EndpointPOST /api/consultations/book or /api/mobile/consultations/book
AuthOptional JWT
Request"" slotId: number, name: string, email: string, phone?: string ""
ResponseResponseDto<BookingDto>
Errors400 slot unavailable, 400 past date

5. Query Parameters

5.1 Customer slots (GET /api/consultations/slots)

ParamTypeDefault
pagenumber1
sizenumber20
paginationbooleantrue
dateYYYY-MM-DDoptional
sortdate | startTimedate
orderasc | descasc

5.2 Customer bookings (GET /api/consultations/bookings)

ParamTypeDefault
pagenumber1
sizenumber20
paginationbooleantrue
statuspending | contactedoptional

5.3 Admin slots (GET /api/admin/consultations/slots)

ParamTypeDefault
pagenumber1
sizenumber20
paginationbooleantrue
dateYYYY-MM-DDoptional
isActivebooleanoptional
sortdate | startTime | createdAtdate
orderasc | descasc

5.4 Admin bookings (GET /api/admin/consultations/bookings)

ParamTypeDefault
pagenumber1
sizenumber20
paginationbooleantrue
statuspending | contactedoptional
slotDateYYYY-MM-DDoptional
searchstringoptional
sortbookedAt | slotDate | fullNamebookedAt
orderasc | descdesc

6. Response Shape Examples

6.1 Booking create request

"
  "fullName": "John Doe",
  "contactNum": "+9779841234567",
  "email": "john.doe@example.com",
  "message": "I need guidance for NEPSE portfolio allocation.",
  "slotId": 12
"

6.2 Slot list item

"
  "id": 1,
  "date": "2026-04-15",
  "startTime": "10:00:00",
  "endTime": "11:00:00",
  "isActive": true,
  "isBooked": false,
  "createdAt": "2026-04-01T00:00:00.000Z"
"

6.3 Booking response

"
  "id": 1,
  "fullName": "John Doe",
  "email": "john.doe@example.com",
  "contactNum": "+9779841234567",
  "message": "I need guidance for NEPSE portfolio allocation.",
  "slotId": 12,
  "slotDate": "2026-04-15",
  "slotStartTime": "10:00:00",
  "slotEndTime": "11:00:00",
  "bookedAt": "2026-04-10T08:30:00.000Z",
  "bookingStatus": "pending"
"

7. Enums

7.1 consultation_booking_status

  • pending
  • contacted

7.2 Allowed weekdays for admin bulk creation

  • sun, mon, tue, wed, thu, fri, sat

8. Integration Diagram

9. Caching

Cache keyspaces:

  • consultation:customer:slots:list:

TTL env:

  • CONSULTATION_SLOTS_CACHE_TTL_SECONDS (default 300)

Invalidation triggers:

  • admin slot create/update/delete
  • customer booking create

10. Error Handling

All consultation API errors return the standard error envelope:

"
  "statusCode": 400,
  "errorCode": "CONSULTATION_SLOT_INACTIVE",
  "message": "Consultation slot is not active.",
  "timestamp": "2026-04-10T08:30:00.000Z",
  "path": "/api/consultations/book"
"

Representative error map:

HTTPerrorCodeMessage
400CONSULTATION_SLOT_INACTIVEConsultation slot is not active.
400CONSULTATION_SLOT_PAST_DATECannot book a slot in the past.
400CONSULTATION_SLOT_ALREADY_BOOKEDSlot is already booked.
400CONSULTATION_BOOKING_SLOT_RESTRICTEDCannot delete slot that has bookings. Please deactivate instead.
404CONSULTATION_SLOT_NOT_FOUNDConsultation slot not found.
404CONSULTATION_BOOKING_NOT_FOUNDConsultation booking not found.
409CONSULTATION_SLOT_CONFLICTSlot conflict (duplicate slot or invalid slot-time window).
429RATE_LIMIT_EXCEEDEDToo many requests. Please try again later.

Time fields in this module are stored as timezone-aware values and should be handled as ISO-8601 instants by API consumers.


See Also

11. Endpoint Reference + Payload Cheatsheet

11.1 Payload Cheatsheet Table (Every Endpoint)

MethodPathAuth / PermissionRequest DTO / ParamsSuccess DTONotes
GET/api/consultations/slotsPublicQuerySlotsDto "" page?, size?, pagination?, date?, sort?, order? ""SlotDto[] paginatedLists available consultation slots; public access
GET/api/mobile/consultations/slotsPublicQuerySlotsDto "" page?, size?, pagination?, date?, sort?, order? ""SlotDto[] paginatedMobile-composed equivalent of slot list
POST/api/consultations/bookOptional JWTCreateBookingDto "" slotId: number, fullName: string, email: string, contactNum: string, message?: string ""BookingDtoBooks a slot; optional auth links booking to user
POST/api/mobile/consultations/bookOptional JWTCreateBookingDto "" slotId: number, fullName: string, email: string, contactNum: string, message?: string ""BookingDtoMobile-composed equivalent of book slot
GET/api/consultations/bookingsUser JWTQueryBookingsDto "" page?, size?, pagination?, status? ""BookingDto[] paginatedLists current user's booking history
GET/api/mobile/consultations/bookingsUser JWTQueryBookingsDto "" page?, size?, pagination?, status? ""BookingDto[] paginatedMobile-composed equivalent of bookings list
GET/api/admin/consultations/slotsAdmin + ConsultationSlots_READQuerySlotsAdminDto "" page?, size?, pagination?, date?, isActive?, sort?, order? ""SlotDto[] paginatedAdmin lists all slots with filters
GET/api/admin/consultations/slots/:idAdmin + ConsultationSlots_READpath: id (int)SlotDtoAdmin fetches single slot detail
POST/api/admin/consultations/slotsAdmin + ConsultationSlots_CREATECreateSlotDto "" date: string, startTime: string, endTime: string, isActive?: boolean ""SlotDtoAdmin creates new slot
PATCH/api/admin/consultations/slots/:idAdmin + ConsultationSlots_UPDATEpath: id (int), body: UpdateSlotDto "" date?: string, startTime?: string, endTime?: string, isActive?: boolean ""SlotDtoAdmin updates existing slot
DELETE/api/admin/consultations/slots/:idAdmin + ConsultationSlots_DELETEpath: id (int)"" deleted: boolean ""Admin deletes slot; fails if has bookings
GET/api/admin/consultations/bookingsAdmin + ConsultationBookings_READQueryBookingsAdminDto "" page?, size?, pagination?, status?, slotDate?, search?, sort?, order? ""BookingDto[] paginatedAdmin lists all bookings with filters
GET/api/admin/consultations/bookings/:idAdmin + ConsultationBookings_READpath: id (int)BookingDtoAdmin fetches single booking detail
PATCH/api/admin/consultations/bookings/:id/statusAdmin + ConsultationBookings_UPDATEpath: id (int), body: UpdateBookingStatusDto "" status: "pending" | "contacted" ""BookingDtoAdmin updates booking contacted status

11.1.1 Customer Slots Endpoint Query Variations

MethodPathQuery ParametersNotes
GET/api/consultations/slots(no params)Default: page=1, size=20, sort=date asc
GET/api/consultations/slots?page=2&size=10Custom pagination
GET/api/consultations/slots?date=2026-04-15Filter by specific date
GET/api/consultations/slots?sort=startTime&order=descSort by start time descending
GET/api/consultations/slots?pagination=falseReturns all records

11.1.2 Customer Bookings Endpoint Query Variations

MethodPathQuery ParametersNotes
GET/api/consultations/bookings(no params)Default: page=1, size=20, sort=bookedAt desc
GET/api/consultations/bookings?status=pendingFilter by pending status
GET/api/consultations/bookings?status=contactedFilter by contacted status
GET/api/consultations/bookings?page=1&size=50Custom pagination

11.1.3 Admin Slots Endpoint Query Variations

MethodPathQuery ParametersNotes
GET/api/admin/consultations/slots(no params)Default: page=1, size=20, sort=date asc
GET/api/admin/consultations/slots?isActive=trueFilter by active status
GET/api/admin/consultations/slots?date=2026-04-15Filter by specific date
GET/api/admin/consultations/slots?sort=createdAt&order=descSort by creation date
GET/api/admin/consultations/slots?page=3&size=100Custom pagination

11.1.4 Admin Bookings Endpoint Query Variations

MethodPathQuery ParametersNotes
GET/api/admin/consultations/bookings(no params)Default: page=1, size=20, sort=bookedAt desc
GET/api/admin/consultations/bookings?status=pendingFilter pending bookings
GET/api/admin/consultations/bookings?status=contactedFilter contacted bookings
GET/api/admin/consultations/bookings?slotDate=2026-04-15Filter by slot date
GET/api/admin/consultations/bookings?search=johnSearch by name/email/phone
GET/api/admin/consultations/bookings?sort=slotDate&order=ascSort by slot date
GET/api/admin/consultations/bookings?search=john&status=pendingCombined search and filter

11.1.5 Booking Create Request Variations

MethodPathRequest BodyNotes
POST/api/consultations/book"" "slotId": 12, "fullName": "John Doe", "email": "john@example.com", "contactNum": "+9779841234567" ""Basic booking without message
POST/api/consultations/book"" "slotId": 12, "fullName": "Jane Smith", "email": "jane@example.com", "contactNum": "+9779847654321", "message": "Need help with portfolio" ""Booking with message
POST/api/mobile/consultations/book"" "slotId": 12, "fullName": "John Doe", "email": "john@example.com", "contactNum": "+9779841234567" ""Mobile equivalent

11.1.6 Slot Response Field Variations

FieldTypeNotes
idnumberUnique slot ID
datestring (YYYY-MM-DD)Slot date
startTimestring (HH:MM:SS)Slot start time
endTimestring (HH:MM:SS)Slot end time
isActivebooleanWhether slot is available
isBookedbooleanDerived field; true if already booked
createdAtISO8601Slot creation timestamp

11.1.7 Booking Response Field Variations

FieldTypeNotes
idnumberUnique booking ID
fullNamestringCustomer full name
emailstringCustomer email
contactNumstringCustomer phone
messagestring | nullOptional customer message
slotIdnumberReferenced slot ID
slotDatestringDerived from slot
slotStartTimestringDerived from slot
slotEndTimestringDerived from slot
bookedAtISO8601Booking creation time
bookingStatusstringpending/contacted

11.1.8 Error Response Variations

HTTPerrorCodeTrigger
400CONSULTATION_SLOT_INACTIVESlot is not active
400CONSULTATION_SLOT_PAST_DATEAttempting to book past slot
400CONSULTATION_SLOT_ALREADY_BOOKEDSlot already has booking
400CONSULTATION_BOOKING_SLOT_RESTRICTEDDelete slot with bookings
404CONSULTATION_SLOT_NOT_FOUNDSlot ID does not exist
404CONSULTATION_BOOKING_NOT_FOUNDBooking ID does not exist
409CONSULTATION_SLOT_CONFLICTDuplicate or invalid slot time
429RATE_LIMIT_EXCEEDEDToo many requests

11.1.9 Cache Invalidation Variations

TriggerInvalidated Key Pattern
POST /admin/consultations/slotsconsultation:customer:slots:list:*
PATCH /admin/consultations/slots/:idconsultation:customer:slots:list:*
DELETE /admin/consultations/slots/:idconsultation:customer:slots:list:*
POST /consultations/bookconsultation:customer:slots:list:*

11.1.10 Admin Slot Create/Update Variations

MethodPathRequest BodyNotes
POST/api/admin/consultations/slots"" "date": "2026-04-20", "startTime": "09:00:00", "endTime": "10:00:00", "isActive": true ""Create morning slot
POST/api/admin/consultations/slots"" "date": "2026-04-20", "startTime": "14:00:00", "endTime": "15:00:00", "isActive": true ""Create afternoon slot
PATCH/api/admin/consultations/slots/5"" "isActive": false ""Deactivate slot
PATCH/api/admin/consultations/slots/5"" "startTime": "10:00:00", "endTime": "11:00:00" ""Reschedule slot

11.1.11 Booking Status Update Variations

MethodPathRequest BodyNotes
PATCH/api/admin/consultations/bookings/1/status"" "status": "contacted" ""Mark as contacted
PATCH/api/admin/consultations/bookings/1/status"" "status": "pending" ""Revert to pending