Welcome to the Acuity Scheduling
Developer Hub!

Here you'll find guides and documentation to help you start working with Acuity as quickly as possible, as well as support if you get stuck. Let's jump right in!

Suggest Edits

Quick Start

 

Get started with Acuity's API quickly with an example in bash, PHP or JavaScript.

Authentication

Find your API credentials in Acuity under Integrations.

Authentication to the API is done over SSL with HTTP Basic Auth, using your numeric User ID for the username and your API Key for the password. 401 Unauthorized will be returned on authentication failure.

For information on connecting multiple Acuity accounts to your app, check out OAuth2 access.

Example

curl -u ACUITY_USER_ID:ACUITY_API_KEY "https://acuityscheduling.com/api/v1/appointments"
var Acuity = require('acuityscheduling');

var acuity = Acuity.basic({
  userId: ACUITY_USER_ID,
  apiKey: 'ACUITY_API_KEY'
});

acuity.request('appointments', function (err, res, appointments) {
  if (err) return console.error(err);
  console.log(appointments);
});
<?php
require_once('vendor/autoload.php');

$acuity = new AcuityScheduling(array(
  'userId' => ACUITY_USER_ID,
  'apiKey' => 'ACUITY_API_KEY'
));

$appointments = $acuity->request('appointments');
print_r($appointments);
<?php

$userID = 'ACUITY_USER_ID';
$key = 'ACUITY_API_KEY';

// URL for all appointments (just an example):
$url = 'https://acuityscheduling.com/api/v1/appointments.json';

// Initiate curl:
// GET request, so no need to worry about setting post vars:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);

// Grab response as string:
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// HTTP auth:
curl_setopt($ch, CURLOPT_USERPWD, "$userID:$key");

// Execute request:
$result = curl_exec($ch);

// Don't forget to close the connection!
curl_close($ch);

$data = json_decode($result, true);
print_r($data);

Making Cross Origin Requests and Using AJAX

You must make API requests from your own or an external server where you can store your API credentials securely. Acuity does not support cross origin requests as client side requests expose any authentication that you're using. You can expose specific endpoints on your server for the APIs you'd like to access over AJAX.

Suggest Edits

/appointments

Get a list of appointments currently scheduled for the authenticated user.

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://acuityscheduling.com/api/v1/appointments
curl -u ACUITY_USER_ID:ACUITY_API_KEY "https://acuityscheduling.com/api/v1/appointments?max=25&calendarID=27238"
A binary file was returned
[{
	"id": 54321,
	"firstName": "Bob",
	"lastName": "McTest",
	"phone": "",
	"email": "bob.mctest@example.com",
	"date": "June 17, 2013",
	"time": "10:15am",
	"endTime": "11:15am",
  "dateCreated": "July 2, 2013",
  "datetime": "2013-07-02T10:15:00-0700",
	"price": "10.00",
	"paid": "no",
  "amountPaid": "0.00",
	"type": "Regular Visit",
  "appointmentTypeID": 1,
  "classID": null,
	"duration": "60",
	"calendar": "My Calendar",
	"calendarID": 27238,
  "certificate": null,
	"confirmationPage": "https://acuityscheduling.com/schedule.php?owner=11145481&id[]=1220aa9f41091c50c0cc659385cfa1d0&action=appt",
	"formsText": "...",
	"notes": "Notes",
	"timezone": "America/New_York",
	"forms": [
		{
			"id": 1,
			"name": "Example Intake Form",
			"values": [
				{
					"value": "yes",
					"name": "Is this your first visit?",
					"fieldID": 1,
					"id": 21502993
				},
				{
					"value": "Ninja",
					"name": "What is your goal for this appointment?",
					"fieldID": 2,
					"id": 21502994
				}
			]
		}
	]
},
{
	"id": 2051308,
	"firstName": "Eve",
	"lastName": "Cooper",
	"phone": "1231231234",
	"email": "eve@example.com",
	"date": "June 24, 2013",
  "datetime": "2013-06-24T09:00:00-0700",
	"time": " 9:00am",
	"endTime": "10:00am",
	"price": "0.00",
	"paid": "no",
	"type": "Another Type",
  "appointmentTypeID": 2,
  "classID": 1,
	"duration": "60",
	"calendar": "My Calendar",
	"calendarID": 27238,
	"confirmationPage": "https://acuityscheduling.com/schedule.php?owner=11145481&id[]=3320aa9f41091c50c0cc659385cfa1d0&action=appt",
	"formsText": "...",
	"notes": "Notes",
	"timezone": "America/New_York",
	"forms": []
}]
{"status_code": 401, "message": "Unauthorized", "error": "unauthorized"}

Query Params

max
int32

maximum number of results

minDate
date

only get appointments this date and after

maxDate
date

only get appointments this date and before

calendarID
int32

show only appointments on calendar with specified ID

appointmentTypeID
int32

show only appointments of this type

canceled
boolean

get canceled appointments

firstName
string

filter appointments for client first name

lastName
string

filter appointments for client last name

email
string

filter appointments for client e-mail address

phone
string

filter appointments for client phone

field:id
string

filter appointments matching a particular field eg. ?field:1234=Hello

 

Canceled Appointments

By default, canceled appointments are not returned. To retrieve canceled appointments, use the query ?canceled=true. Canceled appointment responses include a noShow field which is true if the admin has marked the appointment as a no-show, and false if the appointment is simply canceled.

Suggest Edits

/appointments

Create an appointment.

 

Basic Auth

 Authentication is required for this endpoint.
posthttps://acuityscheduling.com/api/v1/appointments
POST "https://acuityscheduling.com/api/v1/appointments"

{
  "datetime": "2016-02-03T14:00:00-0800",
  "appointmentTypeID": 1,
  "firstName": "Bob",
  "lastName": "McTest",
  "email": "bob.mctest@example.com",
  "certificate": "ABC123",
  "fields": [
    {"id": 1, "value": "Party time!"}
  ]
}
var Acuity = require('acuityscheduling');

var acuity = Acuity.basic({
  userId: ACUITY_USER_ID,
  apiKey: 'ACUITY_API_KEY'
});

// Create appontment options:
var options = {
  method: 'POST',
  body: {
    appointmentTypeID : 1,
    datetime          : '2016-04-01T09:00',
    firstName         : 'Bob',
    lastName          : 'McTest',
    email             : 'bob.mctest@example.com'
  }
};

