Skip to main content

Appointments

Book appointments from your own website, app or CRM, using the same rules as your booking page: team hours, business hours and holidays, blocked time, service variants, price rules and credits.

  1. Find a time with available slots for a service (and variant), optionally with a given team member.
  2. Book with POST /v1/appointments (no payment asked), or with book-with-payment to collect payment online the way the booking page does.
  3. Change with reschedule (staff style: keeps the booked price) or reschedule-with-payment (customer style: the price follows the new time), and cancel.

A booking uses a matching active client credit and returns a credit object. Responses show bookedPrice, the variant and the priceRuleName applied, bookedFrom (API for bookings made here) and startTimeUTC. Booking new appointments needs the Bookings add-on; rescheduling and cancelling existing ones always work.

API regionapi.whautomate.com

Get available slots​

GET /v1/appointments/slots

Lists the free start times for a service on a date (or the next three days), for any team member or one of them.

Headers
x-api-keystringrequired
Your Whautomate API key.
Query parameters
timezonestring
IANA timezone of the returned times, for example Asia/Singapore. Defaults to the location timezone.
staffIdstring
Staff member id. Get ids from GET /v1/staffs.
datestring
Date to check (YYYY-MM-DD).
locationIdstring
Location (workspace) id. Get ids from GET /v1/locations.
nextThreeDaysstring
true to return slots for the date and the two days after it.
serviceIdstring
Service id. Get ids from GET /v1/services.
variantIdstring
Optional service variant id (variants[].variantId from GET /v1/services). Slots then use that variant's duration.
Response 200
datestringrequired
timezonestringrequired
slotsobject[]required
Request
curl -X GET "https://api.whautomate.com/v1/appointments/slots?locationId=Le6dWjQF9K&serviceId=NzzoDETgKg&staffId=XrHPepEL8A&date=2026-11-09&timezone=Asia%2FSingapore" \
-H "x-api-key: YOUR_API_KEY"
Response 200
[
{
"date": "2026-11-08T16:00:00.000Z",
"slots": [
{
"startTime": "09:00 AM",
"endTime": "09:45 AM",
"startTimeUTC": "2026-11-09T01:00:00.000Z",
"endTimeUTC": "2026-11-09T01:45:00.000Z"
},
{
"startTime": "09:45 AM",
"endTime": "10:30 AM",
"startTimeUTC": "2026-11-09T01:45:00.000Z",
"endTimeUTC": "2026-11-09T02:30:00.000Z"
},
{
"startTime": "10:30 AM",
"endTime": "11:15 AM",
"startTimeUTC": "2026-11-09T02:30:00.000Z",
"endTimeUTC": "2026-11-09T03:15:00.000Z"
}
]
}
]

Search appointments​

GET /v1/appointments

Lists appointments in a date range, filtered by location, team member or client.

Headers
x-api-keystringrequired
Your Whautomate API key.
Query parameters
limitinteger
Results per page (default 10, max 100).
staffIdstring
Staff member id. Get ids from GET /v1/staffs.
clientIdstring
Client id.
endDatestring
End of the date range (YYYY-MM-DD, account timezone).
locationIdstring
Location (workspace) id. Get ids from GET /v1/locations.
pageinteger
Page number, from 1 (default 1).
startDatestring
Start of the date range (YYYY-MM-DD, account timezone).
Response 200
idstring
locationobjectrequired
clientobjectrequired
staffobjectrequired
datestringrequired
timestringrequired
timezonestring
startTimeUTCstring
startTimestring
endTimeUTCstring
endTimestring
serviceobjectrequired
variantobject

The service variant a booking or class was made with. Only returned when the service has variants.

