Limited time discount Book Smarter This Christmas
Up to 50%Off

How to manage appointments using the Amelia API

Amelia API Appointments let you create, update, retrieve, list, change status, and delete appointments from your own system (for example, when you need to sync an external CRM or custom admin panel with Amelia).

To see all available endpoints with ready-made request and response examples, download the Amelia API Postman collection: Amelia API Postman collection.

Info Note
API endpoints are available only in Elite license plans. Using the API requires coding skills and is not covered by standard plugin support.

How do I authorize requests to Amelia API endpoints?

All Amelia API endpoints use API key authorization sent through a request header named Amelia.

  • Header name: Amelia
  • Header value: your generated API key

What is the base path for Amelia API appointment endpoints?

All appointment endpoints use the same base path, and you only change the endpoint part (for example /appointments).

Base path: https://example.com/wp-admin/admin-ajax.php?action=wpamelia_api&call=/api/v1

How do I create an appointment using the Amelia API?

You can create an appointment by sending a POST request to /appointments with the appointment start date and an array of bookings.

Method: POST
Endpoint: /appointments

Required properties:

  • bookingStart (string); appointment start date and time in YYYY-MM-DD HH:mm
  • bookings (array); booking objects; each booking must include customerId of an existing customer; to create a new customer during booking, use the /bookings endpoint
  • notifyParticipants (boolean); whether customers should be notified
  • locationId (integer); location ID
  • providerId (integer); employee ID
  • serviceId (integer); service ID
  • recurring (array); recurring appointments; required if the appointment is recurring

Optional properties:

  • internalNotes (string); internal note
  • timeZone (string); customer timezone; example: Europe/Belgrade
  • lessonSpace (string); lesson space ID; if omitted a new one may be created
  • utc (boolean); whether the date time is sent in UTC; false by default

Example

				
					curl --location 'https://example.com/wp-admin/admin-ajax.php?action=wpamelia_api&call=/api/v1/appointments' \
--header 'Content-Type: application/json' \
--header 'Amelia: YOUR_API_KEY' \
--data '{
  "bookingStart": "2026-01-14 13:00",
  "bookings": [
    {
      "customFields": "{\"1\":{\"label\":\"text\",\"value\":\"\",\"type\":\"text\"}}",
      "customerId": 10,
      "duration": 1800,
      "extras": [],
      "packageCustomerId": null,
      "persons": 1,
      "status": "approved"
    }
  ],
  "internalNotes": "",
  "lessonSpace": "",
  "locationId": 2,
  "notifyParticipants": 1,
  "providerId": 1,
  "recurring": [],
  "serviceId": 1,
  "timeZone": "Europe/Belgrade",
  "utc": false
}'
				
			
				
					{
  "message": "Successfully added new appointment",
  "data": {
    "appointment": {
      "id": 742,
      "bookings": [
        {
          "id": 979,
          "customerId": 10,
          "customer": null,
          "status": "approved",
          "extras": [],
          "couponId": null,
          "price": 23,
          "coupon": null,
          "customFields": "{\"1\":{\"label\":\"text\",\"value\":\"\",\"type\":\"text\"}}",
          "info": null,
          "appointmentId": 742,
          "persons": 1,
          "token": "example-token",
          "payments": [
            {
              "id": 1000,
              "customerBookingId": 979,
              "packageCustomerId": null,
              "parentId": null,
              "amount": 0,
              "gateway": "onSite",
              "gatewayTitle": "",
              "dateTime": "2026-01-14 13:00:00",
              "status": "pending",
              "data": "",
              "entity": "appointment",
              "created": null,
              "actionsCompleted": true,
              "wcOrderId": null,
              "wcOrderUrl": null,
              "wcItemCouponValue": null,
              "wcItemTaxValue": null,
              "transactionId": null
            }
          ],
          "utcOffset": null,
          "aggregatedPrice": true,
          "isChangedStatus": true,
          "isLastBooking": null,
          "packageCustomerService": null,
          "ticketsData": [],
          "duration": 1800,
          "created": "2026-01-10 10:19:00",
          "actionsCompleted": true,
          "isUpdated": null
        }
      ],
      "notifyParticipants": 1,
      "internalNotes": "",
      "status": "approved",
      "serviceId": 1,
      "parentId": null,
      "providerId": 1,
      "locationId": 2,
      "provider": null,
      "service": null,
      "location": null,
      "googleCalendarEventId": null,
      "googleMeetUrl": null,
      "outlookCalendarEventId": null,
      "zoomMeeting": null,
      "lessonSpace": null,
      "bookingStart": "2026-01-14 13:00:00",
      "bookingEnd": "2026-01-14 13:30:00",
      "type": "appointment",
      "isRescheduled": null,
      "isFull": null,
      "resources": []
    },
    "recurring": []
  }
}

				
			

