add_group_member
ChatGPTAdd an org member (userId from get_org) to a group. Requires an active subscription.
add_org_holidays
ChatGPTAdd one or more org closures: holidays: [{name, startDate: "YYYY-MM-DD", endDate?: "YYYY-MM-DD" (inclusive; omit for one day)}]. Exact duplicates are skipped. Existing bookings on those dates are not changed. Requires an active subscription.
approve_booking
ChatGPTApprove a pending booking request (status pending_approval). May return a conflict if the slot was taken in the meantime.
approve_reschedule
ChatGPTApprove a guest's held reschedule on an approval-required booking (a confirmed booking with proposedStartTime set — list_bookings status "requests"). Moves the booking to the proposed time and notifies the guest. May return a conflict if that time was taken meanwhile.
assign_group_territory
ChatGPTAttach a library territory to a group — every member becomes routable for it (unioned with their direct assignments). Requires an active subscription.
assign_territory
ChatGPTAssign a library territory to an org member (userId), making them routable for addresses inside it. Requires an active subscription.
billing_status
ChatGPTPersonal billing/trial status; pass orgId for that org's subscription state (admin only).
bulk_invite
ChatGPTInvite many members from a CSV or XLSX file (base64-encoded; one email per row, header optional). Requires an active subscription.
cancel_booking
ChatGPTCancel a booking (notifies the guest, cleans up the synced calendar event; paid host-cancelled bookings auto-refund). Optional reason.
cancel_invite
ChatGPTCancel a pending org invite (inviteId from list_invites).
create_drive_time_territory
ChatGPTCreate a polygon territory covering everything reachable within a drive time (5–120 minutes) of a point — a road-network isochrone, not a crow-flies radius. Provide address OR lat+lng. By default it goes into the org's shared library — auto-assigned in a one-member org, otherwise covering nobody until you assign_territory; pass userId to create it directly on that member instead. Requires an active subscription, and the server must have a routing provider configured.
create_event_type
ChatGPTCreate an event type. Personal by default; pass orgId for an org event type (round-robin across members; supports price, eligibleGroupIds, matchByTerritory). Common fields: name, slug (lowercase-hyphenated), description, duration (minutes, 5–1440), bufferBeforeMins, bufferAfterMins, minNoticeMins, maxBookingsPerDay, maxDaysOut, questions (max 10), screeningRules, approvalMode ("auto"|"manual", free events only), specializations, slotDisplay ("calendar"|"instant"). Personal event types cannot have a price.
create_group
ChatGPTCreate an org group. Body: {name}. Requires an active subscription.
create_member_territory
ChatGPTAttach an admin-assigned zone directly to one member (same {name, type, data} shapes as create_territory) — admin-only, like all territory management; the rep sees it read-only. Lands in the personal bucket of list_member_territories; org routing honors it alongside library assignments. Prefer library territories + assign_territory for areas several reps share. Requires an active subscription.
create_org
ChatGPTCreate an organization (the caller becomes its admin). Body: {name}. Orgs unlock round-robin/territory routing and paid bookings; most org features need a subscription — see onboarding_status for the checkout URL.
create_territory
ChatGPTCreate a territory. Shapes (exact — data is stored as-is and drives routing): polygon → {name, type: "polygon", data: {polygon: [[lat,lng], ...]}} (one ring, implicitly closed); radius → {name, type: "radius", data: {center: {lat, lng}, radiusMiles}}; zip_codes → {data: {zipCodes: ["55401", ...]}}; cities/counties → {data: {cities|counties: [{name, state}]}}; states/countries → {data: {states|countries: [...]}}. Use geocode_address to turn an address into lat/lng. In a one-member org the territory is assigned to that member automatically; in a larger org it covers NOBODY until you call assign_territory or assign_group_territory — and a territory-matched event type turns every guest away while no member has coverage. Requires an active subscription.
decline_booking
ChatGPTDecline a pending booking request, with an optional reason emailed to the guest.
decline_reschedule
ChatGPTDecline a guest's held reschedule. The booking stays at its current time; the guest is emailed, with the optional reason.
delete_date_override
ChatGPTRemove a date override by id (from list_date_overrides).
delete_event_type
ChatGPTDelete an event type by id. Pass orgId when it is an org event type.
delete_group
ChatGPTDelete an org group (members stay in the org; the group's territory attachments and routing references go away).
delete_member_territory
ChatGPTDelete a member's directly-assigned territory.
delete_org_holiday
ChatGPTRemove an org closure by id (from list_org_holidays), reopening those dates.
delete_territory
ChatGPTDelete a territory from the org library.
geocode_address
ChatGPTResolve a street address / city / ZIP to {lat, lng} using the same geocoder the app's territory routing uses. Use before create_territory when you only have an address.
get_availability
ChatGPTThe user's weekly availability rows (dayOfWeek 0–6, startTime/endTime "HH:MM", isClosed).
get_booking_reschedule_slots
ChatGPTAvailable slots a booking could move to, for a given date (query: date "YYYY-MM-DD").
get_experiment
ChatGPTThe event type's A/B experiment (running or last stopped), with per-variant views/bookings and significance inputs.
get_jobber_connect_url
ChatGPTBrowser URL for the human to connect the org's Jobber account (OAuth consent — cannot be completed by an agent). Requires an active subscription.
get_me
ChatGPTGet the authenticated user profile: name, email, username (the public booking link is cartoply.com/<username>), timezone, trial status.
get_member_hours
ChatGPTAn org member's weekly working hours and timezone, as the org sees them. Use before set_member_hours so you edit the real schedule rather than replacing it blind.
get_notification_prefs
ChatGPTThe user's personal email-notification preferences.
get_org
ChatGPTOrg details incl. members (admin only).
get_org_notification_prefs
ChatGPTOrg-level notification preferences (admin only).
get_org_schedule
ChatGPTThe org-level default weekly schedule (fallback for members without personal availability on org event types).
get_reassign_candidates
ChatGPTOrg members eligible to take over a booking (availability-checked), for reassign_booking.
get_report
ChatGPTBooking analytics. Personal by default; pass orgId for the whole org (admin only; optional groupId narrows to a group's members). range like "30d" | "90d" | "12m".
import_territories_commit
ChatGPTBulk-create territories from import_territories_preview candidates (all-or-nothing transaction). Body: {territories: [...]} exactly as returned by the preview (edit names/drop entries as needed). Requires an active subscription.
import_territories_preview
ChatGPTParse a Google My Maps KML/KMZ export (base64-encoded file content) and return territory candidates WITHOUT saving anything. Review the candidates, then call import_territories_commit with the ones to keep. Requires an active subscription.
integrations_status
ChatGPTWhether a Google or Outlook calendar is connected to this Cartoply account, with browser connect-URLs for the human when it is not. Connecting one lets Cartoply read busy times so booked slots are not offered, and put confirmed Cartoply bookings on that calendar. It does NOT let Cartoply add arbitrary appointments or events — this tool reports connection state, it is not a way to manage someone's calendar.
invite_members
ChatGPTEmail org invites to one or more addresses. Each recipient gets a join link (7-day expiry). Requires an active subscription.
jobber_refresh_users
ChatGPTRe-sync the org's Jobber user list (for booking→assessment assignment). Requires an active subscription.
jobber_status
ChatGPTWhether the org's Jobber account is connected, and the mapped users.
list_bookings
ChatGPTList bookings the user attends or owns. Query: status ("confirmed"|"cancelled"|"pending_approval"|"no_show"|"requests" — the last = everything awaiting review: pending requests plus confirmed bookings whose guest asked to reschedule, see proposedStartTime), payment (e.g. "refund_due"), upcoming (boolean). Omitting status returns confirmed bookings (plus no-shows for an org), so ask for status "pending_approval" explicitly to find requests still awaiting a decision. Pass orgId to see a whole org's bookings instead (admin only; supports groupId).
list_date_overrides
ChatGPTUpcoming date-specific overrides (blocked days or altered hours).
list_event_types
ChatGPTList event types. Personal by default; pass orgId for an organization's event types (org admin only).
list_google_calendars
ChatGPTThe user's Google calendars with which are currently checked for busy times (requires Google connected — see integrations_status).
list_groups
ChatGPTOrg groups (reusable member bundles used by routing, event-type eligibility, and territory assignment).
list_invites
ChatGPTPending (unexpired) org invites.
list_member_territories
ChatGPTEverything that makes one member routable, in two buckets: personal — admin-assigned zones attached directly to this member (what create_member_territory writes; reps cannot create or edit territories themselves), and assignedFromLibrary — shared org-library territories assigned to them. Org routing honors the union of both (plus group-derived assignments); the rep sees the merged set read-only on their My Territories page.
list_org_holidays
ChatGPTUpcoming org closures (holidays and other blocked date ranges). On these dates no org event type offers slots, whatever a member's own hours say.
list_orgs
ChatGPTOrganizations the user belongs to, with roles.
list_territories
ChatGPTThe org territory library (polygon and radius service areas used for territory-matched routing).
mark_booking_no_show
ChatGPTMark a booking as a no-show, or undo with noShow: false.
onboarding_status
ChatGPTThe setup checklist. Returns each onboarding step with its state and, for steps only a human can do in a browser (paying, connecting a calendar), the URL to hand to them. Call this first and after each setup step to see what remains.
reassign_booking
ChatGPTMove a booking to a different rep (repUserId from get_reassign_candidates). Guest and both reps are notified; the synced calendar event moves.
remove_group_member
ChatGPTRemove a member from a group (does NOT remove them from the org).
reschedule_booking
ChatGPTMove a booking to a new start time (ISO datetime from get_booking_reschedule_slots). Re-checks the slot under the same double-booking lock as new bookings.
resend_invite
ChatGPTRe-send a pending invite's email with a refreshed expiry (same link). Requires an active subscription.
select_google_calendars
ChatGPTSet which Google calendars are checked for busy times. Body: {calendarIds: [...]} (at least one, from list_google_calendars).
set_date_override
ChatGPTBlock a date, unblock it, or set special hours. Body: {date: "YYYY-MM-DD", isBlocked?: boolean (default true), startTime?: "HH:MM", endTime?: "HH:MM"}.
set_member_hours
ChatGPTReplace an org member's weekly working hours, and optionally their timezone. Pass the COMPLETE week in rows: {dayOfWeek: 0–6 (0=Sunday), startTime: "HH:MM", endTime: "HH:MM", isClosed?: boolean}. Send timezone (IANA, e.g. "America/Chicago") whenever the hours are meant in a specific zone — "9–5" means nothing without it, and hours saved against the wrong zone make a rep bookable in the middle of their night. Availability is global to that person, so this also changes their own booking page. Requires an active subscription.
set_org_schedule
ChatGPTSet the org default weekly schedule — the hours members fall back to when they have set none of their own. Body: {timezone (IANA, e.g. "America/Chicago"), slots: [{dayOfWeek: 0–6 (0=Sunday), startTime: "HH:MM", endTime: "HH:MM"}]}. Include one slot per working day and simply omit the days the org is closed. Note this is NOT the same shape as set_weekly_availability: there is no isClosed flag here, and the timezone is required. Requires an active subscription.
set_weekly_availability
ChatGPTReplace the weekly availability wholesale. Pass the COMPLETE week: rows of {dayOfWeek: 0–6 (0=Sunday), startTime: "HH:MM", endTime: "HH:MM", isClosed?: boolean}. One row per weekday; omitted days stay unset (org schedule may fill them); isClosed marks a deliberate day off.
start_experiment
ChatGPTStart an A/B experiment on an org event type. One running experiment per event type. variantA and variantB are the two presentation treatments being compared: each is an object overriding whitelisted fields only — today just slotDisplay, "calendar" or "instant" — and the schema is strict, so any other key is rejected. A typical test is variantA {slotDisplay:"calendar"} against variantB {slotDisplay:"instant"}. splitPercentA is the percentage of visitors shown A (1–99, default even).
stop_experiment
ChatGPTStop the running experiment. Stopping alone just ends it and records the result. To also apply a variant's overrides to the event type itself, pass BOTH winner ("A" or "B") and promote: true — promote without a winner is rejected, since there would be nothing to apply. Promoting is permanent: it overwrites the event type's settings with that variant's.
toggle_member_exclusion
ChatGPTToggle whether a member is excluded from an org event type's rotation (excluded members are never assigned its bookings).
unassign_group_territory
ChatGPTDetach a territory from a group.
unassign_territory
ChatGPTRemove a member's territory assignment.
update_event_type
ChatGPTUpdate an event type by id. Same fields as create_event_type. Pass orgId when it is an org event type.
update_group
ChatGPTRename an org group. Requires an active subscription.
update_me
ChatGPTUpdate the user profile. Fields: firstName, lastName, displayName, bio, phone, timezone (IANA name), email, onboardingCompleted.
update_member_profile
ChatGPTSet a member's org-facing displayName/bio (shown on booking pages). Requires an active subscription.
update_member_role
ChatGPTChange an org member's role: "admin" or "member". Requires an active subscription.
update_member_territory
ChatGPTUpdate a member's territory by id. Requires an active subscription.
update_notification_prefs
ChatGPTUpdate personal notification toggles: newBookingEmail, cancellationEmail, reminderEmail24h, customerConfirmationEmail (booleans).
update_org
ChatGPTUpdate org settings: name, brandPrimaryColor/brandBgColor (#hex), bookingRedirectUrl, noCoverageMessage. Requires an active subscription.
update_org_notification_prefs
ChatGPTUpdate org-level notification preferences. Requires an active subscription. Body keys are booleans: guestConfirmationEmail, guestCancellationEmail, guestRescheduleEmail, teamNewBookingEmail, teamCancellationEmail, teamRescheduleEmail, teamReminderEmail, and the guest SMS switches guestConfirmationSms, guestReminderSms, guestCancellationSms, guestRescheduleSms. The SMS switches only decide which categories are eligible — a guest is texted only if they also opted in on the booking form.
update_territory
ChatGPTUpdate a territory by id. Same shape as create_territory. Requires an active subscription.