Modern documentation for integrations, automations, dashboards, and Jane AI receptionist.
This page is your product hub for snapshots, field mappings, implementation guidance, public APIs, and Jane AI receptionist endpoints.
Field sync map
How syncing works
ClinicSync Pro keeps your clinic data flowing automatically between Jane, Cliniko, Nookal, PtEverywhere, PromptEMR, Simple Practice, Halaxy, Practice Better and many more, and GoHighLevel — with robust automations for booking, reminders, reactivation, and reporting.
What gets synced?
Supported automations
This is the operating layer between your EMR, GHL, automation stack, and reporting.
Walkthrough videos & tutorials

Jane App ClinicSync Pro AI Receptionist™
We’ve now made it possible to use the ClinicSync Pro Jane AI Receptionist inside GoHighLevel Voice AI.
Watch on YouTube
Jane + GHL Full Integration Walkthrough
How to automate no-show follow-ups, reviews, reactivation, and enable 2-way calendar sync between Jane App and GoHighLevel — with real automations you can copy.
Watch on YouTube
Cliniko + GHL Full Integration Walkthrough
ClinicSync Pro’s Cliniko integration: reminders, no-show/cancellation follow-up, AI booking, and advanced reactivation — real snapshot demo and best practices.
Watch on YouTube
PT Everywhere + GHL Integration
Automate your PT clinic: see how all custom fields sync, how to build automations for reminders, reactivation, and reviews with PT Everywhere and GHL.
Watch on YouTube
Voice AI Booking with GHL + EMR
How to connect Jane or Cliniko calendars to GoHighLevel for real-time Voice AI booking — perfect for agencies and clinics wanting automated phone bookings.
Watch on YouTubeReady-to-use GHL snapshots
Instantly clone our recommended GoHighLevel snapshot for your EMR and automation setup. You’ll get the workflows, fields, and pipelines used in the demos.
Jane <=> GHL Voice AI Receptionist
For ClinicSync Pro AI Receptionist™ with GHL Voice AI AgentDownload snapshotROI Dashboard (Add-On)
For clinics and agencies that want full ROI reporting inside a sub-account. $15/mo per location.Download snapshotJane Integration Snapshot
Prebuilt GHL setup for Jane with the core automation stack.Download snapshotPtEverywhere Integration Snapshot
Prebuilt GHL setup for PtEverywhere with automation support.Download snapshotCliniko Integration Snapshot
Prebuilt GHL setup for Cliniko with reminders, reactivation, and review flows.Download snapshotNookal Integration Snapshot
Prebuilt GHL setup for Nookal and downstream automation.Download snapshotPractice Better Integration Snapshot
Prebuilt GHL setup for Practice Better and client follow-up logic.Download snapshotSimple Practice Integration Snapshot
Prebuilt GHL setup for Simple Practice and automation rollout.Download snapshotNeed custom setup instead of DIY? Use office hours or paid setup instead of wasting time guessing.
Data security & privacy
Troubleshooting & support
Common questions
Jane AI Receptionist API
You only get access to the endpoints below if your location has an active Jane AI Receptionist subscription inside ClinicSync Pro.
- If Jane AI Receptionist is not enabled, these endpoints will reject the request.
- Your x-api-key only works for the Jane-connected location it was issued for.
- Voice endpoints are for Jane AI Receptionist subscribers only. They are not part of the normal Jane sync package.
Authentication and access
Base URL: https://jane-aiserver.clinicsyncpro.xyz
All endpoints require x-api-key. For most /ai_brain endpoints you can send locationId in the JSON body or let ClinicSync Pro resolve it from the API key.
The /voice endpoints are GET routes built for voice agents and query-string driven automations.
Core Jane AI Receptionist endpoints
Fetch Staff
Returns practitioners and clinic staff, including disciplines, treatment IDs, and location IDs.
Send x-api-key. Body can include locationId, or omit it and let ClinicSync Pro resolve it from your API key.
Fetch Treatments
Returns bookable Jane treatments and services, including duration, price, and location availability.
Use this before availability or booking so your agent works with valid treatment names and IDs.
Fetch Locations
Returns Jane clinic locations, including address, phone, and booking URL metadata.
Useful when your clinic has multiple locations and the AI needs to narrow the booking target.
Fetch Availability (Range)
Returns Jane availability for a practitioner within a specific UTC datetime range.
Send ISO 8601 UTC datetimes with milliseconds, for example 2026-04-18T13:59:59.999Z.
Fetch Availability (Next 7 Days)
Returns Jane availability for the next 7 days for a practitioner and clinic location.
Best for quick booking flows when you want near-term openings only.
Lookup or Create Patient
Finds an existing patient or creates one in Jane before booking.
Typical inputs are first_name, last_name, phone, email, city, state, and country.
Fetch Patient Appointments
Returns a patient's appointments, including timing, practitioner, treatment, and booking state.
Useful for appointment lookup, confirmation flows, and pre-cancel/pre-reschedule checks.
Create Appointment Slot
Creates a provisional Jane appointment object before final confirmation.
This is step one of the booking flow. Do not skip it if you are using the direct booking endpoints.
Book Appointment
Confirms a provisional appointment and finalises the booking in Jane.
Use after createAppt. The payload expects the provisional appointment context, not just an appointment ID.
Cancel Appointment
Cancels an existing Jane appointment.
Optional flags include cancelled_reason, with_notifications, and send_wlns.
Reschedule Appointment
Updates an existing Jane appointment to a new time and related booking details.
Use when your app already has the Jane appointment ID and the new slot details.
Voice AI endpoints
Voice Clinic Info
Returns AI-enabled staff, treatments, and locations from cached Jane AI config, with a live Jane fallback if cache is empty.
Designed for voice agents. Requires Jane AI Receptionist to be enabled for the location.
Voice Best Slot
Finds one best-fit booking slot for a requested treatment, provider preference, and location.
Typical query params: treatment_name, optional staff_member_name, clinic_location_name, requested_time_utc, and required time_zone.
Voice Book
Voice-first booking flow that resolves provider, location, treatment, patient, and slot, then books the appointment.
Typical query params include first_name, last_name, phone, email, start_at, end_at, treatment_name, and either staff/location IDs or names.
Voice Cancel
Cancels an appointment using appointment_id directly or by finding the patient’s next booked appointment from phone details.
Typical query params include phone or appointment_id, plus optional first_name, last_name, and cancelled_reason.
Voice Reschedule
Reschedules an appointment using appointment_id directly or by resolving the patient and their next booked appointment.
Typical query params include phone or appointment_id, plus required new_start_at and new_end_at, and optional provider/location IDs.
Voice Patient Appointments
Returns a patient’s upcoming appointments for voice confirmation, cancellation, or rescheduling flows.
Typical query params include phone, or first_name and last_name together.
Recommended implementation order
- Read staff, treatments, and locations.
- Check availability or use best slot logic.
- Lookup or create the patient.
- Create and confirm the booking, or use the voice booking route.
- Use patientAppointments, cancel, or reschedule for post-booking flows.
- Your location must have AI Booking enabled in ClinicSync Pro.
- If you see a "not enabled for booking" error, go to your dashboard and enable AI Booking, or contact support for access.
- Each API key only works for the linked location it was issued for.
Jane API Endpoints – Book, Update, and Cancel Appointments
If you are using GoHighLevel, you must use the following webhook URLs instead of the endpoints below:
- Book appointment:
https://jane-api.clinikoconnect.com/bookAppt - Cancellation:
https://jane-api.clinikoconnect.com/cancel_appt - Re-schedule:
https://jane-api.clinikoconnect.com/update_appt
👉 Make sure you DO NOT add any headers or API key when using the above webhooks. Please make sure to download the GHL snapshot here: GHL Integration Snapshot
Authentication
All endpoints require the x-api-key header. Find your API key in your dashboard under “Manage API / Webhooks.”
- Each API key is mapped to a specific Jane-connected location. You cannot book for another location with your key.
Book Appointment
POST /api-book-appointment
Host: jane-api.clinikoconnect.com
x-api-key: YOUR_API_KEY_HERE
Content-Type: application/json
{
"customData": {
"staff_member": "practitioner@email.com",
"treatment_name": "Physio Consult",
"clinic_location_name": "Pitt St Clinic",
"roomName": "Room 2"
},
"calendar": {
"startTime": "2024-08-02T10:00:00Z",
"endTime": "2024-08-02T10:30:00Z",
"selectedTimezone": "Australia/Sydney",
"appointmentId": "abc123-xyz"
},
"first_name": "Sam",
"last_name": "Smith",
"email": "sam.smith@example.com",
"phone": "+61400000000"
// city, state, country optional
}{
"message": "Appointment booked successfully",
"bookedAppointment": { /* Jane appointment object */ }
}- 401 Unauthorized: API key missing or invalid.
- 400 Bad Request: Required booking fields missing.
- 422 Unprocessable Entity: Invalid staff, treatment, or time.
- 500: Server error (try again or contact support).
Update (Reschedule) Appointment
POST /api-update-appointment
Host: jane-api.clinikoconnect.com
x-api-key: YOUR_API_KEY_HERE
Content-Type: application/json
{
"calendar": {
"appointmentId": "abc123-xyz",
"startTime": "2024-08-02T12:00:00Z",
"endTime": "2024-08-02T12:30:00Z",
"selectedTimezone": "Australia/Sydney"
}
}{
"success": true,
"appointment": { /* Updated Jane appointment object */ }
}- 401 Unauthorized: API key missing or invalid.
- 400 Bad Request: Required fields missing.
- 404 Not Found: Appointment not found.
- 422 Unprocessable Entity: Update failed (check new times, or try again).
Cancel Appointment
POST /jane-api.clinikoconnect.com
Host: api-sync.clinicsyncpro.com
x-api-key: YOUR_API_KEY_HERE
Content-Type: application/json
{
"appointmentId": "abc123-xyz",
"cancelled_reason": "Patient requested cancellation",
"with_notifications": true,
"send_wlns": true
}{
"success": true,
"appointment": { /* Jane appointment cancellation response */ }
}- 401 Unauthorized: API key missing or invalid.
- 400 Bad Request: Required cancel fields missing.
- 404 Not Found: Appointment not found.
- 422 Unprocessable Entity: Cancel failed (already cancelled, or wrong id).
Webhook Payload (For non GHL Users): Jane Patient Update
When a patient is created or updated, your webhook receives a JSON body with all the following fields:
View full live sync field map →
View Example Payload
{
"id": 164,
"first_name": "waseem",
"last_name": "khan",
"middle_name": null,
"name": "waseem khan",
"email": "waseemkhan@gmail.com",
"home_phone": null,
"work_phone": null,
"mobile_phone": null,
"prefix": null,
"addressable_name": "waseem",
"fax_phone": null,
"street_address": null,
"street_address_2": null,
"city": "San Francisco",
"province": "CA",
"postal": "66666",
"country": "US",
"personal_health_number": null,
"dob": "1999-01-09",
"member_since": "2025-09-10",
"patient_number": "164",
"send_notifications": false,
"send_sms_notifications": false,
"email_wait_list_notifications": true,
"sms_wait_list_notifications": false,
"email_auto_pay_balance_notifications": true,
"sms_auto_pay_balance_notifications": true,
"enable_financial_notifications": true,
"enable_auto_pay_balance_notifications": true,
"reminder_type_ids": [],
"last_login": null,
"msp_eligible": "invalid",
"guardian_name": null,
"referral_source": null,
"referring_staff_member_id": null,
"marketing_emails": false,
"gender": "male",
"identifying_gender": null,
"do_not_email": false,
"ratings_emails": true,
"preferred_name": null,
"preferred_first_name": "waseem",
"all_names": "waseem khan",
"pronouns": null,
"occupation": null,
"employer": null,
"staff_member_id": null,
"staff_user": false,
"emergency_contact_name": null,
"emergency_contact_phone": null,
"emergency_contact_relationship": null,
"referring_professional": null,
"referring_professional_phone": null,
"referring_professional_email": null,
"family_doctor": null,
"family_doctor_phone": null,
"family_doctor_email": null,
"medical_alert": null,
"discharged": true,
"deceased": false,
"online_booking_policy": null,
"online_booking_payment_policy": null,
"primary_phone": null,
"test_patient": null,
"patient_type": "standard",
"public_id": "01993461-b2ec-71b9-82d6-fb47d6fe9db3",
"selected_reminder_types": [],
"last_appointment": {
"id": 7217,
"location_id": 1,
"room_id": 1,
"resource_ids": [],
"start_at": "2025-09-08T10:00:00-07:00",
"end_at": "2025-09-08T10:20:00-07:00",
"patient_id": 164,
"primary_patient_id": 164,
"staff_member_id": 1,
"staff_member_name": "Demo Owner",
"treatment_id": 32,
"archived_at": null,
"no_show_at": null,
"cancelled_at": null,
"booked_at": "2025-09-10T09:17:01-07:00",
"break": false,
"state": "arrived",
"additional_states": [],
"arrived_at": "2025-09-10T09:17:06-07:00",
"checked_in_at": null,
"patient_name": "waseem khan",
"patient_is_primary": true,
"primary_patient_name": "waseem khan",
"patient": {
"prefix": null,
"first_name": "waseem",
"preferred_first_name": "waseem",
"last_name": "khan",
"dob": "1999-01-09"
},
"primary_patient": {
"prefix": null,
"first_name": "waseem",
"preferred_first_name": "waseem",
"last_name": "khan",
"dob": "1999-01-09"
},
"patient_video_session_state": null,
"treatment_name": "In-Person Consult (New Client)",
"color": "user2",
"capacity": 1,
"class_booking": false,
"parent_appointment_id": null,
"participant_count": 0,
"arrived_participant_count": 0,
"purchase_id": 7468,
"sale_id": 6893,
"purchased": true,
"purchase_state": "no_charge",
"patient_paid": true,
"has_notes": false,
"notes_text": "",
"first_visit": true,
"insurance_state": [
{
"name": "Aetna",
"number": "333333333333",
"invoice_state": "no_charge",
"claim_state": "unsubmitted",
"claim_id": 238
}
],
"updated_at": "2025-09-10T09:17:06-07:00",
"chart_status": "none",
"reschedulable": false,
"order_id": 6893,
"order_item_id": 7468,
"pass": {
"quantity_interval": null
},
"pass_id": null,
"package_id": null,
"membership_id": null,
"child_appointment_ids": [],
"original_appointment_id": null,
"rescheduled": false,
"cancelled": false,
"online_only": false,
"wait_list_block": false,
"booking_type": "one_on_one_booking",
"group_booking": false,
"treatment_add_ons": [],
"referral_source": "JANE"
},
"upcoming_appointments": [
{
"id": 7215,
"location_id": 1,
"room_id": 1,
"resource_ids": [],
"start_at": "2025-09-11T10:15:00-07:00",
"end_at": "2025-09-11T10:35:00-07:00",
"patient_id": 164,
"primary_patient_id": 164,
"staff_member_id": 1,
"staff_member_name": "Demo Owner",
"treatment_id": 30,
"archived_at": null,
"no_show_at": null,
"cancelled_at": null,
"booked_at": "2025-09-10T09:11:04-07:00",
"break": false,
"state": "arrived",
"additional_states": [],
"arrived_at": "2025-09-10T09:12:29-07:00",
"checked_in_at": null,
"patient_name": "waseem khan",
"patient_is_primary": true,
"primary_patient_name": "waseem khan",
"patient": {
"prefix": null,
"first_name": "waseem",
"preferred_first_name": "waseem",
"last_name": "khan",
"dob": "1999-01-09"
},
"primary_patient": {
"prefix": null,
"first_name": "waseem",
"preferred_first_name": "waseem",
"last_name": "khan",
"dob": "1999-01-09"
},
"patient_video_session_state": null,
"treatment_name": "Online Consult (New Client)",
"color": "user2",
"capacity": 1,
"class_booking": false,
"parent_appointment_id": null,
"participant_count": 0,
"arrived_participant_count": 0,
"purchase_id": 7467,
"sale_id": 6892,
"purchased": true,
"purchase_state": "unpaid",
"patient_paid": true,
"has_notes": false,
"notes_text": "",
"first_visit": false,
"insurance_state": [
{
"name": "Aetna",
"number": "333333333333",
"invoice_state": "unpaid",
"claim_state": "unsubmitted",
"claim_id": 238
}
],
"updated_at": "2025-09-10T09:12:29-07:00",
"chart_status": "none",
"reschedulable": false,
"order_id": 6892,
"order_item_id": 7467,
"pass": {
"quantity_interval": null
},
"pass_id": null,
"package_id": null,
"membership_id": null,
"child_appointment_ids": [],
"original_appointment_id": null,
"rescheduled": false,
"cancelled": false,
"online_only": false,
"wait_list_block": false,
"booking_type": "one_on_one_booking",
"group_booking": false,
"treatment_add_ons": [],
"referral_source": "JANE"
}
],
"logins": [],
"relationships": [],
"received_relationships": [],
"default_adjustments": [],
"passes": [],
"credit_card_details": [],
"notes": [],
"photo": null,
"photo_lg": null,
"appointments_count": 2,
"upcoming_appointments_count": 1,
"active_booking_reminders_count": 0,
"no_show_count": 0,
"chart_entries_count": 0,
"relationships_count": 0,
"email_status": "unverified",
"email_ok": true,
"email_intake_form_ok": true,
"email_notify_ok": true,
"mobile_status": "not_present",
"mobile_ok": false,
"balance": 0,
"available_credit": 0,
"amount_owing": 0,
"claims_amount_owing": 105,
"loyalty_balance": 0,
"additional_receipt_recipients": false,
"last_payment_reminder": null,
"second_upcoming_appointment": [
{
"id": 7216,
"location_id": 1,
"room_id": 1,
"resource_ids": [],
"start_at": "2025-09-11T11:00:00-07:00",
"end_at": "2025-09-11T11:15:00-07:00",
"patient_id": 164,
"primary_patient_id": null,
"staff_member_id": 1,
"staff_member_name": "Demo Owner",
"treatment_id": null,
"archived_at": "2025-09-10T09:22:59-07:00",
"no_show_at": null,
"cancelled_at": null,
"booked_at": null,
"break": false,
"state": "never_booked",
"additional_states": [],
"arrived_at": null,
"checked_in_at": null,
"patient_name": "waseem khan",
"patient_is_primary": false,
"primary_patient_name": " ",
"patient": {
"prefix": null,
"first_name": "waseem",
"preferred_first_name": "waseem",
"last_name": "khan",
"dob": "1999-01-09"
},
"primary_patient": {
"prefix": null,
"first_name": null,
"preferred_first_name": null,
"last_name": null,
"dob": null
},
"patient_video_session_state": null,
"treatment_name": null,
"color": null,
"capacity": null,
"class_booking": false,
"parent_appointment_id": null,
"participant_count": 0,
"arrived_participant_count": 0,
"purchase_id": null,
"sale_id": null,
"purchased": false,
"purchase_state": null,
"patient_paid": false,
"has_notes": false,
"notes_text": "",
"first_visit": false,
"insurance_state": null,
"updated_at": "2025-09-10T09:22:59-07:00",
"chart_status": "none",
"reschedulable": false,
"order_id": null,
"order_item_id": null,
"pass": {
"quantity_interval": null
},
"pass_id": null,
"package_id": null,
"membership_id": null,
"child_appointment_ids": [],
"original_appointment_id": null,
"rescheduled": false,
"cancelled": false,
"online_only": null,
"wait_list_block": false,
"booking_type": null,
"group_booking": false,
"treatment_add_ons": [],
"referral_source": "JANE"
}
],
"total_purchased": 105,
"last_updated_date_via_api": "2025-09-11T01:28:15.912Z",
"total_payment_amount": 0,
"total_remaining_balance": 0,
"total_payment_made": 0,
"total_appt_booked": 0,
"total_appt_cancelled": 0,
"total_appt_no_show": 0,
"total_appt_arrived": 2,
"total_appt_rescheduled": 0,
"patient_notes": "",
"credit_card_expiry_formatted": null,
"intake_forms_summary": "",
"appointmentsObject": [
{
"id": 7217,
"location_id": 1,
"room_id": 1,
"resource_ids": [],
"start_at": "2025-09-08T10:00:00-07:00",
"end_at": "2025-09-08T10:20:00-07:00",
"patient_id": 164,
"primary_patient_id": 164,
"staff_member_id": 1,
"staff_member_name": "Demo Owner",
"treatment_id": 32,
"archived_at": null,
"no_show_at": null,
"cancelled_at": null,
"booked_at": "2025-09-10T09:17:01-07:00",
"break": false,
"state": "arrived",
"additional_states": [],
"arrived_at": "2025-09-10T09:17:06-07:00",
"checked_in_at": null,
"patient_name": "waseem khan",
"patient_is_primary": true,
"primary_patient_name": "waseem khan",
"patient": {
"prefix": null,
"first_name": "waseem",
"preferred_first_name": "waseem",
"last_name": "khan",
"dob": "1999-01-09"
},
"primary_patient": {
"prefix": null,
"first_name": "waseem",
"preferred_first_name": "waseem",
"last_name": "khan",
"dob": "1999-01-09"
},
"patient_video_session_state": null,
"treatment_name": "In-Person Consult (New Client)",
"color": "user2",
"capacity": 1,
"class_booking": false,
"parent_appointment_id": null,
"participant_count": 0,
"arrived_participant_count": 0,
"purchase_id": 7468,
"sale_id": 6893,
"purchased": true,
"purchase_state": "no_charge",
"patient_paid": true,
"has_notes": false,
"notes_text": "",
"first_visit": true,
"insurance_state": [
{
"name": "Aetna",
"number": "333333333333",
"invoice_state": "no_charge",
"claim_state": "unsubmitted",
"claim_id": 238
}
],
"updated_at": "2025-09-10T09:17:06-07:00",
"chart_status": "none",
"reschedulable": false,
"order_id": 6893,
"order_item_id": 7468,
"pass": {
"quantity_interval": null
},
"pass_id": null,
"package_id": null,
"membership_id": null,
"child_appointment_ids": [],
"original_appointment_id": null,
"rescheduled": false,
"cancelled": false,
"online_only": false,
"wait_list_block": false,
"booking_type": "one_on_one_booking",
"group_booking": false,
"treatment_add_ons": [],
"referral_source": "JANE"
},
{
"id": 7216,
"location_id": 1,
"room_id": 1,
"resource_ids": [],
"start_at": "2025-09-11T11:00:00-07:00",
"end_at": "2025-09-11T11:15:00-07:00",
"patient_id": 164,
"primary_patient_id": null,
"staff_member_id": 1,
"staff_member_name": "Demo Owner",
"treatment_id": null,
"archived_at": "2025-09-10T09:22:59-07:00",
"no_show_at": null,
"cancelled_at": null,
"booked_at": null,
"break": false,
"state": "never_booked",
"additional_states": [],
"arrived_at": null,
"checked_in_at": null,
"patient_name": "waseem khan",
"patient_is_primary": false,
"primary_patient_name": " ",
"patient": {
"prefix": null,
"first_name": "waseem",
"preferred_first_name": "waseem",
"last_name": "khan",
"dob": "1999-01-09"
},
"primary_patient": {
"prefix": null,
"first_name": null,
"preferred_first_name": null,
"last_name": null,
"dob": null
},
"patient_video_session_state": null,
"treatment_name": null,
"color": null,
"capacity": null,
"class_booking": false,
"parent_appointment_id": null,
"participant_count": 0,
"arrived_participant_count": 0,
"purchase_id": null,
"sale_id": null,
"purchased": false,
"purchase_state": null,
"patient_paid": false,
"has_notes": false,
"notes_text": "",
"first_visit": false,
"insurance_state": null,
"updated_at": "2025-09-10T09:22:59-07:00",
"chart_status": "none",
"reschedulable": false,
"order_id": null,
"order_item_id": null,
"pass": {
"quantity_interval": null
},
"pass_id": null,
"package_id": null,
"membership_id": null,
"child_appointment_ids": [],
"original_appointment_id": null,
"rescheduled": false,
"cancelled": false,
"online_only": null,
"wait_list_block": false,
"booking_type": null,
"group_booking": false,
"treatment_add_ons": [],
"referral_source": "JANE"
},
{
"id": 7215,
"location_id": 1,
"room_id": 1,
"resource_ids": [],
"start_at": "2025-09-11T10:15:00-07:00",
"end_at": "2025-09-11T10:35:00-07:00",
"patient_id": 164,
"primary_patient_id": 164,
"staff_member_id": 1,
"staff_member_name": "Demo Owner",
"treatment_id": 30,
"archived_at": null,
"no_show_at": null,
"cancelled_at": null,
"booked_at": "2025-09-10T09:11:04-07:00",
"break": false,
"state": "arrived",
"additional_states": [],
"arrived_at": "2025-09-10T09:12:29-07:00",
"checked_in_at": null,
"patient_name": "waseem khan",
"patient_is_primary": true,
"primary_patient_name": "waseem khan",
"patient": {
"prefix": null,
"first_name": "waseem",
"preferred_first_name": "waseem",
"last_name": "khan",
"dob": "1999-01-09"
},
"primary_patient": {
"prefix": null,
"first_name": "waseem",
"preferred_first_name": "waseem",
"last_name": "khan",
"dob": "1999-01-09"
},
"patient_video_session_state": null,
"treatment_name": "Online Consult (New Client)",
"color": "user2",
"capacity": 1,
"class_booking": false,
"parent_appointment_id": null,
"participant_count": 0,
"arrived_participant_count": 0,
"purchase_id": 7467,
"sale_id": 6892,
"purchased": true,
"purchase_state": "unpaid",
"patient_paid": true,
"has_notes": false,
"notes_text": "",
"first_visit": false,
"insurance_state": [
{
"name": "Aetna",
"number": "333333333333",
"invoice_state": "unpaid",
"claim_state": "unsubmitted",
"claim_id": 238
}
],
"updated_at": "2025-09-10T09:12:29-07:00",
"chart_status": "none",
"reschedulable": false,
"order_id": 6892,
"order_item_id": 7467,
"pass": {
"quantity_interval": null
},
"pass_id": null,
"package_id": null,
"membership_id": null,
"child_appointment_ids": [],
"original_appointment_id": null,
"rescheduled": false,
"cancelled": false,
"online_only": false,
"wait_list_block": false,
"booking_type": "one_on_one_booking",
"group_booking": false,
"treatment_add_ons": [],
"referral_source": "JANE"
}
]
}}Need additional fields or help? Contact us.
- Your location must have AI Booking enabled in ClinicSync Pro.
- If you see a "not enabled for booking" error, go to your dashboard and enable AI Booking, or contact support for access.
- Each API key only works for the linked location it was issued for.
Cliniko API Endpoints – Book, Update, and Cancel Appointments
If you are using GoHighLevel, you must use the following webhook URLs instead of the endpoints below:
- Book appointment:
https://cliniko-api.clinikoconnect.com/bookAppt - Cancellation:
https://cliniko-api.clinikoconnect.com/cancel_appt - Re-schedule:
https://cliniko-api.clinikoconnect.com/update_appt
👉 Make sure you DO NOT add any headers or API key when using the above webhooks. Please make sure to download the GHL snapshot here: GHL Integration Snapshot
Authentication
All endpoints require the x-api-key header, found in your dashboard under “Manage API / Webhooks”.
- Each API key is mapped to a specific Cliniko-connected location. You cannot book for another clinic with your key.
Book Appointment
POST /api-book-appointment
Host: cliniko-api.clinikoconnect.com
x-api-key: YOUR_API_KEY_HERE
Content-Type: application/json
{
"customData": {
"staff_member": "practitioner@email.com",
"appt_type_name": "Physio Consult",
"appt_type_category": "Physiotherapy",
"appt_type_duration": "30",
"business_name": "Downtown Health"
},
"calendar": {
"startTime": "2024-08-02T10:00:00Z",
"endTime": "2024-08-02T10:30:00Z",
"selectedTimezone": "Australia/Sydney",
"appointmentId": "abc123-xyz"
},
"first_name": "Sam",
"last_name": "Smith",
"email": "sam.smith@example.com",
"phone": "+61400000000"
}{
"success": true,
"appointment": { /* Cliniko appointment object */ }
}- 401 Unauthorized: API key missing or invalid.
- 400 Bad Request: Required booking fields missing.
- 422 Unprocessable Entity: Invalid practitioner, appointment type, or business name.
- 500: Unhandled errors (try again, or contact support).
Update Appointment
POST /api-update-appointment
Host: cliniko-api.clinikoconnect.com
x-api-key: YOUR_API_KEY_HERE
Content-Type: application/json
{
"calendar": {
"appointmentId": "abc123-xyz",
"startTime": "2024-08-02T11:00:00Z",
"endTime": "2024-08-02T11:30:00Z",
"selectedTimezone": "Australia/Sydney"
}
}{
"success": true,
"appointment": { /* Updated Cliniko appointment object */ }
}- 401 Unauthorized: API key missing or invalid.
- 400 Bad Request: Required update fields missing.
- 404 Not Found: Appointment not found.
- 422 Unprocessable Entity: Appointment could not be updated (check times, or try again).
Cancel Appointment
POST /api-cancel-appointment
Host: cliniko-api.clinikoconnect.com
x-api-key: YOUR_API_KEY_HERE
Content-Type: application/json
{
"appointmentId": "abc123-xyz",
"cancellation_note": "Client requested cancellation",
"cancellation_reason": 50
}{
"success": true,
"appointment": { /* Cliniko appointment cancellation response */ }
}- 401 Unauthorized: API key missing or invalid.
- 400 Bad Request: Required cancel fields missing.
- 404 Not Found: Appointment not found.
- 422 Unprocessable Entity: Appointment could not be cancelled (already cancelled, wrong id, etc).
Webhook Payload (For Non GHL Users): Cliniko Patient Update
When a patient is created or updated, your webhook receives a JSON body with all the following fields:
View Example Payload
{
"firstName": "Sam",
"lastName": "Smith",
"email": "sam.smith@example.com",
"phone": "+61400000000",
"dateOfBirth": "1990-01-01",
"state": "NSW",
"city": "Sydney",
"upcoming_appointment_cancelled_at": "...",
"upcoming_appointment_cancellation_reason": "...",
"upcoming_appointment_name": "...",
"last_appointment_name": "...",
"last_updated_date_via_api": "...",
"last_appointment_cancelled_at": "...",
"last_appointment_did_not_arrive": "...",
"last_appointment_cancellation_reason": "...",
"upcoming_appointment_reminder_start_time": "...",
"patient_id": "123456",
"upcoming_appointment_start_time": "...",
"upcoming_appointment_business_name": "...",
"upcoming_appointment_practitioner_name": "...",
"upcoming_appointment_type": "...",
"upcoming_appointment_counts": 1,
"accepted_email_marketing": "Yes/No",
"accepted_sms_marketing": "Yes/No",
"total_amount_spent": 1000,
"total_amount_spent_this_month": 200,
"total_number_of_appointments": 15,
"last_appointment_start_time": "...",
"last_appointment_business_name": "...",
"last_appointment_practitioner_name": "...",
"last_appointment_type": "..."
}PtEverywhere API Endpoints – Patient Sync (Appointments Coming Soon)
Authentication
All endpoints require the x-api-key header, found in your dashboard under “Manage API / Webhooks”.
- Each API key is mapped to a specific PT Everywhere location. You cannot sync for another location with your key.
Webhook Payload (For Non GHL Users): PtE Patient Update
When a patient is created or updated in PtEverywhere, your webhook receives the following JSON fields:
View Example Payload
{
"contact": {
"firstName": "Jane",
"lastName": "Doe",
"email": "jane.doe@example.com",
"phone": "+15551234567",
"address1": "123 Main Street",
"dateOfBirth": "1990-05-20",
"customFieldData": {
"last_updated_date_via_api": "2025-09-23T10:00:00.000Z",
"TotalNumberOfVisits": 12,
"PatientId": "abc123fakeid",
"Age": 35,
"LastSeenBy": "Dr. Alex Smith",
"LastVisit": "2025-09-15T14:00:00.000Z",
"NextVisit": "2025-09-25T09:30:00.000Z",
"NextVisit_serviceName": "Physical Therapy",
"NextVisit_locationName": "Downtown Clinic",
"NextVisit_provider": "Dr. Alex Smith",
"NextVisit_status": "Scheduled",
"FirstAppt": "2021-06-01",
"TotalRevenue": 3200,
"TotalCollected": 2800,
"Primary_payer": "Insurance A",
"Secondary_payer": "Insurance B",
"Tertiary_payer": "-",
"active_cases": "M54.50: Low back pain, unspecified"
}
},
"appointments": {
"appt_001": {
"_id": "appt_001",
"Deleted": false,
"Version": 2,
"Client": "fake_client_id",
"Booker": {
"_id": "booker_001",
"Roles": ["Admin"],
"FirstName": "Staff",
"LastName": "Member",
"Phone": "+15559876543",
"Email": "staff@exampleclinic.com"
},
"Attendee": {
"_id": "patient_001",
"FirstName": "Jane",
"LastName": "Doe",
"Email": "jane.doe@example.com",
"Phone": "+15551234567"
},
"Location": {
"_id": "loc_001",
"Name": "Downtown Clinic",
"City": "New York",
"State": "NY",
"ZipCode": "10001"
},
"Service": {
"_id": "svc_001",
"Name": "Physical Therapy",
"Amount": 150,
"Type": "Service"
},
"PatientInvoice": {
"_id": "inv_001",
"PaymentStatus": "paid",
"InvoiceCode": "INV-20250923-001"
},
"Type": "Standard",
"Status": "Completed",
"StartDateTime": "2025-09-15T14:00:00.000Z",
"EndDateTime": "2025-09-15T15:00:00.000Z",
"CreatedDate": "2025-09-10T12:00:00.000Z",
"id": "appt_001"
},
"appt_002": {
"_id": "appt_002",
"Deleted": false,
"Version": 2,
"Client": "fake_client_id",
"Location": {
"_id": "loc_002",
"Name": "Uptown Clinic",
"City": "New York",
"State": "NY",
"ZipCode": "10002"
},
"Service": {
"_id": "svc_002",
"Name": "Initial Consultation",
"Amount": 200,
"Type": "Service"
},
"Status": "Scheduled",
"StartDateTime": "2025-09-25T09:30:00.000Z",
"EndDateTime": "2025-09-25T10:30:00.000Z",
"id": "appt_002"
}
// ... more appointment objects will be included here
// (all past and upcoming appointments for this patient)
}
}
- Your connection must have AI Booking enabled in ClinicSync Pro.
- If you see a "not enabled for booking" error, go to your dashboard and enable AI Booking, or contact support for access.
- Each API key only works for the linked location it was issued for.
Nookal API Endpoints – Book, Update, and Cancel Appointments
Authentication
All endpoints require the x-api-key header, found in your dashboard under “Manage API / Webhooks”.
- Each API key is mapped to a specific Nookal-connected location. You cannot book for another location with your key.
- Your connection must have AI Booking enabled in ClinicSync Pro.
Book Appointment
POST /api/nookal/book_appt
Host: nookal-api.clinikoconnect.com
x-api-key: YOUR_API_KEY_HERE
Content-Type: application/json
{
"customData": {
"locationName": "Parramatta Physio",
"region": "AU",
"basicKey": "YOUR_NOOKAL_BASIC_KEY",
"serviceCode": "PHYSIO30",
"practitionerName": "Dr. Jane Doe"
},
"calendar": {
"startTime": "2024-08-02T10:00:00Z",
"appointmentId": "abc123-xyz"
},
"patientFirstName": "Sam",
"patientLastName": "Smith",
"patientDOB": "1990-01-01",
"patientEmail": "sam.smith@example.com",
"patientMobile": "+61400000000"
}{
"success": true,
"apptID": 123456,
"appointment": { /* Nookal appointment object */ }
}- 401 Unauthorized: API key missing or invalid.
- 400 Bad Request: Missing required fields.
- 422 Unprocessable Entity: Invalid practitioner, service code, or time.
- 500: Server error (try again, or contact support).
Update (Reschedule) Appointment
POST /api/nookal/update_appt
Host: nookal-api.clinikoconnect.com
x-api-key: YOUR_API_KEY_HERE
Content-Type: application/json
{
"calendar": {
"appointmentId": "123456",
"startTime": "2024-08-02T11:00:00Z"
}
}{
"success": true,
"updated": { /* Updated Nookal appointment object */ }
}- 401 Unauthorized: API key missing or invalid.
- 400 Bad Request: Required fields missing.
- 404 Not Found: Appointment not found.
- 422 Unprocessable Entity: Update failed (invalid times, or already canceled).
Cancel Appointment
POST /api/nookal/cancel_appt
Host: nookal-api.clinikoconnect.com
x-api-key: YOUR_API_KEY_HERE
Content-Type: application/json
{
"appointmentId": "123456"
}{
"success": true,
"canceled": { /* Nookal appointment cancellation object */ }
}- 401 Unauthorized: API key missing or invalid.
- 400 Bad Request: Required cancel fields missing.
- 404 Not Found: Appointment not found.
- 422 Unprocessable Entity: Cancel failed (already canceled, or wrong id).
Webhook Payload(For Non GHL Users): Nookal Patient & Appointment Update
When a patient or appointment is updated in Nookal, your webhook receives a JSON payload with the following fields (example below):
View Example Payload
{
"last_updated_date_via_api": "2024-07-31",
"patient_id": "123456",
"firstName": "Sam",
"lastName": "Smith",
"email": "sam.smith@example.com",
"phone": "+61400000000",
"dateOfBirth": "1990-01-01",
"state": "NSW",
"city": "Sydney",
"gender": "Female",
"address1": "123 Main St",
"postalCode": "2000",
"appointments_count": 15,
"last_appt_arrived": "2024-07-20T10:00:00Z",
"last_appt_dna": null,
"last_appt_cancelled": "2024-07-10T09:30:00Z",
"last_appt_cancellationDate": "2024-07-10",
"last_appt_practitioner_name": "Dr. Jane Doe",
"last_appt_type": "Physio Consult",
"last_appt_location": "Parramatta Physio",
"last_appt_date": "2024-07-20",
"upcoming_appt_type": "Follow Up",
"upcoming_appt_location": "Parramatta Physio",
"upcoming_appt_date": "2024-08-02",
"upcoming_appt_practitioner_name": "Dr. Jane Doe",
"upcoming_appt_reminder_time": "2024-08-02T09:00:00Z",
"total_amount_paid": 1200,
"total_unpaid_balance": 0
}SimplePractice API Integration
ClinicSync Pro provides a supported SimplePractice integration layer that allows you to book, update, and cancel appointments programmatically even though SimplePractice does not offer a public booking API.
All authentication is performed internally using encrypted clinic credentials. Your system only needs to call these three API endpoints.
What Gets Synced
For each active SimplePractice account, ClinicSync Pro syncs:
- Client profile (name, email, phone, timezone)
- Total paid & outstanding balance
- Cancelled / no-show / arrived counts
- Last appointment details
- Next appointment details
Synced data is delivered to GoHighLevel or to your webhook (if enabled).
Create Appointment
Creates a new appointment inside SimplePractice. Requires an API key issued by ClinicSync Pro.
POST https://sp-api.clinikoconnect.com/appointments/book
Headers:
x-api-key: YOUR_API_KEY
Body:
{
"firstName": "John",
"lastName": "Doe",
"email": "john@example.com",
"apptStart": "2025-03-20T10:00:00Z",
"apptEnd": "2025-03-20T10:50:00Z",
"serviceCode": "90791",
"clinicianEmail": "therapist@example.com"
}
Response:
{
"status": "booked",
"appointment": {
"id": "SP_APPT_ID",
"start": "2025-03-20T10:00:00Z",
"end": "2025-03-20T10:50:00Z",
"serviceCode": "90791",
"duration": 50,
"clientId": "1234",
"clinicianId": "5678",
"practiceId": "9999",
"source": "SimplePractice"
}
}This is the endpoint your AI agent or external workflow uses to generate new bookings.
Update Appointment
Updates the start/end time of an existing appointment.
POST https://sp-api.clinikoconnect.com/appointments/update
Headers:
x-api-key: YOUR_API_KEY
Body:
{
"appointmentId": "YOUR_EXTERNAL_APPT_ID",
"apptStart": "2025-03-20T11:00:00Z",
"apptEnd": "2025-03-20T11:50:00Z",
"serviceCode": "90791",
"clinicianEmail": "therapist@example.com"
}
Response:
{
"status": "updated",
"appointment": {
"id": "SP_APPT_ID",
"start": "2025-03-20T11:00:00Z",
"end": "2025-03-20T11:50:00Z",
"serviceCode": "90791"
}
}Cancel Appointment
Cancels an appointment inside SimplePractice.
POST https://sp-api.clinikoconnect.com/appointments/cancel
Headers:
x-api-key: YOUR_API_KEY
Body:
{
"appointmentId": "YOUR_EXTERNAL_APPT_ID"
}
Response:
{
"ok": true,
"deleted": true,
"appointmentId": "SP_APPT_ID"
}Webhook Payload(For Non GHL Users): SimplePractice Client & Appointment Update
When a client or appointment is created, updated, or cancelled in SimplePractice, your webhook receives a JSON payload with the following fields (example below):
View Example Payload
{
"client_id": "789012",
"last_updated_date_via_api": "2025-03-18",
"last_appt_start_at": "2025-03-15T10:00:00Z",
"last_appt_end_at": "2025-03-15T10:50:00Z",
"last_appt_location_name": "Downtown Clinic",
"last_appt_treatment_name": "Physio Initial",
"last_appt_staff_member_name": "Dr. Jane Doe",
"last_appt_state": "arrived",
"upcoming_appt_start_at": "2025-04-02T09:00:00Z",
"upcoming_appt_end_at": "2025-04-02T09:50:00Z",
"upcoming_appt_location_name": "Downtown Clinic",
"upcoming_appt_treatment_name": "Physio Follow-Up",
"upcoming_appt_staff_member_name": "Dr. Jane Doe",
"upcoming_appt_state": "booked",
"upcoming_appt_reminder_start_time": "2025-04-02T08:30:00Z",
"total_payment_made": 520,
"total_remaining_balance": 0,
"total_appt_arrived": 6,
"total_appt_cancelled": 1,
"total_appt_no_show": 0
}Practice Better API Integration
ClinicSync Pro provides a supported Practice Better integration layer that allows you to book, update, and cancel sessions programmatically using a unified API.
Practice Better authentication is handled internally via OAuth. Your system only needs to call these three API endpoints.
What Gets Synced
For each active Practice Better account, ClinicSync Pro syncs:
- Client profile (name, email)
- Session details (upcoming, completed, cancelled)
- Consultant attribution
- Service name and duration
- Diet and Life Style details
- Appointment lifecycle events (booked, updated, cancelled)
All booking state is tracked internally and mapped back to GoHighLevel.
Create Session
Creates a new confirmed session inside Practice Better. Supports GoHighLevel webhooks or direct API usage.
POST https://pb-api.clinicsyncpro.com/bookSession
Headers:
x-api-key: YOUR_API_KEY (optional)
Body:
{
"apptStart": "2026-02-01T01:00:00Z",
"apptEnd": "2026-02-01T01:30:00Z",
"serviceName": "Initial Consultation",
"consultantEmail": "practitioner@clinic.com",
"apptDuration": 30,
"apptId": "EXTERNAL_APPT_ID",
"firstName": "John",
"lastName": "Doe",
"email": "john@example.com"
}
Response:
{
"status": "booked",
"appointmentId": "PB_SESSION_ID"
}Update Session
Reschedules an existing Practice Better session.
POST https://pb-api.clinicsyncpro.com/rescheduleSession
Headers:
x-api-key: YOUR_API_KEY (optional)
Body:
{
"appointmentId": "EXTERNAL_APPT_ID",
"apptStart": "2026-02-02T02:00:00Z",
"apptEnd": "2026-02-02T02:30:00Z"
}
Response:
{
"status": "updated",
"appointment": {
"id": "PB_SESSION_ID",
"start": "2026-02-02T02:00:00Z",
"end": "2026-02-02T02:30:00Z",
"duration": 30
}
}Cancel Session
Cancels a session inside Practice Better.
POST https://pb-api.clinicsyncpro.com/cancelSession
Headers:
x-api-key: YOUR_API_KEY (optional)
Body:
{
"appointmentId": "EXTERNAL_APPT_ID"
}
Response:
{
"ok": true,
"cancelled": true,
"appointmentId": "PB_SESSION_ID"
}Webhook Payload (For non GHL Users): Practice Better Client & Session Update
When a client or session is created, updated, or cancelled in Practice Better, your webhook receives a JSON payload with the following fields (example below):
View Example Payload
{
"client_id": "123456",
"client_isActive": true,
"client_status": "active",
"client_preferredName": "Sam",
"client_referredBy": "Google",
"client_notes": "Prefers morning sessions",
"client_amountPaid": 350,
"session_service_name": "Initial Consultation",
"session_serviceType": "Consultation",
"session_consultant_firstName": "Jane",
"session_consultant_lastName": "Doe",
"session_consultant_emailAddress": "practitioner@example.com",
"session_sessionDate": "2025-03-20T10:00:00Z",
"session_endDate": "2025-03-20T10:50:00Z",
"session_duration": 50,
"session_actualDuration": 48,
"session_location_name": "Sydney Clinic",
"session_location_address": "123 Main St, Sydney NSW",
"session_location_room": "Room 2",
"session_paymentStatus": "paid",
"session_fee_amount": 175,
"session_cancelled": false,
"session_upcoming": false,
"session_isRecurring": false,
"session_isSubscription": false,
"session_hasRecording": false,
"session_confirmationStatus": "confirmed",
"session_clientConfirmationStatus": "confirmed",
"session_dateConfirmed": "2025-03-19T08:30:00Z",
"session_dateCreated": "2025-03-18T12:10:00Z",
"session_dateModified": "2025-03-18T12:15:00Z",
"session_notes": "Follow up in 2 weeks",
"dietLifestyle_dateCreated": "2025-03-01",
"dietLifestyle_dietaryRestrictions": "Gluten free",
"dietLifestyle_drinksCoffee": true,
"dietLifestyle_drinksAlcohol": false,
"dietLifestyle_smoker": false,
"dietLifestyle_exerciseInformation": "Gym 3x per week",
"dietLifestyle_sleepInformation": "6–7 hours",
"dietLifestyle_mainStressors": "Work deadlines",
"dietLifestyle_hasPets": true,
"dietLifestyle_notes": "High stress during workdays"
}Join office hours and get unstuck faster
Use this if you want implementation help, automation advice, or live answers on API setup, snapshots, dashboards, and Jane AI receptionist.
Join office hours