How do I update an appointment using the Amelia API?

You can update an appointment by sending a POST request to /appointments/{{appointment_id}}, and sending only the fields you want to change.

Method: POST
Endpoint: /appointments/{{appointment_id}}

Optional properties:

  • bookingStart (string); start date and time in YYYY-MM-DD HH:mm
  • bookings (array); booking objects to update
  • notifyParticipants (boolean); whether customers should be notified
  • locationId (integer); location ID
  • providerId (integer); employee ID
  • serviceId (integer); service ID
  • internalNotes (string); internal note
  • lessonSpace (string); lesson space ID
  • removedBookings (array); bookings to remove
  • recurring (array); recurring appointments; required if appointment is recurring

Important: To update the appointment status, use /appointments/status/{{appointment_id}}.

Example

				
					curl --location 'https://example.com/wp-admin/admin-ajax.php?action=wpamelia_api&call=/api/v1/appointments/742' \
--header 'Content-Type: application/json' \
--header 'Amelia: YOUR_API_KEY' \
--data '{
  "bookingStart": "2026-02-06 11:00",
  "bookings": [
    {
      "id": 979,
      "customFields": "{\"1\":{\"label\":\"text\",\"value\":\"\",\"type\":\"text\"}}",
      "customerId": 10,
      "duration": 1800,
      "extras": [],
      "packageCustomerId": null,
      "persons": 2,
      "status": "approved"
    }
  ],
  "internalNotes": "",
  "lessonSpace": "",
  "locationId": 2,
  "notifyParticipants": 1,
  "providerId": 1,
  "removedBookings": [],
  "serviceId": 1
}'
				
			
				
					{
  "message": "Successfully updated appointment",
  "data": {
    "appointment": {
      "id": 742,
      "bookings": [
        {
          "id": 979,
          "customerId": 10,
          "customer": null,
          "status": "approved",
          "extras": [],
          "couponId": null,
          "price": 23,
          "coupon": null,
          "customFields": "{\"1\":{\"label\":\"text\",\"value\":\"\",\"type\":\"text\"}}",
          "info": null,
          "appointmentId": null,
          "persons": 2,
          "token": null,
          "payments": [],
          "utcOffset": null,
          "aggregatedPrice": null,
          "isChangedStatus": false,
          "isLastBooking": null,
          "packageCustomerService": null,
          "ticketsData": [],
          "duration": 1800,
          "created": "2026-01-10 10:19:00",
          "actionsCompleted": null,
          "isUpdated": true
        }
      ],
      "notifyParticipants": 1,
      "internalNotes": "",
      "status": "approved",
      "serviceId": 1,
      "parentId": null,
      "providerId": 1,
      "locationId": 2,
      "provider": null,
      "service": null,
      "location": null,
      "googleCalendarEventId": "hlda2snvbh7llqbupsgnels3io",
      "googleMeetUrl": null,
      "outlookCalendarEventId": "example-outlook-event-id",
      "zoomMeeting": {
        "id": 76092515836,
        "startUrl": "https://zoom.example/start-url",
        "joinUrl": "https://zoom.example/join-url"
      },
      "lessonSpace": null,
      "bookingStart": "2026-02-06 11:00:00",
      "bookingEnd": "2026-02-06 11:30:00",
      "type": "appointment",
      "isRescheduled": null,
      "isFull": null,
      "resources": []
    },
    "appointmentStatusChanged": false,
    "appointmentRescheduled": false,
    "initialAppointmentDateTime": {
      "bookingStart": "2026-02-06 11:00:00",
      "bookingEnd": "2026-02-06 11:30:00"
    },
    "bookingsWithChangedStatus": [],
    "appointmentEmployeeChanged": null,
    "appointmentZoomUserChanged": false,
    "bookingAdded": false,
    "appointmentZoomUsersLicenced": false,
    "createPaymentLinks": null
  }
}
				
			