bookedPricenumber
Unit price of the booking before tax, after the variant, staff price and price rule, saved when it was booked. Not returned for bookings made before booked prices existed. service.sellingPrice stays the current service price.
priceRuleNamestring
Name of the price rule applied (for example a weekend rate). Only returned when one applied.
addOnServicesobject[]
bookedFromstring
statusstring
appointmentTypestring
paymentStatusstring
creditobject
POST /v1/appointments only: the client credit the booking used, as { creditId, code, credits }, or null when it used none. The client's usable credits for the service (and variant) are applied automatically, as in book-with-payment.
notesstring
createdAtstring
When the record was created (ISO 8601, UTC).
updatedAtstring
When the record was last changed (ISO 8601, UTC).
Request
curl -X GET "https://api.whautomate.com/v1/appointments?clientId=FLT22gHGml&startDate=2026-10-29&endDate=2026-12-09&limit=3" \
-H "x-api-key: YOUR_API_KEY"
Response 200
[
{
"id": "FmNtn5W1AG",
"location": {
"id": "Le6dWjQF9K",
"title": "Serene Wellness Studio"
},
"client": {
"id": "FLT22gHGml",
"fullName": "Priya Nair"
},
"staff": {
"id": "XrHPepEL8A",
"name": "Wei Jie Tan"
},
"timezone": "Asia/Singapore",
"date": "2026-11-09",
"time": "09:00 AM",
"startTimeUTC": "2026-11-09T01:00:00.000Z",
"startTime": "2026-11-09T09:00:00.000Z",
"endTimeUTC": "2026-11-09T01:45:00.000Z",
"endTime": "2026-11-09T09:45:00.000Z",
"service": {
"id": "NzzoDETgKg",
"name": "Physiotherapy Consultation",
"durationMinutes": 45,
"sellingPrice": 130
},
"bookedPrice": 130,
"addOnServices": [],
"bookedFrom": "API",
"status": "Booked",
"appointmentType": "LOCATION_VISIT",
"notes": "Lower back pain after long runs.",
"paymentStatus": "",
"createdAt": "2026-10-29T12:40:16.176Z",
"updatedAt": "2026-10-29T12:40:16.176Z"
}
]

Get an appointment​

GET /v1/appointments/{appointmentId}

Gets one appointment by id.

Headers
x-api-keystringrequired
Your Whautomate API key.
Path parameters
appointmentIdstringrequired
Response 200
idstring
locationobjectrequired
clientobjectrequired
staffobjectrequired
datestringrequired
timestringrequired
timezonestring
startTimeUTCstring
startTimestring
endTimeUTCstring
endTimestring
serviceobjectrequired
variantobject

The service variant a booking or class was made with. Only returned when the service has variants.

bookedPricenumber
Unit price of the booking before tax, after the variant, staff price and price rule, saved when it was booked. Not returned for bookings made before booked prices existed. service.sellingPrice stays the current service price.
priceRuleNamestring
Name of the price rule applied (for example a weekend rate). Only returned when one applied.
addOnServicesobject[]
bookedFromstring
statusstring
appointmentTypestring
paymentStatusstring
creditobject
POST /v1/appointments only: the client credit the booking used, as { creditId, code, credits }, or null when it used none. The client's usable credits for the service (and variant) are applied automatically, as in book-with-payment.
notesstring
createdAtstring
When the record was created (ISO 8601, UTC).
updatedAtstring
When the record was last changed (ISO 8601, UTC).
Request
curl -X GET "https://api.whautomate.com/v1/appointments/FmNtn5W1AG" \
-H "x-api-key: YOUR_API_KEY"
Response 200
{
"id": "FmNtn5W1AG",
"location": {
"id": "Le6dWjQF9K",
"title": "Serene Wellness Studio"
},
"client": {
"id": "FLT22gHGml",
"fullName": "Priya Nair"
},
"staff": {
"id": "XrHPepEL8A",
"name": "Wei Jie Tan"
},
"timezone": "Asia/Singapore",
"date": "2026-11-09",
"time": "09:00 AM",
"startTimeUTC": "2026-11-09T01:00:00.000Z",
"startTime": "2026-11-09T09:00:00.000Z",
"endTimeUTC": "2026-11-09T01:45:00.000Z",
"endTime": "2026-11-09T09:45:00.000Z",
"service": {
"id": "NzzoDETgKg",
"name": "Physiotherapy Consultation",
"durationMinutes": 45,
"sellingPrice": 130
},
"bookedPrice": 130,
"addOnServices": [],
"bookedFrom": "API",
"status": "Booked",
"appointmentType": "LOCATION_VISIT",
"notes": "Lower back pain after long runs.",
"paymentStatus": "",
"createdAt": "2026-10-29T12:40:16.176Z",
"updatedAt": "2026-10-29T12:40:16.176Z"
}

Book an appointment​

POST /v1/appointments

Books an appointment straight away, without asking for payment. Uses the client's credits when they have a matching grant.