// Make the create appointment request:
acuity.request('/appointments', options, function (err, res, appointment) {
  if (err) return console.error(err);
  console.log(appointment);
});
<?php
require_once('vendor/autoload.php');
$acuity = new AcuityScheduling(array(
  'userId' => ACUITY_USER_ID,
  'apiKey' => 'ACUITY_API_KEY'
));
// Make the create-appointment request:
$appointment = $acuity->request('/appointments', array(
  'method' => 'POST',
  'data' => array(
    'appointmentTypeID' => 274497,
    'datetime'          => '2016-04-01T09:00',
    'firstName'         => 'Bob',
    'lastName'          => 'McTest',
    'email'             => 'bob.mctest@example.com'
  )
));
print_r($appointment);
A binary file was returned
{
  "id": 31991639,
  "firstName": "Bob",
  "lastName": "McTest",
  "phone": "",
  "email": "bob.mctest@example.com",
  "date": "February 3, 2016",
  "time": "2:00pm",
  "endTime": "3:00pm",
  "dateCreated": "February 2, 2016",
  "datetime": "2016-02-03T14:00:00-0800",
  "price": "0.00",
  "paid": "no",
  "amountPaid": "0.00",
  "type": "Regular Visit",
  "appointmentTypeID": 1,
  "classID": null,
  "category": "",
  "duration": "60",
  "calendar": "My Calendar",
  "calendarID": 1,
  "certificate": "ABC123",
  "confirmationPage": "https://www.acuityscheduling.com/schedule.php?action=appt&owner=11145481&id[]=1220aa9f41091c50c0cc659385cfa1d0",
  "formsText": "...",
  "forms": [],
  "notes": "",
  "timezone": "America/Los_Angeles"
}
{
    "status_code": 400,
    "message": "We could not find an available calendar.",
    "error": "no_available_calendar"
}

Body Params

datetime
date
required

Required date and time for the appointment, parsed by strtotime in the business timezone.

appointmentTypeID
int32
required

Appointment type id.

calendarID
int32

Calendar ID. If not provided we'll try to find an available calendar automatically.

firstName
string
required

Client first name.

lastName
string
required

Client last name.

email
string
required

Client e-mail address. Optional for admins.

phone
string

Client phone number, may be required in account settings. Optional for admins.

timezone
string

Client timezone.

certificate
string

Package or coupon certificate code.

fields
array

A special field for setting form field values.

notes
string

Settable when booking as an admin.

addonIDs
int32

ID of the addon(s) to be included in the scheduled appointment

 

Availability

When creating appointments, availability and forms are validated as if the appointment is being booked by a client by default. Use /availability/dates and /availability/times or /availability/classes to find available slots for an appointment type.

Booking as an Admin

admin=true

By default appointments are created as if they are being booked by a client. Booking as an admin disables availability and attribute validations, and allows setting the notes attribute. To book as an admin pass the query parameter admin=true.

POST "https://acuityscheduling.com/api/v1/appointments?admin=true"

{
  "datetime": "2016-02-03T14:00:00-0800",
  "appointmentTypeID": 1,
  "firstName": "Bob",
  "lastName": "McTest",
  "notes": "My notes."
}

Setting Forms

Form data may be set using the special fields attribute. The fields are an array of field ID and value objects, {"id": fieldId, "value": fieldValue}.

Field IDs can be found in the GET /forms API or by editing the form in Acuity and inspecting the fields by right clicking the field and choosing "Inspect".

Values for the multi-valued field checkboxlist should be submitted as a single comma-delimited string.

POST "https://acuityscheduling.com/api/v1/appointments"

{
  "datetime": "2016-02-03T14:00:00-0800",
  "appointmentTypeID": 1,
  "firstName": "Bob",
  "lastName": "McTest",
  "email": "bob.mctest@example.com",
  "fields": [
    {"id": 1, "value": "Party time!"}
  ]
}

Certificates

Book appointments using coupons and package codes by setting the certificate attribute.

We'll check that the certificate is valid and may be applied to the appointment type before scheduling, but you can validate certificates ahead of time using the /certificates/check endpoint. Try out the /certificates endpoint to suggest certificates for a particular client.

Addons

Addons can add time and duration to an appointment before it is booked. Use /appointments-addons in order to retrieve the list of addons and their IDs before including the list of addonIDs in the POST appointment body while scheduling.

There are other availability considerations to factor in before using addonIDs when creating an appointment. Click here to for more details.

No Email

Don't send the confirmation e-mails or SMS by creating the appointment with the noEmail=true query parameter.

Errors

Availability and validation errors return a 400 error response:

{
  "status_code": 400,
  "message": "Attribute \"firstName\" is required.",
  "error": "required_first_name"
}

Each error has an error code and a human readable message describing what went wrong.

Error Message
required_first_name Attribute "firstName" is required.
required_last_name Attribute "lastName" is required.
required_email Attribute "email" is required.
invalid_email Invalid "email" attribute value.
invalid_fields The field "1" does not exist on this appointment.
required_field The field "4" is required.
required_appointment_type_id The parameter "appointmentTypeID" is required.
invalid_appointment_type The appointment type "987654321" does not exist.
invalid_calendar The calendar "987654321" does not exist.
required_datetime The parameter "datetime" is required.
invalid_timezone Invalid timezone "Aint/No_Timezone".
invalid_datetime The datetime "asdf" is invalid.
no_available_calendar We could not find an available calendar.
not_available_min_hours_in_advance The time "2016-01-05T16:00:00-0800" is not far enough in advance.
not_available_max_days_in_advance The time "2017-02-07T16:00:00" is too far in advance.
not_available The time "2016-03-08T05:00:00-0800" is not an available time slot.
invalid_certificate The certificate "NOCODENOPROBLEM" is invalid.
expired_certificate The certificate "EXPIRED" is expired.
certificate_uses The certificate "8013DA6F" has no remaining uses for appointment type "1".
invalid_certificate_type The certificate "E5E5325C" is invalid for appointment type "5".
Suggest Edits

/appointments/:id

Get a single appointment by ID.

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://acuityscheduling.com/api/v1/appointments/id
curl -u ACUITY_USER_ID:ACUITY_API_KEY "https://acuityscheduling.com/api/v1/appointments/54321"
A binary file was returned
{
	"id": 54321,
	"firstName": "Bob",
	"lastName": "McTest",
	"phone": "",
	"email": "bob.mctest@example.com",
	"date": "June 17, 2013",
	"time": "10:15am",
	"endTime": "11:15am",
  "dateCreated": "July 2, 2013",
  "datetime": "2013-06-17T10:15:00-0700",
	"price": "10.00",
	"paid": "no",
  "amountPaid": "0.00",
	"type": "Regular Visit",
  "appointmentTypeID": 1,
  "classID": null,
	"duration": "60",
	"calendar": "My Calendar",
	"calendarID": 27238,
  "certificate": null,
	"confirmationPage": "https://acuityscheduling.com/schedule.php?owner=11145481&id[]=1220aa9f41091c50c0cc659385cfa1d0&action=appt",
	"formsText": "...",
	"notes": "Notes",
	"timezone": "America/New_York",
  "scheduledBy": null,
	"forms": [
		{
			"id": 1,
			"name": "Example Intake Form",
			"values": [
				{
					"value": "yes",
					"name": "Is this your first visit?",
					"fieldID": 1,
					"id": 21502993
				},
				{
					"value": "Ninja",
					"name": "What is your goal for this appointment?",
					"fieldID": 2,
					"id": 21502994
				}
			]
		}
	]
}
{"status_code":401,"message":"Unauthorized"}