How do I update an appointment status using the Amelia API?

You can update an appointment status by sending a POST request to /appointments/status/{{appointment_id}} with the new status value.

Method: POST
Endpoint: /appointments/status/{{appointment_id}}

Required properties:

  • status (string); possible values: approved, pending, canceled, rejected, no-show
  • packageCustomerId (integer); package customer ID if the appointment belongs to a package; otherwise null

Example

				
					curl --location 'https://example.com/wp-admin/admin-ajax.php?action=wpamelia_api&call=/api/v1/appointments/status/742' \
--header 'Content-Type: application/json' \
--header 'Amelia: YOUR_API_KEY' \
--data '{
  "status": "pending",
  "packageCustomerId": null
}'
				
			
				
					{
  "message": "Successfully updated appointment status",
  "data": {
    "appointment": {
      "id": 742,
      "bookings": [
        {
          "id": 979,
          "customerId": 10,
          "customer": null,
          "status": "pending",
          "extras": [],
          "couponId": null,
          "price": 23,
          "coupon": null,
          "customFields": "{\"1\":{\"label\":\"text\",\"value\":\"\",\"type\":\"text\"}}",
          "info": null,
          "appointmentId": 742,
          "persons": 2,
          "token": null,
          "payments": [
            {
              "id": 1000,
              "customerBookingId": 979,
              "packageCustomerId": null,
              "parentId": null,
              "amount": 0,
              "gateway": "onSite",
              "gatewayTitle": "",
              "dateTime": "2026-02-06 11:00:00",
              "status": "pending",
              "data": "",
              "entity": null,
              "created": null,
              "actionsCompleted": null,
              "wcOrderId": null,
              "wcOrderUrl": null,
              "wcItemCouponValue": null,
              "wcItemTaxValue": null,
              "transactionId": null
            }
          ],
          "utcOffset": null,
          "aggregatedPrice": true,
          "isChangedStatus": false,
          "isLastBooking": null,
          "packageCustomerService": null,
          "ticketsData": [],
          "duration": 1800,
          "created": "2026-01-10 10:19:00",
          "actionsCompleted": null,
          "isUpdated": null
        }
      ],
      "notifyParticipants": 1,
      "internalNotes": "",
      "status": "pending",
      "serviceId": 1,
      "parentId": null,
      "providerId": 1,
      "locationId": 2,
      "provider": null,
      "service": null,
      "location": null,
      "googleCalendarEventId": "hlda2snvbh7llqbupsgnels3io",
      "googleMeetUrl": null,
      "outlookCalendarEventId": null,
      "zoomMeeting": null,
      "lessonSpace": null,
      "bookingStart": "2026-02-06 11:00:00",
      "bookingEnd": "2026-02-06 11:30:00",
      "type": "appointment",
      "isRescheduled": null,
      "isFull": null,
      "resources": []
    },
    "bookingsWithChangedStatus": [],
    "status": "pending",
    "oldStatus": "pending",
    "message": "Appointment status has been changed to pending"
  }
}
				
			

How do I retrieve a single appointment using the Amelia API?

You can retrieve a single appointment by sending a GET request to /appointments/{{appointment_id}}.

Method: GET
Endpoint: /appointments/{{appointment_id}}

Example

				
					curl --location 'https://example.com/wp-admin/admin-ajax.php?action=wpamelia_api&call=/api/v1/appointments/742' \