Headers
x-api-keystringrequired
Your Whautomate API key.
Body
clientobjectrequired
locationobjectrequired
serviceobjectrequired
datestringrequired
timestringrequired
startTimeUTCstring
Optional: the startTimeUTC of the slot from GET /v1/appointments/slots. Tells apart two slots with the same time label on a DST fall-back day; must be that time on that date.
overrideTimeSlotValidationboolean
staffobject
timezonestring
notesstring
addOnServicesobject[]
Response 200
idstring
locationobjectrequired
clientobjectrequired
staffobjectrequired
datestringrequired
timestringrequired
timezonestring
startTimeUTCstring
startTimestring
endTimeUTCstring
endTimestring
serviceobjectrequired
variantobject

The service variant a booking or class was made with. Only returned when the service has variants.

bookedPricenumber
Unit price of the booking before tax, after the variant, staff price and price rule, saved when it was booked. Not returned for bookings made before booked prices existed. service.sellingPrice stays the current service price.
priceRuleNamestring
Name of the price rule applied (for example a weekend rate). Only returned when one applied.
addOnServicesobject[]
bookedFromstring
statusstring
appointmentTypestring
paymentStatusstring
creditobject
POST /v1/appointments only: the client credit the booking used, as { creditId, code, credits }, or null when it used none. The client's usable credits for the service (and variant) are applied automatically, as in book-with-payment.
notesstring
createdAtstring
When the record was created (ISO 8601, UTC).
updatedAtstring
When the record was last changed (ISO 8601, UTC).
Errors
StatusErrorMeaning
404Client not found / Service not foundThe client, location or service is not in your account.
409No slots available ...The time is no longer free or no team member is available. Get fresh slots.
Request: Existing client
curl -X POST "https://api.whautomate.com/v1/appointments" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"client": {
"id": "FLT22gHGml"
},
"location": {
"id": "Le6dWjQF9K"
},
"service": {
"id": "NzzoDETgKg"
},
"staff": {
"id": "XrHPepEL8A"
},
"date": "2026-11-09",
"time": "09:00 AM",
"timezone": "Asia/Singapore",
"notes": "Lower back pain after long runs."
}'
Response 200: Existing client
{
"id": "FmNtn5W1AG",
"location": {
"id": "Le6dWjQF9K",
"title": "Serene Wellness Studio"
},
"client": {
"id": "FLT22gHGml",
"fullName": "Priya Nair"
},
"staff": {
"id": "XrHPepEL8A",
"name": "Wei Jie Tan"
},
"timezone": "Asia/Singapore",
"date": "2026-11-09",
"time": "09:00 AM",
"startTimeUTC": "2026-11-09T01:00:00.000Z",
"startTime": "2026-11-09T09:00:00.000Z",
"endTimeUTC": "2026-11-09T01:45:00.000Z",
"endTime": "2026-11-09T09:45:00.000Z",
"service": {
"id": "NzzoDETgKg",
"name": "Physiotherapy Consultation",
"durationMinutes": 45,
"sellingPrice": 130
},
"bookedPrice": 130,
"addOnServices": [],
"bookedFrom": "API",
"status": "Booked",
"appointmentType": "LOCATION_VISIT",
"notes": "Lower back pain after long runs.",
"paymentStatus": "",
"createdAt": "2026-10-29T12:40:16.176Z",
"updatedAt": "2026-10-29T12:40:16.176Z",
"credit": null
}
Request: New client by name and phone
curl -X POST "https://api.whautomate.com/v1/appointments" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"client": {
"fullName": "Sophie Tan",
"countryCode": "+65",
"phone": "93318826"
},
"location": {
"id": "Le6dWjQF9K"
},
"service": {
"id": "NzzoDETgKg"
},
"staff": {
"id": "XrHPepEL8A"
},
"date": "2026-11-09",
"time": "03:45 PM",
"timezone": "Asia/Singapore"
}'
Response 200: New client by name and phone
{
"id": "UBS9QSITqV",
"location": {
"id": "Le6dWjQF9K",
"title": "Serene Wellness Studio"
},
"client": {
"id": "NfXfZ6Oj95",
"fullName": "Sophie Tan"
},
"staff": {
"id": "XrHPepEL8A",
"name": "Wei Jie Tan"
},
"timezone": "Asia/Singapore",
"date": "2026-11-09",
"time": "03:45 PM",
"startTimeUTC": "2026-11-09T07:45:00.000Z",
"startTime": "2026-11-09T15:45:00.000Z",
"endTimeUTC": "2026-11-09T08:30:00.000Z",
"endTime": "2026-11-09T16:30:00.000Z",
"service": {
"id": "NzzoDETgKg",
"name": "Physiotherapy Consultation",
"durationMinutes": 45,
"sellingPrice": 130
},
"bookedPrice": 130,
"addOnServices": [],
"bookedFrom": "API",
"status": "Booked",
"appointmentType": "LOCATION_VISIT",
"paymentStatus": "",
"createdAt": "2026-10-29T12:40:16.918Z",
"updatedAt": "2026-10-29T12:40:16.918Z",
"credit": null
}