Path Params

id
int32
required

Appointment ID

 

Canceled Appointments

Canceled appointments include a field, noShow which is true if the appointment was marked as a no-show by an admin and false if the appointment is simply canceled.

The scheduledBy field contains the username of the user or logged in client who scheduled the appointment. If an appointment was scheduled by a client not logged in, it will be null.

Suggest Edits

/appointments/:id

Update an appointment details from a white-list of updatable attributes.

 

Basic Auth

 Authentication is required for this endpoint.
puthttps://acuityscheduling.com/api/v1/appointments/id
PUT "https://acuityscheduling.com/api/v1/appointments/1"

{
  "firstName": "Test",
  "fields": [
    {
      "id": 1,
      "value": "My field value."
    }
  ]
}
var Acuity = require('acuityscheduling');

var acuity = Acuity.basic({
  userId: ACUITY_USER_ID,
  apiKey: 'ACUITY_API_KEY'
});

// Create appontment options:
var options = {
  method: 'PUT',
  body: {
    firstName : 'Bob',
    lastName  : 'McUpdate'
  }
};

// Make the update appointment request:
var appointmentID = 1;
acuity.request('/appointments/'+appointmentID, options, function (err, res, appointment) {
  if (err) return console.error(err);
  console.log(appointment);
});
<?php
require_once('vendor/autoload.php');

$acuity = new AcuityScheduling(array(
  'userId' => ACUITY_USER_ID,
  'apiKey' => 'ACUITY_API_KEY'
));

// Make the update appointment request:
$appointmentID = 1;
$appointment = $acuity->request('/appointments/'.$appointmentID, array(
  'method' => 'PUT',
  'data' => array(
    'firstName' => 'Bob',
    'lastName'  => 'McUpdate'
  )
));
print_r($appointment);
A binary file was returned
{
	"id": 54321,
	"firstName": "Bob",
	"lastName": "McTest",
	"phone": "",
	"email": "bob.mctest@example.com",
	"date": "June 17, 2013",
	"time": "10:15am",
	"endTime": "11:15am",
  "dateCreated": "July 2, 2013",
  "datetime": "2013-06-17T10:15:00-0700",
	"price": "10.00",
	"paid": "no",
  "amountPaid": "0.00",
	"type": "Regular Visit",
  "appointmentTypeID": 1,
  "classID": null,
	"duration": "60",
	"calendar": "My Calendar",
	"calendarID": 27238,
  "certificate": null,
	"confirmationPage": "https://acuityscheduling.com/schedule.php?owner=11145481&id[]=1220aa9f41091c50c0cc659385cfa1d0&action=appt",
	"formsText": "...",
	"notes": "Notes",
	"timezone": "America/New_York",
	"forms": [
		{
			"id": 1,
			"name": "Example Intake Form",
			"values": [
				{
					"value": "yes",
					"name": "Is this your first visit?",
					"fieldID": 1,
					"id": 21502993
				},
				{
					"value": "Ninja",
					"name": "What is your goal for this appointment?",
					"fieldID": 2,
					"id": 21502994
				}
			]
		}
	]
}

Path Params

id
int32
required

Appointment ID

Body Params

firstName
string

Client first name, may not be removed.

lastName
string

Client last name, may not be removed.

email
string

Client email. May not be removed for clients, optional for admins.

phone
string

Client phone. May not be removed for clients depending on account settings, optional for admins.

certificate
string

Package or coupon certificate code.

fields
array

A special field for updating form field values.

notes
string

May only be set by admins. Learn more about booking as an admin.

 

Updatable Attributes White-list

Attributes not included in the request body or not on the white-list will be ignored. Appointments can be rescheduled and canceled with separate APIs.

  • firstName
  • lastName
  • phone
  • email
  • notes
  • fields

It is only necessary to send the attributes you would like to update, but required attributes such as firstName and lastName may not be cleared.

Updating Forms

Form data may be updated using the special fields attribute. The fields are an array of field ID and value objects, {"id": fieldId, "value": fieldValue}.

Field IDs can be found in the GET /forms API or by editing the form in Acuity and inspecting the fields by right clicking the field and choosing "Inspect".

Values for the multi-valued field checkboxlist should be submitted as a single comma-delimited string.

PUT "https://acuityscheduling.com/api/v1/appointments/1"

{
  "fields": [
    {
      "id": 1,
      "value": "My field value."
    }
  ]
}

Updating as an Admin

admin=true

By default appointments are updated as if they are being edited by a client. Updating an appointment as an admin allows setting the "notes" field and disables attribute validations. To book as an admin pass the query parameter admin=true.

PUT "https://acuityscheduling.com/api/v1/appointments/1?admin=true"

{
  "notes": "These are my notes."
}
Suggest Edits

/appointments/:id/cancel

Cancel an appointment.

 

Basic Auth

 Authentication is required for this endpoint.
puthttps://acuityscheduling.com/api/v1/appointments/id/cancel
PUT "https://acuityscheduling.com/api/v1/appointments/1/cancel"

{
}
var Acuity = require('acuityscheduling');

var acuity = Acuity.basic({
  userId: ACUITY_USER_ID,
  apiKey: 'ACUITY_API_KEY'
});

// Create appontment options:
var options = {
  method: 'PUT',
  body: {
    cancelNote: 'The bridge is out!'
  }
};

// Make the cancel appointment request:
var appointmentID = 1;
acuity.request('/appointments/' + appointmentID + '/cancel', options, function (err, res, appointment) {
  if (err) return console.error(err);
  console.log(appointment);
});
<?php
require_once('vendor/autoload.php');

$acuity = new AcuityScheduling(array(
  'userId' => ACUITY_USER_ID,
  'apiKey' => 'ACUITY_API_KEY'
));