--header 'Amelia: YOUR_API_KEY'
				
			
				
					{
  "message": "Successfully retrieved appointment",
  "data": {
    "appointment": {
      "id": 742,
      "bookings": [
        {
          "id": 979,
          "customerId": 10,
          "customer": null,
          "status": "pending",
          "extras": [],
          "couponId": null,
          "price": 23,
          "coupon": null,
          "customFields": "{\"1\":{\"label\":\"text\",\"value\":\"\",\"type\":\"text\"}}",
          "info": null,
          "appointmentId": 742,
          "persons": 2,
          "token": null,
          "payments": [
            {
              "id": 1000,
              "customerBookingId": 979,
              "packageCustomerId": null,
              "parentId": null,
              "amount": 0,
              "gateway": "onSite",
              "gatewayTitle": "",
              "dateTime": "2026-02-06 11:00:00",
              "status": "pending",
              "data": "",
              "entity": null,
              "created": null,
              "actionsCompleted": null,
              "wcOrderId": null,
              "wcOrderUrl": null,
              "wcItemCouponValue": null,
              "wcItemTaxValue": null,
              "transactionId": null
            }
          ],
          "utcOffset": null,
          "aggregatedPrice": true,
          "isChangedStatus": null,
          "isLastBooking": null,
          "packageCustomerService": null,
          "ticketsData": [],
          "duration": 1800,
          "created": "2026-01-10 10:19:00",
          "actionsCompleted": null,
          "isUpdated": null
        }
      ],
      "notifyParticipants": 1,
      "internalNotes": "",
      "status": "pending",
      "serviceId": 1,
      "parentId": null,
      "providerId": 1,
      "locationId": 2,
      "provider": null,
      "service": null,
      "location": null,
      "googleCalendarEventId": "hlda2snvbh7llqbupsgnels3io",
      "googleMeetUrl": null,
      "outlookCalendarEventId": null,
      "zoomMeeting": null,
      "lessonSpace": null,
      "bookingStart": "2026-02-06 11:00:00",
      "bookingEnd": "2026-02-06 11:30:00",
      "type": "appointment",
      "isRescheduled": null,
      "isFull": null,
      "resources": []
    },
    "recurring": []
  }
}
				
			

How do I retrieve appointments within a date range using the Amelia API?

You can retrieve appointments by sending a GET request to /appointments and passing a date range and paging parameters.

Method: GET
Endpoint: /appointments

Query parameters:

  • dates (string); beginning and end date in a comma-separated format; example: 2023-05-09,2023-05-10
  • page (integer); page number; the limit is defined in settings
  • skipServices (boolean); whether to skip service details
  • skipProviders (boolean); whether to skip employee details
  • asArray (boolean); if false returns an object keyed by dates; if true returns an array

Example

				
					curl --location 'https://example.com/wp-admin/admin-ajax.php?action=wpamelia_api&call=/api/v1/appointments&dates=2026-03-10,2026-03-11&page=1&skipServices=1&skipProviders=1' \
