REST API reference

Mangomint API

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

Base URL
https://cotlet.dev/api/v1/mangomint
Connects with
Your own Mangomint account (admin, or staff with the permission for the task: reports and waitlist have their own)
Integration page
Mangomint
Mangomint Endpoints
Endpoint Access Description
list_locations read Your business locations with address and time zone.
list_services read Service menu of a location with duration, price and the staff who perform each service.
list_appointments read Appointments on the calendar in a date range with client, services, staff member and notes.
find_client read Search clients by name, email or phone; returns contact details, tags and client notes.
get_client_timeline read A client's timeline: past and upcoming appointments, sales, timeline notes and form submissions.
list_waitlist read Intelligent Waitlist entries for a day, with the openings Mangomint found for each.
get_report read One of the built-in reports for a date range, as rows.
export_clients read The client list as a CSV download link, with the same filters as the Clients app.
add_client_note write Add an internal note to a client: a client note shown at booking and checkout, or a dated timeline note.
book_appointment write Book one or more services for a client with a staff member.
reschedule_appointment write Move an appointment to a new time, day or staff member.
cancel_appointment write Cancel an appointment as a normal cancellation, late cancellation or no show.
book_from_waitlist write Accept an opening Mangomint found for a waitlist entry and book it.

POST https://cotlet.dev/api/v1/mangomint/list_locations

Returns every location in your Mangomint account. Use the location_id from each item in the other tools. Most single-location businesses have one item.

Parameters

No parameters.

Request

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

Example response

{
  "locations": [
    {
      "location_id": "loc_1",
      "name": "Downtown",
      "address": "412 Alder St, Portland, OR",
      "time_zone": "America/Los_Angeles"
    }
  ]
}

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

Returns the services you can book at a location, grouped by category, with duration, price and the staff members who perform each one. Use the service_id values in book_appointment.

Parameters

Parameters: list_services
NameTypeDescription
location_id string Location ID from list_locations. Default: your main location.

Request

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

Example response

{
  "services": [
    {
      "service_id": "svc_signature_facial",
      "name": "Signature Facial",
      "category": "Facials",
      "duration_minutes": 60,
      "price": {
        "amount": 120,
        "currency": "USD"
      },
      "staff": [
        {
          "staff_id": "st_207",
          "name": "Alex"
        }
      ]
    },
    {
      "service_id": "svc_brow_shape",
      "name": "Brow Shaping",
      "category": "Brows",
      "duration_minutes": 30,
      "price": {
        "amount": 45,
        "currency": "USD"
      },
      "staff": [
        {
          "staff_id": "st_207",
          "name": "Alex"
        },
        {
          "staff_id": "st_311",
          "name": "Sam"
        }
      ]
    }
  ]
}

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

Returns appointments in a date range in start order, each with client, services, staff member, start, end and appointment note. Filter by staff member to read one calendar. Canceled appointments are left out unless include_canceled is true.

Parameters

Parameters: list_appointments
NameTypeDescription
location_id string Location ID from list_locations. Default: your main location.
from required date First day, inclusive.
to date Last day, inclusive. Default: same as from.
staff_id string Only this staff member.
include_canceled boolean Also return canceled and no-show appointments. Default: false.

Request

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

Example response

{
  "appointments": [
    {
      "appointment_id": "ap_903114",
      "client": {
        "client_id": "cl_48213",
        "name": "Jamie Doe"
      },
      "services": [
        {
          "service_id": "svc_signature_facial",
          "name": "Signature Facial"
        }
      ],
      "staff": {
        "staff_id": "st_207",
        "name": "Alex"
      },
      "start": "2026-10-12T14:00:00-07:00",
      "end": "2026-10-12T15:00:00-07:00",
      "status": "booked",
      "note": null
    }
  ]
}

POST https://cotlet.dev/api/v1/mangomint/find_client

Searches your client list and returns every match with contact details, tags and client notes. Client notes are the internal notes Mangomint shows when you book or check out that client. Pass client_id to the other client tools.

Parameters

Parameters: find_client
NameTypeDescription
query required string Name, email or phone number.

Request

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

Example response

{
  "clients": [
    {
      "client_id": "cl_48213",
      "name": "Jamie Doe",
      "email": "client@example.com",
      "phone": "+15035550142",
      "tags": [
        "VIP"
      ],
      "client_notes": [
        "Prefers fragrance-free products"
      ]
    }
  ]
}

POST https://cotlet.dev/api/v1/mangomint/get_client_timeline

Returns entries from one client's timeline, newest first: appointments, sales, timeline notes and submitted forms. Use limit to read the latest few visits before a booking.

Parameters

Parameters: get_client_timeline
NameTypeDescription
client_id required string Client ID from find_client.
limit integer 1 to 100 entries, newest first. Default: 25.

Request

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

Example response