// Make the cancel-appointment request:
$appointmentID = 1;
$appointment = $acuity->request('/appointments/'.$appointmentID.'/cancel', array(
  'method' => 'PUT',
  'data' => array(
    'cancelNote' => 'The bridge is out!'
  )
));
print_r($appointment);
A binary file was returned
{
	"id": 1,
	"firstName": "Bob",
	"lastName": "McTest",
	"phone": "",
	"email": "bob.mctest@example.com",
	"date": "June 17, 2013",
	"time": "10:15am",
	"endTime": "11:15am",
  "dateCreated": "July 2, 2013",
  "datetime": "2013-06-17T10:15:00-0700",
	"price": "10.00",
	"paid": "no",
  "amountPaid": "0.00",
	"type": "Regular Visit",
  "appointmentTypeID": 1,
  "classID": null,
	"duration": "60",
	"calendar": "My Calendar",
	"calendarID": 1,
  "certificate": null,
	"confirmationPage": "https://acuityscheduling.com/schedule.php?owner=11145481&id[]=1220aa9f41091c50c0cc659385cfa1d0&action=appt",
	"formsText": "...",
	"notes": "Notes",
	"timezone": "America/New_York",
	"forms": [
		{
			"id": 1,
			"name": "Example Intake Form",
			"values": [
				{
					"value": "yes",
					"name": "Is this your first visit?",
					"fieldID": 1,
					"id": 21502993
				},
				{
					"value": "Ninja",
					"name": "What is your goal for this appointment?",
					"fieldID": 2,
					"id": 21502994
				}
			]
		}
	],
  "noShow": false
}

Path Params

id
int32
required

Appointment ID

Body Params

cancelNote
string

A message to send with cancellation notifications.

noShow
boolean

Whether the appointment was a no show, settable by admins.

 

Cancel an appointment using this endpoint. Once canceled, appointments will have a noShow attribute. This attribute may be updated, but it isn't possible to un-cancel the appointment.

Cancel as an Admin

?admin=true

By default appointments are canceled as a client. Canceling an appointment as an admin allows setting the "noShow" field and disables cancellation rules. To cancel as an admin pass the query parameter admin=true.

No Email

Skip sending the cancellation e-mail and SMS by canceling the appointment with the noEmail=true query parameter.

Errors

Validation errors return a 400 error response:

{
  "status_code": 400,
  "message": "Clients are not allowed to cancel.",
  "error": "cancel_not_allowed"
}
Error Message
cancel_not_allowed Clients are not allowed to cancel.
cancel_too_close Clients are not allowed to cancel this close to the time of the appointment.
Suggest Edits

/appointments/:id/reschedule

Reschedule an appointment.

 

Basic Auth

 Authentication is required for this endpoint.
puthttps://acuityscheduling.com/api/v1/appointments/id/reschedule
PUT "https://acuityscheduling.com/api/v1/appointments/1/reschedule"

{
  "datetime": "2016-02-03T14:00:00-0800",
}
var Acuity = require('acuityscheduling');

var acuity = Acuity.basic({
  userId: ACUITY_USER_ID,
  apiKey: 'ACUITY_API_KEY'
});

// Create appontment options:
var options = {
  method: 'PUT',
  body: {
    datetime : '2016-04-01T09:00'
  }
};

// Make the reschedule-appointment request:
var appointmentID = 1;
acuity.request('/appointments/' + appointmentID + '/reschedule', options, function (err, res, appointment) {
  if (err) return console.error(err);
  console.log(appointment);
});
<?php
require_once('vendor/autoload.php');

$acuity = new AcuityScheduling(array(
  'userId' => ACUITY_USER_ID,
  'apiKey' => 'ACUITY_API_KEY'
));

// Make the reschedule-appointment request:
$appointmentID = 1;
$appointment = $acuity->request('/appointments/'.$appointmentID.'/reschedule', array(
  'method' => 'PUT',
  'data' => array(
    'datetime' => '2016-04-01T09:00'
  )
));
print_r($appointment);
A binary file was returned
{
	"id": 1,
	"firstName": "Bob",
	"lastName": "McTest",
	"phone": "",
	"email": "bob.mctest@example.com",
	"date": "June 17, 2013",
	"time": "10:15am",
	"endTime": "11:15am",
  "dateCreated": "July 2, 2013",
  "datetime": "2016-02-03T14:00:00-0800",
	"price": "10.00",
	"paid": "no",
  "amountPaid": "0.00",
	"type": "Regular Visit",
  "appointmentTypeID": 1,
  "classID": null,
	"duration": "60",
	"calendar": "My Calendar",
	"calendarID": 1,
  "certificate": null,
	"confirmationPage": "https://acuityscheduling.com/schedule.php?owner=11145481&id[]=1220aa9f41091c50c0cc659385cfa1d0&action=appt",
	"formsText": "...",
	"notes": "Notes",
	"timezone": "America/New_York",
	"forms": [
		{
			"id": 1,
			"name": "Example Intake Form",
			"values": [
				{
					"value": "yes",
					"name": "Is this your first visit?",
					"fieldID": 1,
					"id": 21502993
				},
				{
					"value": "Ninja",
					"name": "What is your goal for this appointment?",
					"fieldID": 2,
					"id": 21502994
				}
			]
		}
	]
}

Path Params

id
int32
required

Appointment ID

Body Params

datetime
date
required

Required date and time for the appointment, parsed by strtotime in the business timezone.

calendarID
int32

Calendar ID to reschedule to. If not provided we'll leave the appointment on the same calendar. Submit null and we'll try to find an available calendar automatically.

 

Reschedule an appointment to a different date or calendar. Or both!

To reschedule to an overlapping time, get availability using the ignoreAppointmentIDs[] argument for /availability/times with the current appointment's ID.

Reschedule as an Admin

admin=true

By default appointments are reschedule as if by a client. Rescheduling as an admin disables availability validations. To reschedule as an admin pass the query parameter admin=true.

No Email

Skip sending the rescheduling e-mail and SMS by rescheduling the appointment with the noEmail=true query parameter.

Errors

Availability errors return a 400 error response:

{
  "status_code": 400,
  "message": "Class series may not be rescheduled.",
  "error": "reschedule_series"
}
Error Message
reschedule_not_allowed Clients are not allowed to reschedule.
reschedule_too_close Clients are not allowed to reschedule this close to the time of the appointment.
reschedule_series Class series may not be rescheduled.
reschedule_canceled Canceled appointments may not be rescheduled.
invalid_calendar The calendar "987654321" does not exist.
required_datetime The parameter "datetime" is required.
invalid_timezone Invalid timezone "Aint/No_Timezone".
invalid_datetime The datetime "asdf" is invalid.
not_available_min_hours_in_advance The time "2016-01-05T16:00:00-0800" is not far enough in advance.
not_available_max_days_in_advance The time "2017-02-07T16:00:00" is too far in advance.
not_available The time "2016-03-08T05:00:00-0800" is not an available time slot.
Suggest Edits