--header 'Amelia: YOUR_API_KEY'
				
			
				
					{
  "message": "Successfully retrieved appointments",
  "data": {
    "appointments": {
      "2026-03-10": {
        "date": "2026-03-10",
        "appointments": [
          {
            "id": 151,
            "bookings": [
              {
                "id": 228,
                "customerId": 16,
                "customer": {
                  "id": 16,
                  "firstName": "John",
                  "lastName": "Doe",
                  "birthday": null,
                  "email": "john.doe@example.com",
                  "phone": null,
                  "type": "customer",
                  "status": "visible",
                  "note": null,
                  "zoomUserId": null,
                  "countryPhoneIso": null,
                  "externalId": null,
                  "pictureFullPath": null,
                  "pictureThumbPath": null,
                  "translations": null,
                  "gender": null
                },
                "status": "approved",
                "extras": [],
                "couponId": null,
                "price": 100,
                "coupon": null,
                "customFields": "{\"1\":{\"label\":\"text\",\"value\":\"\",\"type\":\"text\"}}",
                "info": null,
                "appointmentId": 151,
                "persons": 1,
                "token": null,
                "payments": [
                  {
                    "id": 269,
                    "customerBookingId": 228,
                    "packageCustomerId": null,
                    "parentId": null,
                    "amount": 0,
                    "gateway": "onSite",
                    "gatewayTitle": "",
                    "dateTime": "2026-03-10 11:00:00",
                    "status": "pending",
                    "data": "",
                    "entity": null,
                    "created": "2026-03-01 10:55:33",
                    "actionsCompleted": null,
                    "wcOrderId": null,
                    "wcOrderUrl": null,
                    "wcItemCouponValue": null,
                    "wcItemTaxValue": null
                  }
                ],
                "utcOffset": null,
                "aggregatedPrice": true,
                "isChangedStatus": null,
                "isLastBooking": null,
                "packageCustomerService": null,
                "ticketsData": [],
                "duration": 1800,
                "created": "2026-03-01 10:55:33",
                "actionsCompleted": null
              },
              {
                "id": 229,
                "customerId": 17,
                "customer": {
                  "id": 17,
                  "firstName": "Jane",
                  "lastName": "Doe",
                  "birthday": null,
                  "email": "jane.doe@example.com",
                  "phone": null,
                  "type": "customer",
                  "status": "visible",
                  "note": null,
                  "zoomUserId": null,
                  "countryPhoneIso": null,
                  "externalId": null,
                  "pictureFullPath": null,
                  "pictureThumbPath": null,
                  "translations": null,
                  "gender": null
                },
                "status": "approved",
                "extras": [],
                "couponId": null,
                "price": 100,
                "coupon": null,
                "customFields": "{\"1\":{\"label\":\"text\",\"value\":\"\",\"type\":\"text\"}}",
                "info": null,
                "appointmentId": 151,
                "persons": 1,
                "token": null,
                "payments": [
                  {
                    "id": 270,
                    "customerBookingId": 229,
                    "packageCustomerId": null,
                    "parentId": null,
                    "amount": 0,
                    "gateway": "onSite",
                    "gatewayTitle": "",
                    "dateTime": "2026-03-10 11:00:00",
                    "status": "pending",
                    "data": "",
                    "entity": null,
                    "created": "2026-03-01 10:55:58",
                    "actionsCompleted": null,
                    "wcOrderId": null,
                    "wcOrderUrl": null,
                    "wcItemCouponValue": null,
                    "wcItemTaxValue": null
                  }
                ],
                "utcOffset": null,
                "aggregatedPrice": true,
                "isChangedStatus": null,
                "isLastBooking": null,
                "packageCustomerService": null,
                "ticketsData": [],
                "duration": 1800,
                "created": "2026-03-01 10:55:58",
                "actionsCompleted": null
              }
            ],
            "notifyParticipants": 1,
            "internalNotes": "",
            "status": "approved",
            "serviceId": 2,
            "parentId": null,
            "providerId": 1,
            "locationId": 1,
            "provider": null,
            "service": null,
            "location": null,
            "googleCalendarEventId": "omia1hbnknkcha7addq7nc8aes",
            "googleMeetUrl": null,
            "outlookCalendarEventId": null,
            "zoomMeeting": {
              "id": 83025905325,
              "startUrl": "https://zoom.example/start-url",
              "joinUrl": "https://zoom.example/join-url"
            },
            "lessonSpace": null,
            "bookingStart": "2026-03-10 11:00:00",
            "bookingEnd": "2026-03-10 11:30:00",
            "type": "appointment",
            "isRescheduled": null,
            "resources": [],
            "cancelable": true,
            "reschedulable": true,
            "past": false,
            "isGroup": false
          }
        ]
      },
      "2026-03-11": {
        "date": "2026-03-11",
        "appointments": [
          {
            "id": 157,
            "bookings": [
              {
                "id": 237,
                "customerId": 2,
                "customer": {
                  "id": 2,
                  "firstName": "Alex",
                  "lastName": "Miller",
                  "birthday": null,
                  "email": "alex.miller@example.com",
                  "phone": null,
                  "type": "customer",
                  "status": "visible",
                  "note": null,
                  "zoomUserId": null,
                  "countryPhoneIso": null,
                  "externalId": null,
                  "pictureFullPath": null,
                  "pictureThumbPath": null,
                  "translations": null,
                  "gender": null
                },
                "status": "approved",
                "extras": [],
                "couponId": null,
                "price": 100,
                "coupon": null,
                "customFields": "{\"1\":{\"label\":\"text\",\"type\":\"text\",\"value\":\"\"}}",
                "info": "{\"firstName\":\"Alex\",\"lastName\":\"Miller\",\"phone\":null,\"locale\":\"en_US\",\"timeZone\":\"Europe\\/Belgrade\",\"urlParams\":null}",
                "appointmentId": 157,
                "persons": 1,
                "token": null,
                "payments": [
                  {
                    "id": 277,
                    "customerBookingId": 237,
                    "packageCustomerId": null,
                    "parentId": null,
                    "amount": 120,
                    "gateway": "wc",
                    "gatewayTitle": "Check payments",
                    "dateTime": "2026-03-02 16:32:11",
                    "status": "paid",
                    "data": "",
                    "entity": null,
                    "created": "2026-03-02 14:32:11",
                    "actionsCompleted": null,
                    "wcOrderId": 330,
                    "wcOrderUrl": null,
                    "wcItemCouponValue": null,
                    "wcItemTaxValue": 20
                  }
                ],
                "utcOffset": null,
                "aggregatedPrice": true,
                "isChangedStatus": null,
                "isLastBooking": null,
                "packageCustomerService": null,
                "ticketsData": [],
                "duration": 1800,
                "created": "2026-03-02 14:32:11",
                "actionsCompleted": null
              },
              {
                "id": 238,
                "customerId": 11,
                "customer": {
                  "id": 11,
                  "firstName": "Sarah",
                  "lastName": "Johnson",
                  "birthday": null,
                  "email": "sarah.johnson@example.com",
                  "phone": null,
                  "type": "customer",
                  "status": "visible",
                  "note": null,
                  "zoomUserId": null,
                  "countryPhoneIso": null,
                  "externalId": null,
                  "pictureFullPath": null,
                  "pictureThumbPath": null,
                  "translations": null,
                  "gender": null
                },
                "status": "approved",
                "extras": [],
                "couponId": null,
                "price": 100,
                "coupon": null,
                "customFields": "{\"1\":{\"label\":\"text\",\"type\":\"text\",\"value\":\"\"}}",
                "info": "{\"firstName\":\"Sarah\",\"lastName\":\"Johnson\",\"phone\":null,\"locale\":\"en_US\",\"timeZone\":\"Europe\\/Belgrade\",\"urlParams\":null}",
                "appointmentId": 157,
                "persons": 1,
                "token": null,
                "payments": [
                  {
                    "id": 278,
                    "customerBookingId": 238,
                    "packageCustomerId": null,
                    "parentId": null,
                    "amount": 120,
                    "gateway": "wc",
                    "gatewayTitle": "Check payments",
                    "dateTime": "2026-03-02 16:42:44",
                    "status": "paid",
                    "data": "",
                    "entity": null,
                    "created": "2026-03-02 14:42:44",
                    "actionsCompleted": null,
                    "wcOrderId": 331,
                    "wcOrderUrl": null,
                    "wcItemCouponValue": null,
                    "wcItemTaxValue": 20
                  }
                ],
                "utcOffset": null,
                "aggregatedPrice": true,
                "isChangedStatus": null,
                "isLastBooking": null,
                "packageCustomerService": null,
                "ticketsData": [],
                "duration": 1800,
                "created": "2026-03-02 14:42:44",
                "actionsCompleted": null
              }
            ],
            "notifyParticipants": 1,
            "internalNotes": "",
            "status": "pending",
            "serviceId": 2,
            "parentId": null,
            "providerId": 1,
            "locationId": 1,
            "provider": null,
            "service": null,
            "location": null,
            "googleCalendarEventId": "9v21b37kr4gsi19tabjtt97404",
            "googleMeetUrl": null,
            "outlookCalendarEventId": null,
            "zoomMeeting": null,
            "lessonSpace": null,
            "bookingStart": "2026-03-11 11:00:00",
            "bookingEnd": "2026-03-11 11:30:00",
            "type": "appointment",
            "isRescheduled": null,
            "resources": [],
            "cancelable": true,
            "reschedulable": true,
            "past": false,
            "isGroup": false
          }
        ]
      }
    },
    "availablePackageBookings": [],
    "emptyPackageBookings": [],
    "occupied": [],
    "total": 2,
    "totalApproved": 1,
    "totalPending": 1,
    "currentUser": {
      "id": null,
      "firstName": "API",
      "lastName": "Admin",
      "birthday": null,
      "email": "api.admin@example.com",
      "phone": null,
      "type": "admin",
      "status": "visible",
      "note": null,
      "zoomUserId": null,
      "countryPhoneIso": null,
      "externalId": null,
      "pictureFullPath": null,
      "pictureThumbPath": null,
      "translations": null
    }
  }
}
				
			