{
  "client_id": "cl_48213",
  "entries": [
    {
      "type": "appointment",
      "date": "2026-09-14T14:00:00-07:00",
      "summary": "Signature Facial with Alex"
    },
    {
      "type": "sale",
      "date": "2026-09-14T15:05:00-07:00",
      "summary": "Checkout, 1 service, 1 product"
    },
    {
      "type": "timeline_note",
      "date": "2026-09-14T15:10:00-07:00",
      "summary": "Skin was dry; added hydrating serum"
    }
  ]
}

POST https://cotlet.dev/api/v1/mangomint/list_waitlist

Returns the waitlist entries for one day with the openings Mangomint found for each. Needs the Intelligent Waitlist app enabled and an Admin user or the Can manage waitlist permission. Pass entry_id and opening_id to book_from_waitlist.

Parameters

Parameters: list_waitlist
NameTypeDescription
location_id string Location ID from list_locations. Default: your main location.
date required date Calendar day to read.

Request

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

Example response

{
  "entries": [
    {
      "entry_id": "wl_2207",
      "client": {
        "client_id": "cl_51007",
        "name": "Priya Shah"
      },
      "service": "Signature Facial",
      "openings": [
        {
          "opening_id": "op_88a1",
          "staff": "Alex",
          "start": "2026-10-13T11:00:00-07:00"
        }
      ]
    }
  ]
}

Get report

read

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

Returns one of the reports from the Reports app as rows. Sales Summary gives service and product quantities and sales totals for each day; Client Retention gives how many clients from the period visited again within 90 or 180 days. Needs an Admin user or the Can access company reports permission.

Parameters

Parameters: get_report
NameTypeDescription
report required enum sales_summary, service_sales, product_sales, sales_by_time_period, sales_by_staff, canceled_appointments or client_retention.
from required date First day, inclusive.
to required date Last day, inclusive.
location_ids string[] Locations to include. Default: all.

Request

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

Example response

{
  "report": "sales_summary",
  "from": "2026-10-05",
  "to": "2026-10-11",
  "currency": "USD",
  "rows": [
    {
      "date": "2026-10-05",
      "services_qty": 31,
      "services_total": 3120,
      "products_qty": 6,
      "products_total": 214,
      "total": 3334
    },
    {
      "date": "2026-10-06",
      "services_qty": 28,
      "services_total": 2870,
      "products_qty": 4,
      "products_total": 148,
      "total": 3018
    },
    {
      "date": "2026-10-07",
      "services_qty": 35,
      "services_total": 3540,
      "products_qty": 9,
      "products_total": 302,
      "total": 3842
    },
    {
      "date": "2026-10-08",
      "services_qty": 33,
      "services_total": 3315,
      "products_qty": 5,
      "products_total": 176,
      "total": 3491
    },
    {
      "date": "2026-10-09",
      "services_qty": 41,
      "services_total": 4210,
      "products_qty": 12,
      "products_total": 388,
      "total": 4598
    },
    {
      "date": "2026-10-10",
      "services_qty": 47,
      "services_total": 4760,
      "products_qty": 10,
      "products_total": 341,
      "total": 5101
    },
    {
      "date": "2026-10-11",
      "services_qty": 12,
      "services_total": 1180,
      "products_qty": 2,
      "products_total": 64,
      "total": 1244
    }
  ],
  "totals": {
    "services_qty": 227,
    "services_total": 22995,
    "products_qty": 48,
    "products_total": 1633,
    "total": 24628
  }
}

POST https://cotlet.dev/api/v1/mangomint/export_clients

Applies the filters you give, as the Clients app does, and returns a link to the CSV file. Combine last_visit_days_ago and has_future_appointment to find clients who have not come back. The file has contact details, so open the link yourself.

Parameters

Parameters: export_clients
NameTypeDescription
last_visit_days_ago integer Only clients whose last appointment was more than this many days ago.
has_future_appointment boolean Only clients with (true) or without (false) a future appointment.
tag string Only clients with this tag.

Request

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

Example response

{
  "status": "ready",
  "filters": {
    "last_visit_days_ago": 90,
    "has_future_appointment": false
  },
  "row_count": 42,
  "download_url": "https://files.cotlet.example/exports/mangomint-clients-2026-10-11.csv",
  "expires_at": "2026-10-11T22:00:00+02:00"
}

POST https://cotlet.dev/api/v1/mangomint/add_client_note

Adds an internal note to a client profile. A client note shows whenever staff book, view or check out that client; a timeline note is a dated entry on the client timeline. Notes are never shown to the client and reach no one, so add_client_note runs without asking first.

Parameters

Parameters: add_client_note
NameTypeDescription
client_id required string Client ID from find_client.
text required string Note text. Internal, never shown to the client.
kind enum client or timeline. Default: timeline.

