Acuity Scheduling
Read Acuity appointment types and calendars, find openings, and book, reschedule or cancel appointments.
Connect an Acuity Scheduling account with its User ID and API key to run the appointment book end to end: list the services and classes on offer and the calendars that provide them, find which days have openings and the exact bookable times on one, list and read appointments with their intake-form answers and payment state, then book a client in, move them, or cancel with a note. Unlike Calendly, Acuity CAN book on a client's behalf - this integration does it directly.
Connect
| Credential field | Required | Where it comes from |
|---|---|---|
User ID (USER_ID) | Yes | The NUMERIC account id from Acuity → Integrations → API (e.g. 12345). Used as the Basic-auth user. |
API key (API_KEY) | Yes | From Acuity → Integrations → API, beside the User ID. Used as the Basic-auth password. |
Tools
| Tool | Access | What it does |
|---|---|---|
Who am I (yekar.acuity-scheduling.me) | Read | The Acuity account this connection acts as, including its default time zone - worth reading once, because every appointment time this integration returns is local to a calendar rather than UTC. |
List appointment types (yekar.acuity-scheduling.list-appointment-types) | Read | The services and classes this account offers, with their duration, price and which calendars provide them. This is where the appointmentTypeID comes from that every availability and booking call needs. Acuity returns the whole set in one response - there is no paging here, so this really is all of them. |
List calendars (yekar.acuity-scheduling.list-calendars) | Read | The calendars (staff members, rooms, resources) that appointments are booked against, each with its own TIME ZONE - which is the zone every appointment time on it is expressed in. Acuity returns the whole set in one response; there is no paging here. |
Find available dates (yekar.acuity-scheduling.find-available-dates) | Read | Which DAYS in a month have at least one opening for an appointment type. This is the cheap first step: it returns dates only, so follow it with Find available times for the day you want. A day listed here has one or more slots; it does not say how many or when. |
Find available times (yekar.acuity-scheduling.find-available-times) | Read | The bookable start times on one day for an appointment type. Pass a slot's datetime to Book appointment EXACTLY as returned: Acuity's times are local to the calendar and carry its offset, so a hand-built string in another zone books an hour that was never offered - or is rejected outright. |
List appointments (yekar.acuity-scheduling.list-appointments) | Read | The appointments on the books, filtered by date range, calendar, type or client. Cancellations are excluded by default - Acuity never deletes an appointment, it flags it. This returns a WINDOW, not a page: the v1 API has no cursor and no offset, so when windowFull is true there may be more and the only way to reach them is a narrower date range. No total is available from Acuity, and none is invented here. |
Get appointment (yekar.acuity-scheduling.get-appointment) | Read | Read one appointment in full: the client, the time (local to its calendar - check timezone), payment state, the client-facing confirmation page, and every intake-form answer. |
Book appointment (yekar.acuity-scheduling.book-appointment) | Write | Book an appointment for a client at a specific time. Pass a datetime straight from Find available times - Acuity's times are local to the calendar, and a hand-built string in another zone books a slot that was never offered or is refused. The client is emailed a confirmation unless you turn that off. Re-running books a SECOND appointment: Acuity has no idempotency key. |
Reschedule appointment (yekar.acuity-scheduling.reschedule-appointment) | Write | Move an existing appointment to a new time, keeping its id, its client and its intake answers - unlike cancel-then-rebook, which loses all three. Pass a datetime straight from Find available times. The client is notified unless you turn that off. |
Cancel appointment (yekar.acuity-scheduling.cancel-appointment) | Write | Cancel an appointment. Acuity does not delete it - the row survives with canceled: true and your note, which is why List appointments excludes cancellations by default rather than losing them. The client is emailed unless you turn that off. There is no un-cancel: rebooking means a new appointment. |
Notes
- Find the numeric User ID and API key in Acuity under Integrations → API, and paste both to connect - tools act as that Acuity account. The User ID is a number, not the account email.
- Times are LOCAL to the calendar, not UTC. Take a slot's datetime from Find available times and pass it back exactly as returned; every appointment this integration returns carries the zone it is in.
- The path is: List appointment types → Find available dates (a month) → Find available times (a day) → Book appointment.
- Booking, rescheduling and cancelling email the client by default. Pass sendEmail false only when something else is telling them.
- asAdmin drops the lead-time, cut-off and availability rules a client would be held to. Leave it off unless staff are deliberately overriding.
- Cancelling does not delete: the appointment stays with canceled true, which is why List appointments hides cancellations unless asked.
- Lists are a WINDOW, not a page - Acuity v1 has no cursor. When windowFull is true, narrow the date range rather than assuming that was everything.