REST API reference

Booksy API

13 endpoints for Booksy. Each one is a POST with a JSON body, called with your API key.

Base URL
https://cotlet.dev/api/v1/booksy
Connects with
Your own Booksy Biz account (owner or a staff account that can see the calendar; Pro-only reports need Booksy Biz Pro)
Integration page
Booksy
Booksy Endpoints
Endpoint Access Description
list_appointments read Appointments in a date range with client, service, staff, time and status.
get_appointment read One appointment: services, staff, price, client and notes.
find_open_slots read Free start times for a service on one day, based on working hours, breaks and time off.
list_clients read Clients with contact details and last visit.
get_client read One client card: contact details, notes and appointment history.
list_services read Your service menu with duration, price and the staff who offer each.
list_staff read Staff members with their working hours and the services they offer.
get_report read Numbers from Stats & Reports for a period, as JSON.
create_appointment write Book a client into your calendar.
reschedule_appointment write Move an appointment to a new time or staff member.
add_client write Add a client card to your client list.
add_time_off write Block time in a staff member's calendar so no one can book it.
send_message_blast write Send one message to chosen clients by email, SMS or push notification.

POST https://cotlet.dev/api/v1/booksy/list_appointments

Lists appointments from your Booksy calendar between two days, in start order. Limit it to one staff member to see a single calendar. Each item has the client, service, staff member, start, end and status, and get_appointment returns the rest.

Parameters

Parameters: list_appointments
NameTypeDescription
from required date First day, inclusive.
to required date Last day, inclusive.
staff_id string Only one staff member, from list_staff.
cursor string Next page cursor from the previous call.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/booksy/list_appointments \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"from":"2026-10-01","to":"2026-10-01"}'
Python
result = client.call("booksy", "list_appointments", {"from":"2026-10-01","to":"2026-10-01"})
Node.js
const result = await cotlet.call('booksy', 'list_appointments', {"from":"2026-10-01","to":"2026-10-01"});
CLI
cotlet call booksy list_appointments --data '{"from":"2026-10-01","to":"2026-10-01"}'

Example response

{
  "appointments": [
    {
      "appointment_id": "apt_58213904",
      "client": "Anna Novak",
      "service": "Haircut",
      "staff": "Tom",
      "start": "2026-10-12T10:00:00-04:00",
      "end": "2026-10-12T10:45:00-04:00",
      "status": "confirmed"
    },
    {
      "appointment_id": "apt_58213977",
      "client": "Mark Ellis",
      "service": "Beard trim",
      "staff": "Tom",
      "start": "2026-10-12T11:30:00-04:00",
      "end": "2026-10-12T12:00:00-04:00",
      "status": "confirmed"
    }
  ],
  "next_cursor": null
}

POST https://cotlet.dev/api/v1/booksy/get_appointment

Returns one appointment with its services, staff member, price, client and internal notes. Use it before changing an appointment.

Parameters

Parameters: get_appointment
NameTypeDescription
appointment_id required string Appointment ID from list_appointments.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/booksy/get_appointment \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"appointment_id":"appointment_8c41d2"}'
Python
result = client.call("booksy", "get_appointment", {"appointment_id":"appointment_8c41d2"})
Node.js
const result = await cotlet.call('booksy', 'get_appointment', {"appointment_id":"appointment_8c41d2"});
CLI
cotlet call booksy get_appointment --data '{"appointment_id":"appointment_8c41d2"}'

Example response

{
  "appointment_id": "apt_58213904",
  "client": {
    "client_id": "cl_1042",
    "name": "Anna Novak"
  },
  "services": [
    {
      "name": "Haircut",
      "price": 35
    }
  ],
  "staff": "Tom",
  "start": "2026-10-16T15:00:00-04:00",
  "end": "2026-10-16T15:45:00-04:00",
  "status": "confirmed",
  "note": "Prefers a scissor cut"
}

POST https://cotlet.dev/api/v1/booksy/find_open_slots

Returns free start times for one service on one day, in time order. It follows working hours, breaks, time off and the duration and buffer set on the service. Limit it to one staff member or leave it open to anyone who offers the service.

Parameters