/appointments/:id/payments

Retrieve a list of payment transactions for a particular appointment.

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://acuityscheduling.com/api/v1/appointments/id/payments
curl --request GET \
  --url https://acuityscheduling.com/api/v1/appointments/id/payments
var request = require("request");

var options = { method: 'GET',
  url: 'https://acuityscheduling.com/api/v1/appointments/id/payments' };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});
require 'uri'
require 'net/http'

url = URI("https://acuityscheduling.com/api/v1/appointments/id/payments")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)

response = http.request(request)
puts response.read_body
var data = JSON.stringify(false);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://acuityscheduling.com/api/v1/appointments/id/payments");

xhr.send(data);
import requests

url = "https://acuityscheduling.com/api/v1/appointments/id/payments"

response = requests.request("GET", url)

print(response.text)
A binary file was returned
[
  {
    "transactionID": "ch_123456abcdef",
    "created": "2016-01-22T09:27:51-0800",
    "processor": "stripe",
    "amount": "300.00"
  }
]

Path Params

id
int32
required

Appointment ID

 

Response Fields

Field
Description

transactionID

The 3rd party processor transaction ID.

created

The date the transaction was created.

processor

The key for the processor: stripe, paypal, paypal_pro, braintree or authorizenet.

amount

The amount of the processed transaction.

Suggest Edits

/appointment-types

Return appointment types.

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://acuityscheduling.com/api/v1/appointment-types
curl -u ACUITY_USER_ID:ACUITY_API_KEY "https://acuityscheduling.com/api/v1/appointment-types"
A binary file was returned
[
  {
    "id": 5,
    "name": "Lego Party",
    "description": "",
    "duration": 150,
    "price": "200.00",
    "category": "Parties",
    "color": "#E3DE7D",
    "private": false,
    "type": "service",
    "classSize": null,
    "paddingAfter": 0,
    "paddingBefore": 0,
    "calendarIDs": [
      1
    ]
  },
  {
    "id": 8,
    "name": "Become a Better Builder",
    "description": "",
    "duration": 30,
    "price": "0.00",
    "category": "Classes",
    "color": "#469D6E",
    "private": false,
    "type": "class",
    "classSize": 8,
    "paddingAfter": 0,
    "paddingBefore": 0,
    "calendarIDs": [
      1,
      2
    ]
  },
  {
    "id": 10,
    "name": "Private Builder Class",
    "description": "",
    "duration": 30,
    "price": "0.00",
    "category": "Classes",
    "color": "#469D6E",
    "private": true,
    "type": "class",
    "classSize": 8,
    "paddingAfter": 0,
    "paddingBefore": 0,
    "calendarIDs": [
      1
    ]
  },
  {
    "id": 11,
    "name": "Become a Better Builder Series",
    "description": "",
    "duration": 60,
    "price": "0.00",
    "category": "Classes",
    "color": "#469D6E",
    "private": false,
    "type": "series",
    "classSize": 8,
    "paddingAfter": 0,
    "paddingBefore": 0,
    "calendarIDs": [
      1
    ]
  }
]
{"status_code":401,"message":"Unauthorized"}

Query Params

deleted
boolean

Retrieve deleted appointment types.

 

Response Fields

Field
Description

id

appointment type ID

name

the name of the appointment type

description

the description of the appointment type

duration

the duration in minutes

price

the price in the account's currency

category

the category of the appointment type

color

the color of the appointment type

private

whether or not the appointment type is a private type

type

the kind of appointment type: service, class or series (a series is a class which the client should book all times offered)

classSize

for a class or series the maximum class size, null otherwise

paddingAfter

the post-appointment padding in minutes

paddingBefore

the pre-appointment padding in minutes

calendarIDs

the IDs of calendars this type is offered on

Suggest Edits

/availability/dates

Return dates with availability for a month and an appointment type.

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://acuityscheduling.com/api/v1/availability/dates
curl -u ACUITY_USER_ID:ACUITY_API_KEY "https://acuityscheduling.com/api/v1/availability/dates?appointmentTypeID=123&month=2016-02&calendarID=123&timezone=Europe/London"
A binary file was returned
[
  {
    "date": "2016-02-04"
  },
  {
    "date": "2016-02-05"
  },
  {
    "date": "2016-02-06"
  },
  {
    "date": "2016-02-07"
  },
  {
    "date": "2016-02-11"
  },
  {
    "date": "2016-02-12"
  },
  {
    "date": "2016-02-13"
  },
  {
    "date": "2016-02-14"
  },
  {
    "date": "2016-02-18"
  },
  {
    "date": "2016-02-19"
  },
  {
    "date": "2016-02-20"
  },
  {
    "date": "2016-02-21"
  },
  {
    "date": "2016-02-25"
  },
  {
    "date": "2016-02-26"
  },
  {
    "date": "2016-02-27"
  },
  {
    "date": "2016-02-28"
  }
]
{
  "error": "required_month",
  "message": "The parameter \"month\" is required.",
  "status_code": 400
}

Query Params

month
string
required

Month to check available dates (must be parsable by strtotime, eg. 2016-02).

appointmentTypeID
int32
required

Numeric id of the appointment type to check availability for.

calendarID
int32

Numeric id of the calendar to check availability for. By default, check availability for all calendars the appointment type is offered on.

timezone
string

Long timezone id for availability time converison (eg. America/New_York).

 

This endpoint returns an appointment type's available dates for a particular month. These dates are the same as those shown to the client through the client scheduling page.

Use /availability/dates together with /availability/times to find available slots for creating an appointment.

Suggest Edits

/availability/times

Return available times for a date and appointment type.

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://acuityscheduling.com/api/v1/availability/times
curl -u ACUITY_USER_ID:ACUITY_API_KEY "https://acuityscheduling.com/api/v1/availability/times?appointmentTypeID=123&calendarID=123&date=2016-02-04"
A binary file was returned
[
  {
    "time": "2016-02-04T13:00:00-0800"
  },
  {
    "time": "2016-02-04T14:00:00-0800"
  },
  {
    "time": "2016-02-04T15:00:00-0800"
  },
  {
    "time": "2016-02-04T16:00:00-0800"
  },
  {
    "time": "2016-02-04T17:00:00-0800"
  },
  {
    "time": "2016-02-04T18:00:00-0800"
  },
  {
    "time": "2016-02-04T19:00:00-0800"
  },
  {
    "time": "2016-02-04T20:00:00-0800"
  },
  {
    "time": "2016-02-04T21:00:00-0800"
  }
]
{
  "error": "required_date",
  "message": "The parameter \"date\" is required.",
  "status_code": 400
}

Query Params

date
string
required

