REST API reference

Setmore API

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

Base URL
https://cotlet.dev/api/v1/setmore
Connects with
Your own Setmore account (Free or Pro) in the web app
Integration page
Setmore
Setmore Endpoints
Endpoint Access Description
list_appointments read Appointments in a date range with customer, service, team member, time and label.
get_appointment read One appointment: customer, service, team member, start and end, label and where it was booked.
list_available_slots read Open times for a service on a day, based on working hours and existing bookings.
list_services read Services and classes with category, cost, duration and the team members who offer them.
list_staff read Team members with the services they offer and their working hours.
find_customer read Search customers by name, email or phone.
get_customer read Customer profile: contact details, your private notes and past and upcoming appointments.
get_appointment_report read Appointment history from Reports, filtered by date range, service, class or team member.
create_appointment write Book a service for a customer. Setmore emails the confirmation unless you turned it off.
reschedule_appointment write Move an appointment to a new time or team member. The customer is emailed unless you turned it off.
cancel_appointment write Delete an appointment from your calendar. The customer is emailed unless you turned it off.
set_appointment_label write Track status with a label such as Confirmed or No-Show. Only you and your team see it.
add_customer_note write Add a private note to a customer profile. The customer does not see it.
block_time write Add an Event to the calendar so customers cannot book that time.
delete_event write Delete an Event from the calendar and free the time.

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

Returns appointments between two days, in your account time zone, with the customer, service, team member, start and end and the label if you set one. Filter by team member or service. Use appointment_id from each item in get_appointment, reschedule_appointment and cancel_appointment.

Parameters

Parameters: list_appointments
NameTypeDescription
from required date First day, in your account time zone.
to date Last day. Default: same as from.
staff_id string Only this team member, from list_staff.
service_id string Only this service, from list_services.

Request

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

Example response

{
  "appointments": [
    {
      "appointment_id": "apt_51d7e2b9",
      "service": "Massage, 60 min",
      "staff": "Anna",
      "customer": "Sam Client",
      "start": "2026-10-16T15:00:00-04:00",
      "end": "2026-10-16T16:00:00-04:00",
      "label": "Confirmed"
    },
    {
      "appointment_id": "apt_62e8f3ca",
      "service": "Massage, 60 min",
      "staff": "Anna",
      "customer": "Lee Customer",
      "start": "2026-10-16T17:00:00-04:00",
      "end": "2026-10-16T18:00:00-04:00",
      "label": null
    }
  ]
}

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

Returns one appointment with the customer, service, team member, start and end, and its label. Booked via is the source Setmore assigns when the appointment is created, such as the web app, your website or Instagram. It is read only and cannot be edited.

Parameters

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

Request

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

Example response

{
  "appointment_id": "apt_51d7e2b9",
  "service": "Massage, 60 min",
  "staff": "Anna",
  "customer": {
    "customer_id": "cus_7c04a1",
    "name": "Sam Client"
  },
  "start": "2026-10-16T15:00:00-04:00",
  "end": "2026-10-16T16:00:00-04:00",
  "label": "Confirmed",
  "booked_via": "Booked from website"
}

POST https://cotlet.dev/api/v1/setmore/list_available_slots

Returns open start times for one service on one day. A team member's open times follow their working hours, not your business hours, and exclude their appointments and events. Pass a start from this list to create_appointment or reschedule_appointment.

Parameters

Parameters: list_available_slots
NameTypeDescription
service_id required string Service from list_services.
date required date Day to check.
staff_id string Only this team member. Default: everyone who offers the service.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/setmore/list_available_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("setmore", "list_available_slots", {"service_id":"service_8c41d2","date":"2026-10-01"})
Node.js
const result = await cotlet.call('setmore', 'list_available_slots', {"service_id":"service_8c41d2","date":"2026-10-01"});
CLI
cotlet call setmore list_available_slots --data '{"service_id":"service_8c41d2","date":"2026-10-01"}'

Example response

{
  "service": "Massage, 60 min",
  "date": "2026-10-16",
  "slots": [
    {
      "staff_id": "stf_3a90de",
      "staff": "Anna",
      "start": "2026-10-16T09:00:00-04:00"
    },
    {
      "staff_id": "stf_3a90de",
      "staff": "Anna",
      "start": "2026-10-16T13:00:00-04:00"
    },
    {
      "staff_id": "stf_5b12c7",
      "staff": "Ben",
      "start": "2026-10-16T10:00:00-04:00"
    }
  ]
}

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