Parameters: find_open_slots
NameTypeDescription
service_id required string Service ID from list_services.
date required date Day to check.
staff_id string Only this staff member. Default: anyone who offers the service.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/booksy/find_open_slots \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"service_id":"service_8c41d2","date":"2026-10-01"}'
Python
result = client.call("booksy", "find_open_slots", {"service_id":"service_8c41d2","date":"2026-10-01"})
Node.js
const result = await cotlet.call('booksy', 'find_open_slots', {"service_id":"service_8c41d2","date":"2026-10-01"});
CLI
cotlet call booksy find_open_slots --data '{"service_id":"service_8c41d2","date":"2026-10-01"}'

Example response

{
  "date": "2026-10-17",
  "service": "Haircut",
  "slots": [
    {
      "start": "2026-10-17T10:00:00-04:00",
      "staff_id": "stf_2291"
    },
    {
      "start": "2026-10-17T11:30:00-04:00",
      "staff_id": "stf_2291"
    }
  ]
}

POST https://cotlet.dev/api/v1/booksy/list_clients

Lists clients from your client list with contact details and the date of the last visit. Search by name, email or phone, or keep only clients who have not visited for a number of days. Pages are cursor based.

Parameters

Parameters: list_clients
NameTypeDescription
query string Name, email or phone to search for.
not_visited_days integer Only clients whose last visit is older than this many days.
limit integer Page size. Default: 50.
cursor string Next page cursor from the previous call.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/booksy/list_clients \
  -H "Authorization: Bearer $COTLET_API_KEY"
Python
result = client.call("booksy", "list_clients")
Node.js
const result = await cotlet.call('booksy', 'list_clients');
CLI
cotlet call booksy list_clients

Example response

{
  "clients": [
    {
      "client_id": "cl_1042",
      "name": "Anna Novak",
      "email": "anna@example.com",
      "last_visit": "2026-07-28"
    },
    {
      "client_id": "cl_1187",
      "name": "Mark Ellis",
      "email": "mark@example.com",
      "last_visit": "2026-07-30"
    }
  ],
  "next_cursor": null
}

Get client

read

POST https://cotlet.dev/api/v1/booksy/get_client

Returns one client card with contact details, notes and past appointments, newest first. Look the client up by ID or by email.

Parameters

Parameters: get_client
NameTypeDescription
client_id string Client ID from list_clients.
email string Look up by email instead of ID.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/booksy/get_client \
  -H "Authorization: Bearer $COTLET_API_KEY"
Python
result = client.call("booksy", "get_client")
Node.js
const result = await cotlet.call('booksy', 'get_client');
CLI
cotlet call booksy get_client

Example response

{
  "client_id": "cl_1042",
  "name": "Anna Novak",
  "email": "anna@example.com",
  "notes": "Prefers a scissor cut",
  "appointments": [
    {
      "appointment_id": "apt_58213904",
      "service": "Haircut",
      "start": "2026-10-16T15:00:00-04:00"
    }
  ]
}

POST https://cotlet.dev/api/v1/booksy/list_services

Returns the services on your Booksy menu with duration, price and the staff members who offer each one. Use the service ID in find_open_slots and create_appointment.

Parameters

No parameters.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/booksy/list_services \
  -H "Authorization: Bearer $COTLET_API_KEY"
Python
result = client.call("booksy", "list_services")
Node.js
const result = await cotlet.call('booksy', 'list_services');
CLI
cotlet call booksy list_services

Example response

{
  "services": [
    {
      "service_id": "svc_301",
      "name": "Haircut",
      "duration_minutes": 45,
      "price": 35,
      "staff_ids": [
        "stf_2291",
        "stf_2305"
      ]
    },
    {
      "service_id": "svc_302",
      "name": "Beard trim",
      "duration_minutes": 30,
      "price": 20,
      "staff_ids": [
        "stf_2291"
      ]
    }
  ]
}

List staff

read

POST https://cotlet.dev/api/v1/booksy/list_staff

Returns your staff members with their weekly working hours and the services each one offers. Use the staff ID in other tools.

Parameters

No parameters.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/booksy/list_staff \
  -H "Authorization: Bearer $COTLET_API_KEY"
Python
result = client.call("booksy", "list_staff")
Node.js
const result = await cotlet.call('booksy', 'list_staff');
CLI
cotlet call booksy list_staff

Example response