How do I delete an appointment using the Amelia API?

You can delete an appointment by sending a POST request to /appointments/delete/{{appointment_id}}.

Method: POST
Endpoint: /appointments/delete/{{appointment_id}}

Example

				
					curl --location --request POST 'https://example.com/wp-admin/admin-ajax.php?action=wpamelia_api&call=/api/v1/appointments/delete/173' \
--header 'Amelia: YOUR_API_KEY'
				
			
				
					{
  "message": "Successfully deleted appointment",
  "data": {
    "appointment": {
      "id": 173,
      "bookings": [
        {
          "id": 254,
          "customerId": 10,
          "customer": null,
          "status": "rejected",
          "extras": [],
          "couponId": null,
          "price": 20,
          "coupon": null,
          "customFields": "{\"1\":{\"label\":\"text\",\"value\":\"\",\"type\":\"text\"}}",
          "info": null,
          "appointmentId": 173,
          "persons": 1,
          "token": null,
          "payments": [
            {
              "id": 295,
              "customerBookingId": 254,
              "packageCustomerId": null,
              "parentId": null,
              "amount": 0,
              "gateway": "onSite",
              "gatewayTitle": "",
              "dateTime": "2026-01-22 09:00:00",
              "status": "pending",
              "data": "",
              "entity": null,
              "created": null,
              "actionsCompleted": null,
              "wcOrderId": null,
              "wcOrderUrl": null,
              "wcItemCouponValue": null,
              "wcItemTaxValue": null
            }
          ],
          "utcOffset": null,
          "aggregatedPrice": true,
          "isChangedStatus": true,
          "isLastBooking": null,
          "packageCustomerService": null,
          "ticketsData": [],
          "duration": 1800,
          "created": null,
          "actionsCompleted": null
        }
      ],
      "notifyParticipants": 1,
      "internalNotes": "",
      "status": "rejected",
      "serviceId": 1,
      "parentId": null,
      "providerId": 1,
      "locationId": 1,
      "provider": null,
      "service": null,
      "location": null,
      "googleCalendarEventId": null,
      "googleMeetUrl": null,
      "outlookCalendarEventId": null,
      "zoomMeeting": null,
      "lessonSpace": null,
      "bookingStart": "2026-01-22 09:00:00",
      "bookingEnd": "2026-01-22 09:30:00",
      "type": "appointment",
      "isRescheduled": null,
      "resources": []
    },
    "bookingsWithChangedStatus": [
      {
        "id": 254,
        "customerId": 10,
        "customer": null,
        "status": "pending",
        "extras": [],
        "couponId": null,
        "price": 20,
        "coupon": null,
        "customFields": "{\"1\":{\"label\":\"text\",\"value\":\"\",\"type\":\"text\"}}",
        "info": null,
        "appointmentId": 173,
        "persons": 1,
        "token": null,
        "payments": [
          {
            "id": 295,
            "customerBookingId": 254,
            "packageCustomerId": null,
            "parentId": null,
            "amount": 0,
            "gateway": "onSite",
            "gatewayTitle": "",
            "dateTime": "2026-01-22 09:00:00",
            "status": "pending",
            "data": "",
            "entity": null,
            "created": null,
            "actionsCompleted": null,
            "wcOrderId": null,
            "wcOrderUrl": null,
            "wcItemCouponValue": null,
            "wcItemTaxValue": null
          }
        ],
        "utcOffset": null,
        "aggregatedPrice": true,
        "isChangedStatus": true,
        "isLastBooking": null,
        "packageCustomerService": null,
        "ticketsData": [],
        "duration": 1800,
        "created": null,
        "actionsCompleted": null
      }
    ]
  }
}
				
			

What should I keep in mind when using appointment endpoints?

If you plan to use appointment endpoints in production, test requests on a staging site first and log both request and response payloads while building your integration.

  • Use the right endpoint for status: update appointment details with /appointments/{{appointment_id}}, and update status with /appointments/status/{{appointment_id}}.
  • Send only what you change: update requests can include only the fields you want to modify.
  • Respect timezone handling: if you pass timeZone and utc, keep them consistent across your integration.
  • Handle recurring carefully: if the appointment is recurring, include the recurring array as required.
  • Avoid exposing API keys: store keys securely and never ship them to the front end.