Book an appointment with payment​

POST /v1/appointments/book-with-payment

Books like the customer booking page does. If the service accepts payment online and the client has no credits to use, nothing is booked yet: the slot is held, a payment link is returned and the appointment is created when the client pays. The link expires with the hold (expiresAt, usually after 10 minutes). Otherwise the appointment is booked straight away. Services with a deposit ask for the deposit only. Use POST /v1/appointments to book without asking for payment.

Headers
x-api-keystringrequired
Your Whautomate API key.
Body
clientobjectrequired

Existing client by id, or a new or matched client by fullName + countryCode + phone.

locationobjectrequired
serviceobjectrequired
staffobject
datestringrequired
timestringrequired
hh:mm AM/PM, e.g. 09:30 AM
startTimeUTCstring
Optional: the startTimeUTC of the slot from GET /v1/appointments/slots. Tells apart two slots with the same time label on a DST fall-back day; must be that time on that date.
timezonestring
notesstring
Response 200
bookingTypestring (enum)
One of: APPOINTMENT, CLASS.
statusstring (enum)
One of: PAYMENT_PENDING, BOOKED, WAITLISTED.
paymentRequiredboolean
currencystring
Account currency from Business Settings, e.g. USD
paymentobject
serviceobject
classIdstring
appointmentobject
classParticipantobject
Request: Service paid online: payment link
curl -X POST "https://api.whautomate.com/v1/appointments/book-with-payment" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"client": {
"id": "FLT22gHGml"
},
"location": {
"id": "Le6dWjQF9K"
},
"service": {
"id": "THF7D9KbDa"
},
"staff": {
"id": "ZxkrjyVgDE"
},
"date": "2026-11-09",
"time": "02:00 PM",
"timezone": "Asia/Singapore"
}'
Response 200: Service paid online: payment link
{
"bookingType": "APPOINTMENT",
"status": "PAYMENT_PENDING",
"paymentRequired": true,
"currency": "SGD",
"payment": {
"orderId": "g2wCSDafpo",
"paymentLink": "https://app.whautomate.com/p/g2wCSDafpo?redirect=true",
"currency": "SGD",
"subTotal": 135,
"taxAmount": 0,
"totalAmount": 135,
"expiresAt": "2026-10-29T13:10:18.643Z",
"expiresInMinutes": 30,
"message": "The payment link expires in 30 minutes. The slot is held until then; the booking is confirmed once payment succeeds. After that the client needs to book again."
},
"service": {
"id": "THF7D9KbDa",
"name": "Deep Tissue Massage"
}
}
Request: No online payment: booked at once
curl -X POST "https://api.whautomate.com/v1/appointments/book-with-payment" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"client": {
"id": "iqf8hDweF6"
},
"location": {
"id": "Le6dWjQF9K"
},
"service": {
"id": "hHuMZsZn7t"
},
"staff": {
"id": "XrHPepEL8A"
},
"date": "2026-11-09",
"time": "03:00 PM",
"timezone": "Asia/Singapore"
}'
Response 200: No online payment: booked at once
{
"bookingType": "APPOINTMENT",
"status": "BOOKED",
"paymentRequired": false,
"currency": "SGD",
"payment": null,
"appointment": {
"id": "lVsORgHaGl",
"location": {
"id": "Le6dWjQF9K",
"title": "Serene Wellness Studio"
},
"client": {
"id": "iqf8hDweF6",
"fullName": "Daniel Wong"
},
"staff": {
"id": "XrHPepEL8A",
"name": "Wei Jie Tan"
},
"service": {
"id": "hHuMZsZn7t",
"name": "Sports Recovery Session",
"durationMinutes": 30
},
"bookedPrice": 75,
"timezone": "Asia/Singapore",
"date": "2026-11-09",
"time": "03:00 PM",
"startTimeUTC": "2026-11-09T07:00:00.000Z",
"endTimeUTC": "2026-11-09T07:30:00.000Z",
"status": "Booked"
}
}