{
  "staff": [
    {
      "staff_id": "stf_2291",
      "name": "Tom",
      "services": [
        "Haircut",
        "Beard trim"
      ],
      "hours": {
        "mon": "09:00-18:00",
        "tue": "09:00-18:00"
      }
    },
    {
      "staff_id": "stf_2305",
      "name": "Kate",
      "services": [
        "Haircut"
      ],
      "hours": {
        "mon": "10:00-19:00",
        "tue": "10:00-19:00"
      }
    }
  ]
}

Get report

read

POST https://cotlet.dev/api/v1/booksy/get_report

Returns the numbers of one Stats & Reports category for a date range. Booksy Biz Lite has Dashboard, Revenue, Appointments and Clients; Cash Flow, Inventory, Staff Members and Marketing need Booksy Biz Pro, and the call fails for other plans.

Parameters

Parameters: get_report
NameTypeDescription
category required enum dashboard, revenue, appointments, clients, cash_flow, inventory, staff_members or marketing. The last four need Booksy Biz Pro.
from required date First day, inclusive.
to required date Last day, inclusive.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/booksy/get_report \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"category":"staff_members","from":"2026-10-06","to":"2026-10-12"}'
Python
result = client.call("booksy", "get_report", {"category":"staff_members","from":"2026-10-06","to":"2026-10-12"})
Node.js
const result = await cotlet.call('booksy', 'get_report', {"category":"staff_members","from":"2026-10-06","to":"2026-10-12"});
CLI
cotlet call booksy get_report --data '{"category":"staff_members","from":"2026-10-06","to":"2026-10-12"}'

Example response

{
  "category": "staff_members",
  "from": "2026-10-05",
  "to": "2026-10-11",
  "total": {
    "revenue": 4820,
    "appointments": 96
  },
  "staff": [
    {
      "name": "Tom",
      "revenue": 2310,
      "appointments": 41
    },
    {
      "name": "Kate",
      "revenue": 1640,
      "appointments": 33
    },
    {
      "name": "Sam",
      "revenue": 870,
      "appointments": 22
    }
  ]
}

Create appointment

write Confirm

POST https://cotlet.dev/api/v1/booksy/create_appointment

Books one client for one service at a start time. Pick a start from find_open_slots. Booksy applies its automatic confirmation and the client is part of the booking. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: create_appointment
NameTypeDescription
client_id required string Client ID from list_clients or add_client.
service_id required string Service ID from list_services.
start required datetime ISO 8601 with time zone.
staff_id string Staff member. Default: first one free.
note string Internal note on the appointment.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/booksy/create_appointment \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"client_id":"client_8c41d2","service_id":"service_8c41d2","start":"2026-10-01T09:00:00Z"}'
Python
result = client.call("booksy", "create_appointment", {"client_id":"client_8c41d2","service_id":"service_8c41d2","start":"2026-10-01T09:00:00Z"})
Node.js
const result = await cotlet.call('booksy', 'create_appointment', {"client_id":"client_8c41d2","service_id":"service_8c41d2","start":"2026-10-01T09:00:00Z"});
CLI
cotlet call booksy create_appointment --data '{"client_id":"client_8c41d2","service_id":"service_8c41d2","start":"2026-10-01T09:00:00Z"}'

Example response

{
  "appointment_id": "apt_58214120",
  "status": "confirmed",
  "client": "Mark Ellis",
  "service": "Beard trim",
  "staff": "Tom",
  "start": "2026-10-20T10:00:00-04:00",
  "end": "2026-10-20T10:30:00-04:00"
}

Reschedule appointment

write Confirm

POST https://cotlet.dev/api/v1/booksy/reschedule_appointment

Moves one appointment to a new start time and optionally to another staff member. Booksy booking rules that limit rescheduling still apply, so the call can be refused. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: reschedule_appointment
NameTypeDescription
appointment_id required string Appointment ID from list_appointments.
start required datetime New start, ISO 8601 with time zone.
staff_id string New staff member. Default: unchanged.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/booksy/reschedule_appointment \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"appointment_id":"apt_58213904","start":"2026-10-17T11:30:00-04:00","staff_id":"stf_2291"}'
Python
result = client.call("booksy", "reschedule_appointment", {"appointment_id":"apt_58213904","start":"2026-10-17T11:30:00-04:00","staff_id":"stf_2291"})
Node.js
const result = await cotlet.call('booksy', 'reschedule_appointment', {"appointment_id":"apt_58213904","start":"2026-10-17T11:30:00-04:00","staff_id":"stf_2291"});
CLI
cotlet call booksy reschedule_appointment --data '{"appointment_id":"apt_58213904","start":"2026-10-17T11:30:00-04:00","staff_id":"stf_2291"}'