Date to check available times (must be parsable by strtotime).

appointmentTypeID
int32
required

Numeric id of the appointment type to check availability for.

calendarID
int32

Numeric id of the calendar to check availability for. By default, check availability for all calendars the appointment type is offered on.

timezone
string

Long timezone id for availability time converison (eg. America/New_York).

ignoreAppointmentIDs[]
int32

Appointment IDs to ignore, allowing slots overlapping the appointment and useful for rescheduling.

 

This endpoint returns an appointment type's available time slots for a particular date. These times are the same as those shown to the client through the client scheduling page.

Use /availability/times together with /availability/dates to find available slots for creating an appointment.

Suggest Edits

/availability/classes

Return available classes for a given month.

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://acuityscheduling.com/api/v1/availability/classes
curl -u ACUITY_USER_ID:ACUITY_API_KEY "https://acuityscheduling.com/api/v1/availability/classes?month=2016-02"
A binary file was returned
[
  {
    "id": 1,
    "appointmentTypeID": 8,
    "calendarID": 2,
    "name": "Become a Better Builder",
    "time": "2016-02-10T18:00:00-0800",
    "calendar": "More Calendar",
    "duration": 30,
    "isSeries": false,
    "slots": 8,
    "slotsAvailable": 8
  },
  {
    "id": 2,
    "appointmentTypeID": 8,
    "calendarID": 2,
    "name": "Become a Better Builder",
    "time": "2016-02-17T18:00:00-0800",
    "calendar": "More Calendar",
    "duration": 30,
    "isSeries": false,
    "slots": 8,
    "slotsAvailable": 8
  }
]
{
  "error": "invalid_month",
  "message": "The month \"\" is invalid.",
  "status_code": 400
}

Query Params

month
string
required

Month to check available dates (must be parsable by strtotime, eg. 2016-02).

appointmentTypeID
int32

Numeric id of the appointment type to check availability for. By default, check availability for all class appointment types.

calendarID
int32

Numeric id of the calendar to check availability for. By default, check availability for all calendars the appointment type is offered on.

timezone
string

Long timezone id for availability time converison (eg. America/New_York).

includeUnavailable
boolean

List all classes for the month, including those that are no longer available.

 

Response Fields

Field
Description

appointmentTypeID

the ID of the appointment type of the class offering

calendarID

the ID of the calendar the class is offered on

name

the name of the appointment type

time

the time of the class offering

calendar

the name of the calendar

duration

the duration of the class in minutes

isSeries

whether or not the class is a series (a series is a class which the client should book all times offered)

slots

the maximum number of attendees in the class

slotsAvailable

the remaining slots still available

Use /availability/classes to display class schedules, or for creating an appointment.

Suggest Edits

/blocks

Get a list of blocks for the authenticated user.

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://acuityscheduling.com/api/v1/blocks
curl -u ACUITY_USER_ID:ACUITY_API_KEY "https://acuityscheduling.com/api/v1/blocks?max=25"
A binary file was returned
[
  {
    "description": "Every Wednesday 11:00am to 12:00pm starting  8 July 2015 ending 29 July 2015",
    "until": "2015-07-29T12:00:00-0700",
    "recurring": "weekly",
    "notes": "Recurring blocked time.",
    "end": "2015-07-08T12:00:00-0700",
    "start": "2015-07-08T11:00:00-0700",
    "calendarID": 1,
    "id": 4
  },
  {
    "description": "Wednesday  1 July 2015 11:00am - 12:00pm",
    "until": null,
    "recurring": null,
    "notes": "Blocked time.",
    "end": "2015-07-01T12:00:00-0700",
    "start": "2015-07-01T11:00:00-0700",
    "calendarID": 1,
    "id": 1
  },
  {
    "description": "Tuesday 30 June 11:00am -  1 Jul 2015 12:00pm",
    "until": null,
    "recurring": null,
    "notes": "Blocked time.",
    "end": "2015-07-01T12:00:00-0700",
    "start": "2015-06-30T11:00:00-0700",
    "calendarID": 2,
    "id": 3
  }
]
{"status_code": 401, "message": "Unauthorized", "error": "unauthorized"}

Query Params

max
int32

Maximum number of results.

minDate
date

Only get appointments this date and after.

maxDate
date

Only get blocks this date and before.

 
Suggest Edits

/blocks

POST request to block off time on your calendar.

 

Basic Auth

 Authentication is required for this endpoint.
posthttps://acuityscheduling.com/api/v1/blocks
curl -u ACUITY_USER_ID:ACUITY_API_KEY -d '{"start": "2017-01-01 12:00am", "end": "2015-01-01 11:59pm", "calendarID": "27238", "notes": "Happy New Year!"}' "https://acuityscheduling.com/api/v1/blocks"
A binary file was returned
{
    "id": 174453240,
    "notes": "Test 1",
    "description": "Wednesday 17 June 2015 3:00am - 4:00am"
}

Body Params

start
date
required

start date and time to block off (must be parsable by strtotime)

end
date
required

end date and time of blocked off time (must be parsable by strtotime)

calendarID
int32
required

numeric id of calendar to add this to

notes
string

text, any notes to include for the blocked off time

 

Will return error 422 Unprocessable Entity if not able to parse data, or invalid parameter passed.

Suggest Edits

/blocks/:id

Given an ID of a blocked off time get the details about it.

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://acuityscheduling.com/api/v1/blocks/id
curl -u ACUITY_USER_ID:ACUITY_API_KEY "https://acuityscheduling.com/api/v1/blocks/1234"
A binary file was returned
{
    "id": 174453240,
    "notes": "Test 1",
    "description": "Wednesday 17 June 2015 3:00am - 4:00am"
}

Path Params

id
int32
required

Blocked time ID.

 
Suggest Edits

/blocks/:id

Given an ID of a blocked off time get the details about it.

 

Basic Auth

 Authentication is required for this endpoint.
deletehttps://acuityscheduling.com/api/v1/blocks/id
curl -X DELETE -u ACUITY_USER_ID:ACUITY_API_KEY "https://acuityscheduling.com/api/v1/blocks/1234"
A binary file was returned
{
  "status_code": 404,
  "message": "Not Found",
  "error": "not_found"
}

Path Params

id
int32
required

Blocked time ID.

 

Returns 200 on success. Returns 404 if not found.

Suggest Edits

/calendars

Retrieves a list of calendars this user has access to.

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://acuityscheduling.com/api/v1/calendars
curl -u ACUITY_USER_ID:ACUITY_API_KEY "https://acuityscheduling.com/api/v1/calendars"
A binary file was returned
[
  {
    "id": 1234,
    "name": "Emily",
    "email": "",
    "replyTo": ""
  },
  {
    "id": 4321,
    "name": "Joe",
    "email": "joecontractor@example.com",
    "replyTo": "joecontractor@example.com"
  }
]
 