Lists the services and classes set up in your account, grouped by the categories you use on your Booking Page. Use service_id from each item in list_available_slots, create_appointment and get_appointment_report.

Parameters

No parameters.

Request

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

Example response

{
  "services": [
    {
      "service_id": "svc_8f21c4",
      "name": "Massage, 60 min",
      "category": "Massage",
      "duration_minutes": 60,
      "cost": 80,
      "staff": [
        "Anna",
        "Ben"
      ]
    },
    {
      "service_id": "svc_a19d03",
      "name": "Consultation, 30 min",
      "category": "Consultations",
      "duration_minutes": 30,
      "cost": 0,
      "staff": [
        "Anna"
      ]
    }
  ]
}

List staff

read

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

Lists the team members in your account with the services each one offers and their working days and hours. Working hours decide a team member's open times. Use staff_id from each item in the other tools.

Parameters

No parameters.

Request

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

Example response

{
  "staff": [
    {
      "staff_id": "stf_3a90de",
      "name": "Anna",
      "services": [
        "Massage, 60 min",
        "Consultation, 30 min"
      ],
      "working_hours": "Mon-Fri 09:00-17:00"
    },
    {
      "staff_id": "stf_5b12c7",
      "name": "Ben",
      "services": [
        "Massage, 60 min"
      ],
      "working_hours": "Tue-Sat 10:00-18:00"
    }
  ]
}

POST https://cotlet.dev/api/v1/setmore/find_customer

Searches your customer list and returns matches with contact details. Use customer_id from each item in get_customer, add_customer_note and create_appointment.

Parameters

Parameters: find_customer
NameTypeDescription
query required string Name, email or phone number.
limit integer 1 to 50. Default: 10.

Request

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

Example response

{
  "customers": [
    {
      "customer_id": "cus_7c04a1",
      "name": "Sam Client",
      "email": "client@example.com",
      "phone": "+1 555 0100"
    }
  ]
}

POST https://cotlet.dev/api/v1/setmore/get_customer

Returns one customer with their contact details, your private notes and their past, present and future appointments, as in the Customers tab. Notes are for your reference and the customer does not see them.

Parameters

Parameters: get_customer
NameTypeDescription
customer_id required string Customer ID from find_customer.

Request

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

Example response

{
  "customer_id": "cus_7c04a1",
  "name": "Sam Client",
  "email": "client@example.com",
  "phone": "+1 555 0100",
  "notes": "Prefers afternoon slots.",
  "appointments": [
    {
      "appointment_id": "apt_51d7e2b9",
      "service": "Massage, 60 min",
      "start": "2026-10-16T15:00:00-04:00"
    }
  ]
}

POST https://cotlet.dev/api/v1/setmore/get_appointment_report

Returns the appointment history that Settings > Booking Page > Reports shows in the web app, with counts per team member for the filter you set. Setmore recommends ranges of no more than 3 months for best results. It reads only; nothing is exported to a file.

Parameters

Parameters: get_appointment_report
NameTypeDescription
from required date Start date. Up to 3 months per call for best results.
to required date End date.
service_id string Only this service or class.
staff_id string Only this team member.

Request

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

Example response

{
  "from": "2026-09-01",
  "to": "2026-09-30",
  "service": "Massage, 60 min",
  "total_appointments": 42,
  "by_staff": [
    {
      "staff": "Anna",
      "appointments": 25
    },
    {
      "staff": "Ben",
      "appointments": 17
    }
  ]
}

Create appointment

write Confirm

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

Books one service with a team member at a start time, for an existing customer or a new one. Setmore sends a booking confirmation email to the provider and the customer unless you turned it off in Settings > Notifications. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: create_appointment
NameTypeDescription
service_id required string Service from list_services.
start required datetime ISO 8601 with time zone.
customer_id string Existing customer from find_customer. Or pass customer.
customer object New customer: name, email, phone. Add an email so the customer gets confirmations.
staff_id string Team member from list_staff. Default: first one free.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/setmore/create_appointment \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"service_id":"svc_8f21c4","start":"2026-10-16T15:00:00-04:00","customer":{"name":"Sam Client","email":"client@example.com"},"staff_id":"stf_3a90de"}'
Python
result = client.call("setmore", "create_appointment", {"service_id":"svc_8f21c4","start":"2026-10-16T15:00:00-04:00","customer":{"name":"Sam Client","email":"client@example.com"},"staff_id":"stf_3a90de"})
Node.js
const result = await cotlet.call('setmore', 'create_appointment', {"service_id":"svc_8f21c4","start":"2026-10-16T15:00:00-04:00","customer":{"name":"Sam Client","email":"client@example.com"},"staff_id":"stf_3a90de"});
CLI
cotlet call setmore create_appointment --data '{"service_id":"svc_8f21c4","start":"2026-10-16T15:00:00-04:00","customer":{"name":"Sam Client","email":"client@example.com"},"staff_id":"stf_3a90de"}'