Reschedule an appointment​

POST /v1/appointments/reschedule

Moves an appointment to a new time, as staff do in the app. The booked price stays the same.

Headers
x-api-keystringrequired
Your Whautomate API key.
Body
appointmentIdstringrequired
locationobjectrequired
datestringrequired
timestringrequired
timezonestring
Response 200
idstring
locationobjectrequired
clientobjectrequired
staffobjectrequired
datestringrequired
timestringrequired
timezonestring
startTimeUTCstring
startTimestring
endTimeUTCstring
endTimestring
serviceobjectrequired
variantobject

The service variant a booking or class was made with. Only returned when the service has variants.

bookedPricenumber
Unit price of the booking before tax, after the variant, staff price and price rule, saved when it was booked. Not returned for bookings made before booked prices existed. service.sellingPrice stays the current service price.
priceRuleNamestring
Name of the price rule applied (for example a weekend rate). Only returned when one applied.
addOnServicesobject[]
bookedFromstring
statusstring
appointmentTypestring
paymentStatusstring
creditobject
POST /v1/appointments only: the client credit the booking used, as { creditId, code, credits }, or null when it used none. The client's usable credits for the service (and variant) are applied automatically, as in book-with-payment.
notesstring
createdAtstring
When the record was created (ISO 8601, UTC).
updatedAtstring
When the record was last changed (ISO 8601, UTC).
Request
curl -X POST "https://api.whautomate.com/v1/appointments/reschedule" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"appointmentId": "FmNtn5W1AG",
"location": {
"id": "Le6dWjQF9K"
},
"date": "2026-11-09",
"time": "12:00 PM",
"timezone": "Asia/Singapore"
}'
Response 200
{
"id": "FmNtn5W1AG",
"location": {
"id": "Le6dWjQF9K",
"title": "Serene Wellness Studio"
},
"client": {
"id": "FLT22gHGml",
"fullName": "Priya Nair"
},
"staff": {
"id": "XrHPepEL8A",
"name": "Wei Jie Tan"
},
"timezone": "Asia/Singapore",
"date": "2026-11-09",
"time": "12:00 PM",
"startTimeUTC": "2026-11-09T04:00:00.000Z",
"startTime": "2026-11-09T12:00:00.000Z",
"endTimeUTC": "2026-11-09T04:45:00.000Z",
"endTime": "2026-11-09T12:45:00.000Z",
"service": {
"id": "NzzoDETgKg",
"name": "Physiotherapy Consultation",
"durationMinutes": 45,
"sellingPrice": 130
},
"bookedPrice": 130,
"addOnServices": [],
"bookedFrom": "API",
"status": "Rescheduled",
"appointmentType": "LOCATION_VISIT",
"notes": "Lower back pain after long runs.",
"paymentStatus": "",
"createdAt": "2026-10-29T12:40:16.176Z",
"updatedAt": "2026-10-29T12:40:17.783Z"
}

Reschedule an appointment with repricing​

POST /v1/appointments/reschedule-with-payment

