REST API reference

DaySmart API

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

Base URL
https://cotlet.dev/api/v1/daysmart
Connects with
Your own DaySmart Salon or DaySmart Pet cloud account (some reports depend on your user role)
Integration page
DaySmart
DaySmart Endpoints
Endpoint Access Description
list_appointments read Appointments in the Appointment Book for a date range, with client, pet, services, employee and status.
get_appointment read Full ticket: services and products with prices, deposit, appointment notes, confirmation type and the Appointment Log.
find_clients read Search clients by name, phone or email.
get_client read Client profile with contact details, client notes, balance, upcoming appointments and pets with their notes.
list_vaccination_alerts read DaySmart Pet: pets whose vaccinations are expired or expire before a date, with the vaccine and expiration date.
list_waitlist read Waitlist entries with client, requested services, preferred employee, preferred dates and comment.
list_services read Services with category, duration and price, as set up in your account.
list_employees read Active employees with the services they can perform.
run_report read Run a built-in report (for example Sales by Day of the Week, Client Spending, Employee Performance Report) and return its rows.
book_appointment write Book a client (and pet) for one or more services, or convert a waitlist entry. DaySmart sends the client its Appointment Scheduled message.
update_appointment write Change date, time, duration, employee, price or notes. DaySmart sends the client an Appointment Changed message.
void_appointment write Void an appointment with a reason, and optionally void its credit card transactions.
update_pet_notes write DaySmart Pet: set the General, Grooming, Personality and Medical notes of a pet.
add_vaccination write DaySmart Pet: record a vaccine with its expiration date on the pet's Medical Information.
send_pickup_text write Text the client that their pet is ready, from the appointment ticket.

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

Returns appointments for a date range, oldest start time first, as shown in the Appointment Book. Filter by employee to get one groomer's day. Each item has the ticket ID that get_appointment, update_appointment and send_pickup_text take.

Parameters

Parameters: list_appointments
NameTypeDescription
from required date First day.
to date Last day. Default: same as from.
employee_id string Only this employee, from list_employees.

Request

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

Example response

{
  "appointments": [
    {
      "appointment_id": "a_771204",
      "start": "2026-10-16T10:00:00-04:00",
      "end": "2026-10-16T11:30:00-04:00",
      "status": "Scheduled",
      "client": "Yourname Client",
      "client_id": "c_48211",
      "pet": "Max",
      "employee": "Sam",
      "services": [
        "Full Groom"
      ]
    },
    {
      "appointment_id": "a_771231",
      "start": "2026-10-16T13:00:00-04:00",
      "end": "2026-10-16T14:00:00-04:00",
      "status": "Scheduled",
      "client": "Dana Lee",
      "client_id": "c_50177",
      "pet": "Poppy",
      "employee": "Sam",
      "services": [
        "Bath & Brush"
      ]
    }
  ]
}

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

Returns one ticket with services, prices, appointment notes and confirmation type. The Appointment Log lists each change with time, user and status, the same as at the bottom of the ticket in DaySmart.

Parameters

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

Request

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

Example response

{
  "appointment_id": "a_771204",
  "status": "Scheduled",
  "start": "2026-10-16T10:00:00-04:00",
  "client": "Yourname Client",
  "pet": "Max",
  "employee": "Sam",
  "services": [
    {
      "name": "Full Groom",
      "price": 75
    }
  ],
  "appointment_notes": "Short summer cut, nails too.",
  "confirmation_type": "Text",
  "log": [
    {
      "at": "2026-10-09T15:12:00-04:00",
      "user": "Front desk",
      "status": "Scheduled"
    }
  ]
}

POST https://cotlet.dev/api/v1/daysmart/find_clients

Returns matching clients with their IDs and pets, best match first. Use client_id with get_client and book_appointment.

Parameters

Parameters: find_clients
NameTypeDescription
query required string Name, phone or email, full or partial.
limit integer 1 to 50. Default: 10.

Request

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

Example response

{
  "clients": [
    {
      "client_id": "c_48211",
      "name": "Yourname Client",
      "phone": "+1 555 010 0148",
      "pets": [
        {
          "pet_id": "p_90315",
          "name": "Max"
        }
      ]
    }
  ]
}

Get client

read

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

Returns the client profile, client notes (staff only), balance, upcoming appointments and each pet with its Comments in General, Grooming, Personality and Medical. Pets exist in DaySmart Pet only.

Parameters

Parameters: get_client
NameTypeDescription
client_id required string Client ID from find_clients.

Request

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

Example response