Example response

{
  "appointment_id": "apt_58213904",
  "status": "confirmed",
  "service": "Haircut",
  "staff": "Tom",
  "start": "2026-10-17T11:30:00-04:00",
  "end": "2026-10-17T12:15:00-04:00"
}

Add client

write

POST https://cotlet.dev/api/v1/booksy/add_client

Adds one client card with a name and optional phone, email and note. It reaches no one and you can edit the card in Booksy, so add_client runs without asking first.

Parameters

Parameters: add_client
NameTypeDescription
name required string Full name.
phone string Phone in international format.
email string Email address.
note string Internal note.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/booksy/add_client \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Jane Doe"}'
Python
result = client.call("booksy", "add_client", {"name":"Jane Doe"})
Node.js
const result = await cotlet.call('booksy', 'add_client', {"name":"Jane Doe"});
CLI
cotlet call booksy add_client --data '{"name":"Jane Doe"}'

Example response

{
  "client_id": "cl_1310",
  "name": "Lena Fox",
  "email": "lena@example.com"
}

Add time off

write

POST https://cotlet.dev/api/v1/booksy/add_time_off

Blocks a period in one staff member's calendar, like time off set in the app, so no one can book during it. It reaches no client and you can remove the block in Booksy, so add_time_off runs without asking first.

Parameters

Parameters: add_time_off
NameTypeDescription
staff_id required string Staff ID from list_staff.
start required datetime ISO 8601 with time zone.
end required datetime ISO 8601 with time zone.
reason string Internal label, e.g. vacation.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/booksy/add_time_off \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"staff_id":"staff_8c41d2","start":"2026-10-01T09:00:00Z","end":"2026-10-01T09:00:00Z"}'
Python
result = client.call("booksy", "add_time_off", {"staff_id":"staff_8c41d2","start":"2026-10-01T09:00:00Z","end":"2026-10-01T09:00:00Z"})
Node.js
const result = await cotlet.call('booksy', 'add_time_off', {"staff_id":"staff_8c41d2","start":"2026-10-01T09:00:00Z","end":"2026-10-01T09:00:00Z"});
CLI
cotlet call booksy add_time_off --data '{"staff_id":"staff_8c41d2","start":"2026-10-01T09:00:00Z","end":"2026-10-01T09:00:00Z"}'

Example response

{
  "time_off_id": "to_7714",
  "staff_id": "stf_2291",
  "start": "2026-10-19T09:00:00-04:00",
  "end": "2026-10-19T18:00:00-04:00",
  "reason": "vacation"
}

Send Message Blast

write Confirm

POST https://cotlet.dev/api/v1/booksy/send_message_blast

Sends one Message Blast to the clients you list, by email, SMS or a push notification to the Booksy Client App. SMS comes from an automated number, so clients cannot reply, and Booksy adds a link to your profile at the bottom. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: send_message_blast
NameTypeDescription
channel required enum email, sms or push.
message required string Message text.
client_ids required string[] Recipients from list_clients.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/booksy/send_message_blast \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"channel":"email","message":"Thursday Happy Hour: 20% off any cut, 4 to 6 pm. Book in the app.","client_ids":["cl_1042","cl_1187","cl_1203"]}'
Python
result = client.call("booksy", "send_message_blast", {"channel":"email","message":"Thursday Happy Hour: 20% off any cut, 4 to 6 pm. Book in the app.","client_ids":["cl_1042","cl_1187","cl_1203"]})
Node.js
const result = await cotlet.call('booksy', 'send_message_blast', {"channel":"email","message":"Thursday Happy Hour: 20% off any cut, 4 to 6 pm. Book in the app.","client_ids":["cl_1042","cl_1187","cl_1203"]});
CLI
cotlet call booksy send_message_blast --data '{"channel":"email","message":"Thursday Happy Hour: 20% off any cut, 4 to 6 pm. Book in the app.","client_ids":["cl_1042","cl_1187","cl_1203"]}'

Example response

{
  "blast_id": "mb_2208",
  "channel": "email",
  "recipients": 3,
  "status": "sent"
}