Suggest Edits

/certificates

Get package certificates.

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://acuityscheduling.com/api/v1/certificates
GET "https://acuityscheduling.com/api/v1/certificates"
A binary file was returned
[
  {
    "id": 1,
    "certificate": "514794CC",
    "productID": 2,
    "orderID": null,
    "appointmentTypeIDs": [
      1
    ],
    "name": "5 Small Builds",
    "email": "",
    "type": "appointments",
    "remainingCounts": {
      "1": 5
    },
    "remainingMinutes": null,
    "expiration": null
  },
  {
    "id": 2,
    "certificate": "7FFF6C65",
    "productID": 3,
    "orderID": null,
    "appointmentTypeIDs": [
      1,
      2,
      3
    ],
    "name": "120 Build Minutes",
    "email": "",
    "type": "minutes",
    "remainingCounts": null,
    "remainingMinutes": 120,
    "expiration": null
  },
  ...
]
{
  "status_code": 400,
  "message": "The product \"10\" does not exist.",
  "error": "invalid_product"
}

Query Params

productID
string

Get certificate codes for a particular product.

orderID
string

Get certificate codes for a particular order.

appointmentTypeID
string

Get certificate codes for a particular appointment type.

email
string

Get valid codes for a particular email address. Combine this with appointment type to suggest certificates to a client!

 
Suggest Edits

/certificates

Create a package or coupon certificate.

 

Basic Auth

 Authentication is required for this endpoint.
posthttps://acuityscheduling.com/api/v1/certificates
POST "https://acuityscheduling.com/api/v1/certificates"

{
  "productID": 1
}
A binary file was returned
{
  "id": 1,
  "certificate": "BFB0E13E",
  "productID": 1,
  "orderID": null,
  "appointmentTypeIDs": [
    1
  ],
  "name": "5 Small Builds",
  "email": "",
  "type": "appointments",
  "remainingCounts": {
    "1": 5
  },
  "remainingMinutes": null,
  "expiration": null
}
{
  "status_code": 400,
  "message": "The product \"1\" is not a package.",
  "error": "invalid_product"
}

Body Params

productID
int32

The package to create a certificate for.

couponID
int32

The coupon to create a certificate for.

certificate
string

The certificate code if you have one picked out. We'll choose one automatically if left blank.

email
string

The e-mail address to assign a package code to.

 

Create certificate codes for packages, coupons, etc. in Acuity. Either productID (for packages) or couponID must be submitted. If you have one picked out (eg. "FOOBAR") you can submit the certificate parameter as well, otherwise we'll generate a random certificate for you.

Submitting the email parameter for a package assigns the certificate to that client email address.

Suggest Edits

/certificates/:id

Delete a certificate.

 

Basic Auth

 Authentication is required for this endpoint.
deletehttps://acuityscheduling.com/api/v1/certificates/:id
DELETE https://acuityscheduling.com/api/v1/certificates/1
A binary file was returned
{
  "status_code": 404,
  "message": "Not Found",
  "error": "not_found"
}
 
Suggest Edits

/certificates/check

Check that a certificate code is valid for a particular appointment type.

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://acuityscheduling.com/api/v1/certificates/check
GET "https://acuityscheduling.com/api/v1/certificates/check?certificate=657142D2&appointmentTypeID=1"
A binary file was returned
{
  "id": 1,
  "certificate": "BFB0E13E",
  "productID": 1,
  "orderID": null,
  "appointmentTypeIDs": [
    1
  ],
  "name": "5 Small Builds",
  "email": "",
  "type": "appointments",
  "remainingCounts": {
    "1": 5
  },
  "remainingMinutes": null,
  "expiration": null
}
{
  "status_code": 400,
  "message": "The parameter \"appointmentTypeID\" is required.",
  "error": "required_appointment_type_id"
}

Query Params

certificate
string
required

The certificate code to check.

appointmentTypeID
int32
required

The appointment type ID to check.

email
string

An optional email address to check if the certificate is valid for (eg. for coupon use).

 

Check that a certificate code is valid for a particular appointment type. Use this to validate a certificate code before setting it on an appointment.

Optionally check that the certificate code is still valid for a particular client e-mail address too, eg. in the case of single-use coupons.

Suggest Edits

/forms

Return intake forms.

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://acuityscheduling.com/api/v1/forms
curl -u ACUITY_USER_ID:ACUITY_API_KEY "https://acuityscheduling.com/api/v1/appointment-types"
A binary file was returned
[
  {
    "id": 3,
    "appointmentTypeIDs": [1, 2],
    "description": "This form has got it all!",
    "hidden": false,
    "name": "Kitchen Sink",
    "fields": [
      {
        "id": 7,
        "name": "What is your text?",
        "options": null,
        "required": false,
        "type": "textbox"
      },
      {
        "id": 8,
        "name": "What are your multiple lines of text?",
        "options": null,
        "required": false,
        "type": "textarea"
      },
      {
        "id": 9,
        "name": "Which are your drop downs?",
        "options": [
          "First",
          "Second",
          "Third"
        ],
        "required": false,
        "type": "dropdown"
      },
      {
        "id": 10,
        "name": "What do you check?",
        "options": null,
        "required": false,
        "type": "checkbox"
      },
      {
        "id": 11,
        "name": "Which do you check?",
        "options": [
          "First",
          "Second",
          "Third"
        ],
        "required": false,
        "type": "checkboxlist"
      },
      {
        "id": 12,
        "name": "Yes or no?",
        "options": null,
        "required": false,
        "type": "yesno"
      },
      {
        "id": 13,
        "name": "File Uploading Time",
        "options": null,
        "required": false,
        "type": "file"
      },
      {
        "id": 14,
        "name": "What address is it?",
        "options": null,
        "required": false,
        "type": "address"
      },
      {
        "id": 15,
        "name": "Required?",
        "options": null,
        "required": true,
        "type": "textbox"
      }
    ]
  },
  ...
]
 

Response Attributes

Attribute
Description

id

form ID

name

the name of the form

description

the description of the form

hidden

whether or not the form is internal and hidden from clients

appointmentTypeIDs

the IDs of the appointment types the form is assigned to

fields

the list of form fields

Form Fields

Form fields are returned with the rest of the forms data. This list can be used to build a custom scheduler which supports intake forms, just be sure to implement each type of form field you're using!

Attribute
Description

id

the field ID

name

the field name

required

whether or not the field is required for clients

type

the field type, one of textbox, textarea, dropdown, checkbox, checkboxlist, yesno, file, or address

options