{
  "client_id": "c_48211",
  "name": "Yourname Client",
  "email": "client@example.com",
  "balance": 0,
  "client_notes": "Prefers Friday mornings.",
  "upcoming": [
    {
      "appointment_id": "a_771204",
      "start": "2026-10-16T10:00:00-04:00"
    }
  ],
  "pets": [
    {
      "pet_id": "p_90315",
      "name": "Max",
      "breed": "Poodle",
      "notes": {
        "general": "",
        "grooming": "Short summer cut.",
        "personality": "Friendly",
        "medical": ""
      }
    }
  ]
}

POST https://cotlet.dev/api/v1/daysmart/list_vaccination_alerts

Returns pets with a vaccination record that is expired or expires before the date you give, soonest first. DaySmart flags vaccinations 3 months ahead. A pet with no record for a required vaccine is not listed.

Parameters

Parameters: list_vaccination_alerts
NameTypeDescription
expiring_before date Include vaccinations expiring before this date. Default: today.
upcoming_only boolean Only pets with an upcoming appointment. Default: false.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/daysmart/list_vaccination_alerts \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"expiring_before":"2026-11-02","upcoming_only":true}'
Python
result = client.call("daysmart", "list_vaccination_alerts", {"expiring_before":"2026-11-02","upcoming_only":True})
Node.js
const result = await cotlet.call('daysmart', 'list_vaccination_alerts', {"expiring_before":"2026-11-02","upcoming_only":true});
CLI
cotlet call daysmart list_vaccination_alerts --data '{"expiring_before":"2026-11-02","upcoming_only":true}'

Example response

{
  "alerts": [
    {
      "pet_id": "p_90315",
      "pet": "Max",
      "client": "Yourname Client",
      "vaccine": "Rabies",
      "expires": "2026-10-22",
      "next_appointment": "2026-10-16T10:00:00-04:00"
    }
  ]
}

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

Returns the entries in the Waitlist section of the Appointment Book. Preferred employee is a name or First Available. Pass waitlist_entry_id to book_appointment to convert an entry.

Parameters

Parameters: list_waitlist
NameTypeDescription
date date Only entries that prefer this date.

Request

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

Example response

{
  "entries": [
    {
      "waitlist_entry_id": "w_3302",
      "client": "Yourname Client",
      "client_id": "c_48211",
      "pet_id": "p_90315",
      "employee": "First Available",
      "preferred": [
        "2026-10-16 afternoon"
      ],
      "services": [
        "Full Groom"
      ],
      "comment": "Any time after 1pm."
    }
  ]
}

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

Returns the services set up in your DaySmart account. Use service_id with book_appointment.

Parameters

Parameters: list_services
NameTypeDescription
category string Only this service category.

Request

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

Example response

{
  "services": [
    {
      "service_id": "s_112",
      "name": "Full Groom",
      "category": "Grooming",
      "duration_minutes": 90,
      "price": 75
    }
  ]
}

POST https://cotlet.dev/api/v1/daysmart/list_employees

Returns active employees. Services follow the employee service limitations set in DaySmart. Use employee_id with list_appointments and book_appointment.

Parameters

No parameters.

Request

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

Example response

{
  "employees": [
    {
      "employee_id": "e_7",
      "name": "Sam",
      "services": [
        "Full Groom",
        "Bath & Brush"
      ]
    }
  ]
}

Run report

read

POST https://cotlet.dev/api/v1/daysmart/run_report

Runs a report from More, then Reports, and returns its rows as JSON. Most reports take a date range; a few have none. If your user role has no access to a report category, the call fails with a permission error or returns no rows.

Parameters

Parameters: run_report
NameTypeDescription
report required string Report name exactly as in Reports, e.g. "Sales By Employee Category".
from date Start of the date range, for reports that have one.
to date End of the date range.
employee_id string Filter by employee, for reports that allow it.

Request

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

Example response

{
  "report": "Sales By Employee Category",
  "from": "2026-10-05",
  "to": "2026-10-11",
  "rows": [
    {
      "employee": "Sam",
      "category": "Grooming",
      "total": 1420
    },
    {
      "employee": "Jess",
      "category": "Grooming",
      "total": 980
    }
  ],
  "total": 2400
}

Book appointment

write Confirm

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

Creates the appointment in the Appointment Book. With waitlist_entry_id it converts that entry and keeps its details. DaySmart sends the Appointment Scheduled message by email, text or both, per your settings. 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_clients.
start required datetime Start time, ISO 8601 with time zone.
services required object List of { service_id, employee_id, pet_id? }.
appointment_notes string Appointment notes for the ticket.
waitlist_entry_id string Convert this waitlist entry into the appointment.

Request