Example response

{
  "appointment_id": "apt_51d7e2b9",
  "status": "booked",
  "service": "Massage, 60 min",
  "staff": "Anna",
  "start": "2026-10-16T15:00:00-04:00",
  "end": "2026-10-16T16:00:00-04:00",
  "customer_id": "cus_7c04a1",
  "confirmation_email": "sent"
}

Reschedule appointment

write Confirm

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

Changes the start time, the team member, or both for one appointment. Setmore emails the provider and the customer about the change unless rescheduled-appointment emails are off in Settings > Notifications. 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 Assign a different team member.

Request

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

Example response

{
  "appointment_id": "apt_51d7e2b9",
  "status": "rescheduled",
  "staff": "Anna",
  "start": "2026-10-20T15:00:00-04:00",
  "end": "2026-10-20T16:00:00-04:00",
  "customer_email": "sent"
}

Cancel appointment

write Confirm

POST https://cotlet.dev/api/v1/setmore/cancel_appointment

Deletes one appointment from the calendar, as Delete does in the app. Setmore notifies the provider and the customer by email unless canceled-appointment emails are off in Settings > Notifications. It cannot be undone with one call; book again with create_appointment. By default you confirm each call; you can switch that off for this tool.

Parameters

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

Request

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

Example response

{
  "appointment_id": "apt_62e8f3ca",
  "status": "canceled",
  "customer_email": "sent"
}

POST https://cotlet.dev/api/v1/setmore/set_appointment_label

Sets the label on one appointment, like the Label dropdown in the web app. Customers never see labels, and nothing is sent to anyone. It runs without asking first because one call sets the label back.

Parameters

Parameters: set_appointment_label
NameTypeDescription
appointment_id required string Appointment ID from list_appointments.
label required string Pending, Confirmed, Done, No-Show, Paid, Running Late or one of your custom labels.

Request

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

Example response

{
  "appointment_id": "apt_51d7e2b9",
  "label": "No-Show",
  "previous_label": "Confirmed"
}

POST https://cotlet.dev/api/v1/setmore/add_customer_note

Writes to the Notes tab of the customer profile, which is for your reference only. Nothing is sent to anyone, so it runs without asking first. A note the customer can see is an appointment comment, which this tool does not write.

Parameters

Parameters: add_customer_note
NameTypeDescription
customer_id required string Customer ID from find_customer.
note required string Note text.

Request

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

Example response

{
  "customer_id": "cus_7c04a1",
  "status": "saved",
  "note": "No-show on 16 Oct 2026."
}

Block time

write

POST https://cotlet.dev/api/v1/setmore/block_time

Creates a Setmore Event with no guests. Customers cannot book that time on your Booking Page. Events suit blocks within a day; longer absences are Time Off under Settings > Your team, which this tool does not change. It adds no guests, so nobody is emailed and it runs without asking first; delete_event removes it.

Parameters

Parameters: block_time
NameTypeDescription
start required datetime ISO 8601 with time zone.
duration_minutes required integer Length of the block, within one day.
staff_id string Whose calendar, from list_staff. Default: yours.
notes string Shown on the event, for example "Lunch".

Request

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

Example response

{
  "event_id": "evt_3d51a8",
  "status": "created",
  "staff": "Anna",
  "start": "2026-10-19T12:00:00-04:00",
  "end": "2026-10-19T13:00:00-04:00",
  "notes": "Lunch"
}

Delete event

write Confirm

POST https://cotlet.dev/api/v1/setmore/delete_event

Deletes one Event, as Delete does in the app. If the event has guests, Setmore notifies them of the change. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: delete_event
NameTypeDescription
event_id required string Event ID from block_time.

Request

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

Example response

{
  "event_id": "evt_3d51a8",
  "status": "deleted"
}