the list of options for dropdown and checkboxlist fields

Suggest Edits

/me

Get basic account information.

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://acuityscheduling.com/api/v1/me
curl -u ACUITY_USER_ID:ACUITY_API_KEY "https://acuityscheduling.com/api/v1/me"
A binary file was returned
{
    "id": 1,
    "email": "example@acuityscheduling.com",
    "timezone": "America/New_York",
    "firstDayOfWeek": 0,
    "timeFormat": "ampm",
    "currency": "USD",
    "schedulingPage": "https://example.acuityscheduling.com/",
    "embedCode": "<iframe>...</script>",
    "plan": "Professional",
    "name": "Example",
    "description": ""
}
 
  • firstDayOfWeek set under Customize Appearance, the value is 0 or 1 (Sunday or Monday)
  • timeFormat set under Customize Appearance, the value is ampm or 24h
Suggest Edits

/orders

Retrieves a list of orders from the online store with most recent first. Status can be delivered, paid, or unpaid. Title is a semi-colon separated list of the product names ordered.

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://acuityscheduling.com/api/v1/orders
curl -u ACUITY_USER_ID:ACUITY_API_KEY "https://acuityscheduling.com/api/v1/orders"
A binary file was returned
[
  {
  	"id":1234,
  	"total":"55",
  	"status": "paid",
  	"time": "2014-09-23 14:22",
  	"firstName": "Testy",
  	"lastName": "McTest",
  	"phone": "1234567890",
  	"email": "test@example.com",
  	"title": "Massage Gift Certificate, Relaxing Candle",
  	"notes": "Some notes from the client"
  }
]

Query Params

max
int32

maximum number of results

 
Suggest Edits

/products

Get a list of products and packages.

 

Basic Auth

 Authentication is required for this endpoint.
gethttps://acuityscheduling.com/api/v1/products
curl -u ACUITY_USER_ID:ACUITY_API_KEY "https://acuityscheduling.com/api/v1/products"
A binary file was returned
[
  {
    "id": 6,
    "name": "120 Build Minutes",
    "description": "Hundred build minutes.",
    "price": "100.00",
    "type": "minutes",
    "hidden": false,
    "expires": null,
    "appointmentTypeIDs": [
      1,
      2,
      3
    ],
    "appointmentTypeCounts": null,
    "minutes": 120
  },
  {
    "id": 2,
    "name": "5 Small Builds",
    "description": "Five small builds.",
    "price": "125.00",
    "type": "appointments",
    "hidden": false,
    "expires": 180,
    "appointmentTypeIDs": [
      1
    ],
    "appointmentTypeCounts": {
      "1": 5
    },
    "minutes": null
  },
  {
    "id": 1,
    "name": "Pirate Party Legos",
    "description": "Avast, me hearties! Ain't no lego party like a pirate lego party.",
    "price": "200.00",
    "type": "product",
    "hidden": false,
    "expires": null,
    "appointmentTypeIDs": null,
    "appointmentTypeCounts": null,
    "minutes": null
  }
]
{"status_code":401,"message":"Unauthorized"}

Query Params

deleted
boolean

Retrieve deleted products.

 

Response Fields

Field
Description

id

The product ID.

name

The name of the product.

description

The description of the product.

price

The price of the product in the account's currency.

type

The product type: product for regular products, appointments for packages of appointments, or minutes for packages of minutes.

hidden

Whether or not the product is hidden from the store.

expires

The number of days from the date of purchase that a package expires. Null if it does not expire.

appointmentTypeIDs

The appointment types that a package can be applied to.

appointmentTypeCounts

A hash containing the total number of appointments an appointments package may be redeemed for, keyed by appointment type ID; null otherwise.

minutes

The total number of minutes of the selected appointment types a minutes package may be redeemed for; null otherwise.

Suggest Edits

API Errors

Here's what can go wrong in Acuity's API, and how to fix it. As always, feel free to reach out to developers@acuityscheduling.com if you run into a problem you're having trouble fixing!

 

General API Errors

These are the errors we all know and love. They're errors that can happen in most web applications, and they should be straight forward to solve.

Status Error Response Description
400 Bad Request {"status_code": 400, "message": "Expected a JSON object.", "error": "bad_request"} The request requires a JSON body, but we couldn't parse it. Double check that you're sending a request body and that the body is valid JSON.
401 Unauthorized {"status_code": 401, "message": "Unauthorized", "error": "unauthorized" } We don't know who you are! Either the request didn't include authentication or the authentication wasn't valid. Double check the user ID and API key, or head to Getting Started for an example.
403 Forbidden { "status_code": 403, "message": "Forbidden", "error": "forbidden" } The request included authentication and we know who you are, but you don't have access to the resource. Eg. the calendar or appointment type belongs to another user.
404 Not Found { "status_code": 404, "message": "Not Found. Did you mean `/appointments/{id:number}`?", "error": "not_found" } The requested resource could not be found. Fat fingers happen, so if it looks like a typo we'll do our best to suggest the correct endpoint. Also double check URI IDs, in case the resource legitimately does not exist.
405 Method Not Allowed { "status_code": 405, "message": "Method Not Allowed", "error": "method_not_allowed" } The resource exists but the HTTP method is not supported. Not all of our endpoints support the same methods. Check our docs for the methods which are supported.
429 Too Many Requests {"status_code": 429,"error": "too_many_requests","message": "Rate limit reached. Limit 10req/s and 20 concurrent connections."} Woah there! Our API is currently rate limited to 10 requests a second and 20 concurrent connections from an IP.
500 Internal Server Error { "status_code": 500, "message": "Internal Server Error", "error":"internal_server_error" } Something unexpected happened. These errors should not happen, but when they do we'll get notified and be on the case quickly. Feel free to reach out to us at developers@acuityscheduling.com.

Specific API Errors

Many of our endpoints return specific errors related to that endpoint. These errors will will do their best to include a descriptive message about what went wrong. The error response body looks like this:

{
  "status_code": 400,
  "error": "invalid_name",
  "message": "Can not clear the field \"firstName\"."
}
Status Error Response Description
400 Bad Request {"status_code": 400, "message": "Can not clear the field \"firstName\".", "error": "invalid_name"} General validation errors such as unexpected values or missing required fields will generate 400 errors. We'll give a descriptive message about what went wrong to help you resolve it.
422 Unprocessable Entity {"status_code": 422, "message": "End is before start.", "error": "invalid_time"} Left over from before RFC 7231 opened up the description of the 400 status code, our POST /blocks endpoint returns 422 error on time validation errors.
Attributed to Rogério Vicente & Tonomi - https://http.cat/

Attributed to Rogério Vicente & Tonomi - https://http.cat/