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
| 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. |
List appointments
readPOST 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
| Name | Type | Description |
|---|---|---|
| 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 -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"}' result = client.call("setmore", "list_appointments", {"from":"2026-10-01"}) const result = await cotlet.call('setmore', 'list_appointments', {"from":"2026-10-01"}); 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
}
]
} Get appointment
readPOST 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
| Name | Type | Description |
|---|---|---|
| appointment_id required | string | Appointment ID from list_appointments. |
Request
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"}' result = client.call("setmore", "get_appointment", {"appointment_id":"appointment_8c41d2"}) const result = await cotlet.call('setmore', 'get_appointment', {"appointment_id":"appointment_8c41d2"}); 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"
} List available slots
readPOST 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
| Name | Type | Description |
|---|---|---|
| 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 -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"}' result = client.call("setmore", "list_available_slots", {"service_id":"service_8c41d2","date":"2026-10-01"}) const result = await cotlet.call('setmore', 'list_available_slots', {"service_id":"service_8c41d2","date":"2026-10-01"}); 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"
}
]
} List services
readPOST 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 -X POST https://cotlet.dev/api/v1/setmore/list_services \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("setmore", "list_services") const result = await cotlet.call('setmore', 'list_services'); 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
readPOST 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 -X POST https://cotlet.dev/api/v1/setmore/list_staff \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("setmore", "list_staff") const result = await cotlet.call('setmore', 'list_staff'); 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"
}
]
} Find customer
readPOST 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
| Name | Type | Description |
|---|---|---|
| query required | string | Name, email or phone number. |
| limit | integer | 1 to 50. Default: 10. |
Request
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"}' result = client.call("setmore", "find_customer", {"query":"query"}) const result = await cotlet.call('setmore', 'find_customer', {"query":"query"}); 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"
}
]
} Get customer
readPOST 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
| Name | Type | Description |
|---|---|---|
| customer_id required | string | Customer ID from find_customer. |
Request
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"}' result = client.call("setmore", "get_customer", {"customer_id":"customer_8c41d2"}) const result = await cotlet.call('setmore', 'get_customer', {"customer_id":"customer_8c41d2"}); 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
| Name | Type | Description |
|---|---|---|
| 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 -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"}' result = client.call("setmore", "get_appointment_report", {"from":"2026-09-01","to":"2026-09-30","service_id":"svc_8f21c4"}) const result = await cotlet.call('setmore', 'get_appointment_report', {"from":"2026-09-01","to":"2026-09-30","service_id":"svc_8f21c4"}); 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
}
]
} 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
| Name | Type | Description |
|---|---|---|
| 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 -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"}' 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"}) 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"}); 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"
} 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
| Name | Type | Description |
|---|---|---|
| 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 -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"}' result = client.call("setmore", "reschedule_appointment", {"appointment_id":"apt_51d7e2b9","start":"2026-10-19T10:00:00-04:00","staff_id":"stf_5b12c7"}) const result = await cotlet.call('setmore', 'reschedule_appointment', {"appointment_id":"apt_51d7e2b9","start":"2026-10-19T10:00:00-04:00","staff_id":"stf_5b12c7"}); 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"
} 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
| Name | Type | Description |
|---|---|---|
| appointment_id required | string | Appointment ID from list_appointments. |
Request
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"}' result = client.call("setmore", "cancel_appointment", {"appointment_id":"appointment_8c41d2"}) const result = await cotlet.call('setmore', 'cancel_appointment', {"appointment_id":"appointment_8c41d2"}); cotlet call setmore cancel_appointment --data '{"appointment_id":"appointment_8c41d2"}' Example response
{
"appointment_id": "apt_62e8f3ca",
"status": "canceled",
"customer_email": "sent"
} Set appointment label
writePOST 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
| Name | Type | Description |
|---|---|---|
| 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 -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"}' result = client.call("setmore", "set_appointment_label", {"appointment_id":"apt_51d7e2b9","label":"No-Show"}) const result = await cotlet.call('setmore', 'set_appointment_label', {"appointment_id":"apt_51d7e2b9","label":"No-Show"}); 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"
} Add customer note
writePOST 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
| Name | Type | Description |
|---|---|---|
| customer_id required | string | Customer ID from find_customer. |
| note required | string | Note text. |
Request
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"}' result = client.call("setmore", "add_customer_note", {"customer_id":"customer_8c41d2","note":"note"}) const result = await cotlet.call('setmore', 'add_customer_note', {"customer_id":"customer_8c41d2","note":"note"}); 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
writePOST 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
| Name | Type | Description |
|---|---|---|
| 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 -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}' result = client.call("setmore", "block_time", {"start":"2026-10-01T09:00:00Z","duration_minutes":1}) const result = await cotlet.call('setmore', 'block_time', {"start":"2026-10-01T09:00:00Z","duration_minutes":1}); 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"
} 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
| Name | Type | Description |
|---|---|---|
| event_id required | string | Event ID from block_time. |
Request
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"}' result = client.call("setmore", "delete_event", {"event_id":"event_8c41d2"}) const result = await cotlet.call('setmore', 'delete_event', {"event_id":"event_8c41d2"}); cotlet call setmore delete_event --data '{"event_id":"event_8c41d2"}' Example response
{
"event_id": "evt_3d51a8",
"status": "deleted"
}