cURL
curl -X POST https://cotlet.dev/api/v1/daysmart/book_appointment \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"client_id":"c_48211","start":"2026-10-16T14:00:00-04:00","services":[{"service_id":"s_112","employee_id":"e_7","pet_id":"p_90315"}],"waitlist_entry_id":"w_3302"}'
Python
result = client.call("daysmart", "book_appointment", {"client_id":"c_48211","start":"2026-10-16T14:00:00-04:00","services":[{"service_id":"s_112","employee_id":"e_7","pet_id":"p_90315"}],"waitlist_entry_id":"w_3302"})
Node.js
const result = await cotlet.call('daysmart', 'book_appointment', {"client_id":"c_48211","start":"2026-10-16T14:00:00-04:00","services":[{"service_id":"s_112","employee_id":"e_7","pet_id":"p_90315"}],"waitlist_entry_id":"w_3302"});
CLI
cotlet call daysmart book_appointment --data '{"client_id":"c_48211","start":"2026-10-16T14:00:00-04:00","services":[{"service_id":"s_112","employee_id":"e_7","pet_id":"p_90315"}],"waitlist_entry_id":"w_3302"}'

Example response

{
  "appointment_id": "a_771290",
  "status": "Scheduled",
  "start": "2026-10-16T14:00:00-04:00",
  "end": "2026-10-16T15:30:00-04:00",
  "client": "Yourname Client",
  "services": [
    {
      "name": "Full Groom",
      "employee": "Sam",
      "pet": "Max",
      "price": 75
    }
  ],
  "converted_from_waitlist": "w_3302"
}

Update appointment

write Confirm

POST https://cotlet.dev/api/v1/daysmart/update_appointment

Edits the fields you can change under Appt Details. DaySmart sends Appointment Changed on every update, even a small one like a duration change. If the assigned employee is inactive, DaySmart blocks the edit. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: update_appointment
NameTypeDescription
appointment_id required string Appointment (ticket) ID from list_appointments.
fields required object Any of start, duration_minutes, employee_id, price, appointment_notes, confirmation_type.

Request

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

Example response

{
  "appointment_id": "a_771204",
  "status": "Scheduled",
  "start": "2026-10-16T11:00:00-04:00",
  "end": "2026-10-16T12:30:00-04:00",
  "employee": "Sam",
  "client_notified": true
}

Void appointment

write Confirm

POST https://cotlet.dev/api/v1/daysmart/void_appointment

Uses the Void action on the ticket, which needs a reason. Voiding does not refund a payment by itself: with void_card_transactions true the card payments are voided and refunded, with false the original charge stays and can be applied to a new ticket as a Custom Payment. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: void_appointment
NameTypeDescription
appointment_id required string Appointment (ticket) ID from list_appointments.
reason required string Why the appointment is voided.
void_card_transactions boolean Void and refund the ticket's credit card payments. Default: true.

Request

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

Example response

{
  "appointment_id": "a_771231",
  "status": "Voided",
  "reason": "Client moved away",
  "card_transactions_voided": true
}

POST https://cotlet.dev/api/v1/daysmart/update_pet_notes

Replaces the text of each note category you send and leaves the others as they are. Notes are for staff only; no client or employee is notified, and one call restores the old text, so this tool does not ask for your OK.

Parameters

Parameters: update_pet_notes
NameTypeDescription
pet_id required string Pet ID from get_client.
fields required object Any of general_notes, grooming_notes, personality_notes, medical_notes.

Request

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

Example response

{
  "pet_id": "p_90315",
  "name": "Max",
  "notes": {
    "general": "",
    "grooming": "Nervous with dryers. Use low heat.",
    "personality": "Friendly",
    "medical": ""
  }
}

POST https://cotlet.dev/api/v1/daysmart/add_vaccination

Adds the vaccine with its Expiration date under Medical Information. The vaccine must be on your Master Vaccination list. No client is notified and one more call fixes a wrong date, so this tool does not ask for your OK.

Parameters

Parameters: add_vaccination
NameTypeDescription
pet_id required string Pet ID from get_client.
vaccine required string Vaccine name as on your Master Vaccination list.
expires required date Expiration date.

Request

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

Example response

{
  "pet_id": "p_90315",
  "vaccinations": [
    {
      "vaccine": "Rabies",
      "expires": "2027-09-30"
    }
  ]
}

POST https://cotlet.dev/api/v1/daysmart/send_pickup_text

Sends the one-way Ready For Pickup text from the ticket. DaySmart keeps no saved default message, so you give the text each time. It counts toward your monthly text allotment and needs texting set up with client opt-in. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: send_pickup_text
NameTypeDescription
appointment_id required string Appointment (ticket) ID from list_appointments.
message required string Text to send to the client.

Request

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

Example response

{
  "appointment_id": "a_771204",
  "sent": true,
  "channel": "text",
  "message": "Max is ready for pickup. See you soon!"
}