Customer-style reschedule: the price follows the new time (weekend, after-hours rules). Dearer without acceptedPriceDifference: 409 with code PRICE_CONFIRMATION_REQUIRED and priceChange, nothing changes. Dearer on a booking paid in full: the new time is held and a payment link for the extra is returned; the booking moves when it is paid. Otherwise it moves at once (cheaper: the surplus goes to the client's funds or reduces the balance; dearer: added to the balance due). POST /v1/appointments/reschedule (staff) keeps the booked price.

A dearer time without acceptedPriceDifference answers 409 with code PRICE_CONFIRMATION_REQUIRED and a priceChange to show the client; nothing changes until you send it again with the difference accepted.

Headers
x-api-keystringrequired
Your Whautomate API key.
Body
appointmentIdstringrequired
datestringrequired
New date, YYYY-MM-DD
timestringrequired
New start time, hh:mm AM/PM
timezonestring
IANA timezone of date and time; defaults to the account timezone
locationobjectrequired
staffobject

Optional: switch to this staff member (id, or any)

acceptedPriceDifferencenumber
Required when the new time costs more: the priceChange.difference the client agreed to (from a 409 PRICE_CONFIRMATION_REQUIRED answer).
Response 200
statusstring (enum)
One of: RESCHEDULED, PAYMENT_PENDING.
paymentRequiredboolean
appointmentIdstring
paymentobject
priceChangeobject

What the new time costs compared with the booking (amounts include tax, as on the invoice).

appointmentobject

The moved appointment (status RESCHEDULED)

Request
curl -X POST "https://api.whautomate.com/v1/appointments/reschedule-with-payment" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"appointmentId": "FmNtn5W1AG",
"location": {
"id": "Le6dWjQF9K"
},
"date": "2026-11-10",
"time": "09:00 AM",
"timezone": "Asia/Singapore"
}'
Response 200
{
"status": "RESCHEDULED",
"paymentRequired": false,
"payment": null,
"appointment": {
"id": "FmNtn5W1AG",
"location": {
"id": "Le6dWjQF9K",
"title": "Serene Wellness Studio"
},
"client": {
"id": "FLT22gHGml",
"fullName": "Priya Nair"
},
"staff": {
"id": "XrHPepEL8A",
"name": "Wei Jie Tan"
},
"service": {
"id": "NzzoDETgKg",
"name": "Physiotherapy Consultation",
"durationMinutes": 45
},
"bookedPrice": 130,
"timezone": "Asia/Singapore",
"date": "2026-11-10",
"time": "09:00 AM",
"startTimeUTC": "2026-11-10T01:00:00.000Z",
"endTimeUTC": "2026-11-10T01:45:00.000Z",
"status": "Rescheduled"
}
}

Cancel an appointment​

POST /v1/appointments/cancel

Cancels an appointment. Credits used for it are given back.

Headers
x-api-keystringrequired
Your Whautomate API key.
Body
appointmentIdstringrequired
locationobjectrequired
cancellationReasonstring
Response 200
idstring
Record id. Use it in the path of the other endpoints.
locationobject
clientobject
staffobject
timezonestring
datestring
timestring
startTimeUTCstring
Start time in UTC (ISO 8601).
startTimestring
endTimeUTCstring
endTimestring
serviceobject
bookedPriceinteger
Price of the booking after variant and price rules.
addOnServicesstring[]
bookedFromstring
Where the booking was made, for example App, Online booking page, WhatsApp, Telegram or API.
statusstring
appointmentTypestring
notesstring
paymentStatusstring
createdAtstring
When the record was created (ISO 8601, UTC).
updatedAtstring
When the record was last changed (ISO 8601, UTC).
Request
curl -X POST "https://api.whautomate.com/v1/appointments/cancel" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"appointmentId": "FmNtn5W1AG",
"location": {
"id": "Le6dWjQF9K"
},
"cancellationReason": "Client asked to cancel."
}'
Response 200
{
"id": "FmNtn5W1AG",
"location": {
"id": "Le6dWjQF9K",
"title": "Serene Wellness Studio"
},
"client": {
"id": "FLT22gHGml",
"fullName": "Priya Nair"
},
"staff": {
"id": "XrHPepEL8A",
"name": "Wei Jie Tan"
},
"timezone": "Asia/Singapore",
"date": "2026-11-10",
"time": "09:00 AM",
"startTimeUTC": "2026-11-10T01:00:00.000Z",
"startTime": "2026-11-10T09:00:00.000Z",
"endTimeUTC": "2026-11-10T01:45:00.000Z",
"endTime": "2026-11-10T09:45:00.000Z",
"service": {
"id": "NzzoDETgKg",
"name": "Physiotherapy Consultation",
"durationMinutes": 45,
"sellingPrice": 130
},
"bookedPrice": 130,
"addOnServices": [],
"bookedFrom": "API",
"status": "Cancelled",
"appointmentType": "LOCATION_VISIT",
"notes": "Lower back pain after long runs. Reason for cancellation: Client asked to cancel.",
"paymentStatus": "",
"createdAt": "2026-10-29T12:40:16.176Z",
"updatedAt": "2026-10-29T12:40:33.133Z"
}