Request

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

Example response

{
  "client_id": "cl_48213",
  "kind": "client",
  "status": "added",
  "text": "Allergic to lavender oil"
}

Book appointment

write Confirm

POST https://cotlet.dev/api/v1/mangomint/book_appointment

Books the services in the order given, back to back, for one client with one staff member at the start time. The staff member must be on the schedule and free for the full length. Returns the appointment with start and end. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: book_appointment
NameTypeDescription
client_id required string Client ID from find_client.
location_id string Location ID from list_locations. Default: your main location.
service_ids required string[] Service IDs from list_services, in order.
staff_id required string Staff member performing the services.
start required datetime ISO 8601 with time zone.
note string Appointment note.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/mangomint/book_appointment \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"client_id":"cl_48213","location_id":"loc_1","service_ids":["svc_signature_facial"],"staff_id":"st_207","start":"2026-10-16T14:00:00-07:00"}'
Python
result = client.call("mangomint", "book_appointment", {"client_id":"cl_48213","location_id":"loc_1","service_ids":["svc_signature_facial"],"staff_id":"st_207","start":"2026-10-16T14:00:00-07:00"})
Node.js
const result = await cotlet.call('mangomint', 'book_appointment', {"client_id":"cl_48213","location_id":"loc_1","service_ids":["svc_signature_facial"],"staff_id":"st_207","start":"2026-10-16T14:00:00-07:00"});
CLI
cotlet call mangomint book_appointment --data '{"client_id":"cl_48213","location_id":"loc_1","service_ids":["svc_signature_facial"],"staff_id":"st_207","start":"2026-10-16T14:00:00-07:00"}'

Example response

{
  "appointment_id": "ap_903114",
  "status": "booked",
  "client": {
    "client_id": "cl_48213",
    "name": "Jamie Doe"
  },
  "services": [
    {
      "service_id": "svc_signature_facial",
      "name": "Signature Facial",
      "duration_minutes": 60
    }
  ],
  "staff": {
    "staff_id": "st_207",
    "name": "Alex"
  },
  "start": "2026-10-16T14:00:00-07:00",
  "end": "2026-10-16T15:00:00-07:00"
}

Reschedule appointment

write Confirm

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

Moves one appointment to a new start and, if you pass staff_id, to another staff member, as dragging it on the calendar does. Mangomint sends its automated reschedule message only for changes clients make in the client portal, so set notify_client to true to tell the client about this one. 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.
notify_client boolean Send the client a notification about the change. Default: false.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/mangomint/reschedule_appointment \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"appointment_id":"ap_903114","start":"2026-10-13T11:00:00-07:00","staff_id":"st_311","notify_client":true}'
Python
result = client.call("mangomint", "reschedule_appointment", {"appointment_id":"ap_903114","start":"2026-10-13T11:00:00-07:00","staff_id":"st_311","notify_client":True})
Node.js
const result = await cotlet.call('mangomint', 'reschedule_appointment', {"appointment_id":"ap_903114","start":"2026-10-13T11:00:00-07:00","staff_id":"st_311","notify_client":true});
CLI
cotlet call mangomint reschedule_appointment --data '{"appointment_id":"ap_903114","start":"2026-10-13T11:00:00-07:00","staff_id":"st_311","notify_client":true}'

Example response

{
  "appointment_id": "ap_903114",
  "status": "rescheduled",
  "staff": {
    "staff_id": "st_207",
    "name": "Alex"
  },
  "start": "2026-10-13T11:00:00-07:00",
  "end": "2026-10-13T12:00:00-07:00",
  "client_notified": true
}

Cancel appointment

write Confirm

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

Cancels one appointment with the cancellation type you choose: normal (the client canceled within the cancellation period), late (after it) or no_show. The client is notified if cancellation notifications are on in Mangomint. A late cancellation or no show does not charge a fee by itself; the fee is added at checkout. 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.
type required enum normal, late or no_show.

Request

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

Example response

{
  "appointment_id": "ap_903210",
  "status": "canceled",
  "type": "late"
}

Book from waitlist

write Confirm

POST https://cotlet.dev/api/v1/mangomint/book_from_waitlist

Accepts one opening for one waitlist entry, the same as Book on the calendar notification, and puts the client on the calendar. Needs an Admin user or the Can manage waitlist permission. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: book_from_waitlist
NameTypeDescription
entry_id required string Waitlist entry ID from list_waitlist.
opening_id required string Opening ID from the same entry.

Request

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

Example response

{
  "entry_id": "wl_2207",
  "status": "booked",
  "appointment_id": "ap_903377",
  "client": {
    "client_id": "cl_51007",
    "name": "Priya Shah"
  },
  "staff": {
    "staff_id": "st_207",
    "name": "Alex"
  },
  "start": "2026-10-13T11:00:00-07:00"
}