ClinicSync Pro docs

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.

8+
Supported EMR platforms
Near real-time
Syncs, booking actions, and automation triggers
Agency-ready
Snapshots, API endpoints, and rollout docs in one place
Best for
Clinic owners, agencies, and developers
Includes
Setup guidance, snapshots, webhook payloads, and public APIs
Important
Jane AI receptionist endpoints require an active subscription
Quick start

Field sync map

For a complete list of fields and exactly what gets synced between your EMR and GoHighLevel, use the live mapping sheet below.
Overview

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.

Near real-time
Syncing every 5–45 minutes for contacts, appointments, invoices, and purchases.
Fully automated
No exports, no spreadsheets, and no manual pushes once the connection is live.
Tenant isolated
Each clinic’s data, keys, and syncs stay isolated.
Data coverage

What gets synced?

Contacts
All patients and clients, including name, phone, email, DOB, and much more.
Appointments
Past and future bookings, cancellations, no-shows, practitioner, room, and notes.
Invoices & payments
Revenue, payment source, and outstanding balances.
Purchases
Packages, products, and related revenue context.
Custom fields
Enriched GHL contacts with total visits, last and next appointment, status, retention, and ROI fields.
Automation layer

Supported automations

AI Booking
Book appointments from SMS, email, or your website with live EMR-aware availability.
No-show & reactivation
Trigger reminder, win-back, and follow-up flows from actual EMR activity.
Review requests
Automatically request Google reviews after attended visits.
KPI & ROI dashboards
Track patients, revenue, retention, and ad ROI in live reporting dashboards.
Voice AI booking
Enable phone-based AI booking with GHL and live EMR calendar intelligence.

This is the operating layer between your EMR, GHL, automation stack, and reporting.

Learn visually

Walkthrough videos & tutorials

Real product demos. No filler.
Jane App ClinicSync Pro AI Receptionist™

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

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

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

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

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 YouTube
Deployment shortcuts

Ready-to-use GHL snapshots

Clone the exact workflows and fields faster.

Instantly clone our recommended GoHighLevel snapshot for your EMR and automation setup. You’ll get the workflows, fields, and pipelines used in the demos.

Snapshot

Jane <=> GHL Voice AI Receptionist

For ClinicSync Pro AI Receptionist™ with GHL Voice AI AgentDownload snapshot
Snapshot

ROI Dashboard (Add-On)

For clinics and agencies that want full ROI reporting inside a sub-account. $15/mo per location.Download snapshot
Snapshot

Jane Integration Snapshot

Prebuilt GHL setup for Jane with the core automation stack.Download snapshot
Snapshot

PtEverywhere Integration Snapshot

Prebuilt GHL setup for PtEverywhere with automation support.Download snapshot
Snapshot

Cliniko Integration Snapshot

Prebuilt GHL setup for Cliniko with reminders, reactivation, and review flows.Download snapshot
Snapshot

Nookal Integration Snapshot

Prebuilt GHL setup for Nookal and downstream automation.Download snapshot
Snapshot

Practice Better Integration Snapshot

Prebuilt GHL setup for Practice Better and client follow-up logic.Download snapshot
Snapshot

Simple Practice Integration Snapshot

Prebuilt GHL setup for Simple Practice and automation rollout.Download snapshot

Need custom setup instead of DIY? Use office hours or paid setup instead of wasting time guessing.

Trust

Data security & privacy

Encrypted traffic
All sync traffic and credentials are protected with bank-grade encryption.
Tenant isolation
Each clinic’s syncs are isolated. No cross-tenant access.
Help

Troubleshooting & support

Credential issues
If you see errors around cookies or 2FA, re-sync your credentials and make sure two-factor is disabled where required.
Need direct help?
Book a 1:1 session or email hello@clinicsyncpro.com.
FAQ

Common questions

How often does it sync?
Every 5–45 minutes depending on volume and system load. Most clinics see updates much faster.
Can I use more than one platform?
Yes. Add separate connections for each location or platform.
Can you migrate me from another system?
Yes. Use the help section in your dashboard to book onboarding.
Where can I see all the fields?
Use the live mapping sheet linked at the top of this page.
Jane AI logo

Jane AI Receptionist API

This API is not included with the standard Jane sync.

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.

POST
https://jane-aiserver.clinicsyncpro.xyz/ai_brain/fetchAllStaff

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.

POST
https://jane-aiserver.clinicsyncpro.xyz/ai_brain/fetchAllTreatments

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.

POST
https://jane-aiserver.clinicsyncpro.xyz/ai_brain/fetchAllLocations

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.

POST
https://jane-aiserver.clinicsyncpro.xyz/ai_brain/fetchAvailabilityForRange

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.

POST
https://jane-aiserver.clinicsyncpro.xyz/ai_brain/fetchAvailabilityNext7Days

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.

POST
https://jane-aiserver.clinicsyncpro.xyz/ai_brain/lookup-create-patient

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.

POST
https://jane-aiserver.clinicsyncpro.xyz/ai_brain/fetchPatientsAppointments

Useful for appointment lookup, confirmation flows, and pre-cancel/pre-reschedule checks.

Create Appointment Slot

Creates a provisional Jane appointment object before final confirmation.

POST
https://jane-aiserver.clinicsyncpro.xyz/ai_brain/createAppt

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.

POST
https://jane-aiserver.clinicsyncpro.xyz/ai_brain/bookAppt

Use after createAppt. The payload expects the provisional appointment context, not just an appointment ID.

Cancel Appointment

Cancels an existing Jane appointment.

POST
https://jane-aiserver.clinicsyncpro.xyz/ai_brain/cancelAppt

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.

POST
https://jane-aiserver.clinicsyncpro.xyz/ai_brain/rescheduleAppt

Use when your app already has the Jane appointment ID and the new slot details.

Voice AI endpoints

These are the voice-specific Jane AI Receptionist routes used by phone agents and voice workflows. They still require an active Jane AI Receptionist subscription.

Voice Clinic Info

Returns AI-enabled staff, treatments, and locations from cached Jane AI config, with a live Jane fallback if cache is empty.

GET
https://jane-aiserver.clinicsyncpro.xyz/voice/clinic-info

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.

GET
https://jane-aiserver.clinicsyncpro.xyz/voice/bestSlot

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.

GET
https://jane-aiserver.clinicsyncpro.xyz/voice/book

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.

GET
https://jane-aiserver.clinicsyncpro.xyz/voice/cancel

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.

GET
https://jane-aiserver.clinicsyncpro.xyz/voice/reschedule

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.

GET
https://jane-aiserver.clinicsyncpro.xyz/voice/patientAppointments

Typical query params include phone, or first_name and last_name together.

Recommended implementation order

  1. Read staff, treatments, and locations.
  2. Check availability or use best slot logic.
  3. Lookup or create the patient.
  4. Create and confirm the booking, or use the voice booking route.
  5. Use patientAppointments, cancel, or reschedule for post-booking flows.
Important: Enable AI Booking Access First
  • 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.
Need help? Email hello@clinicsyncpro.com to get AI Booking enabled for your account.
Jane logo

Jane API Endpoints – Book, Update, and Cancel Appointments

⚠️ Important for GoHighLevel (GHL) Users

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 https://jane-api.clinikoconnect.com/api-book-appointment
Required headers: x-api-key and Content-Type: application/json
Request Example:
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
}
Note: The location field is not required; it is set by your API key automatically.
Success Response:
{
  "message": "Appointment booked successfully",
  "bookedAppointment": { /* Jane appointment object */ }
}
Common Errors:
  • 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 https://jane-api.clinikoconnect.com/api-update-appointment
Required headers: x-api-key and Content-Type: application/json
Request Example:
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 Response:
{
  "success": true,
  "appointment": { /* Updated Jane appointment object */ }
}
Common Errors:
  • 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 https://jane-api.clinikoconnect.com/api-cancel-appointment
Required headers: x-api-key and Content-Type: application/json
Request Example:
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
}
Tip: calendar.appointmentId is also accepted.
Success Response:
{
  "success": true,
  "appointment": { /* Jane appointment cancellation response */ }
}
Common Errors:
  • 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"
    }
  ]
}}
Note: All fields and mapping are kept up to date in the Sync Field Map. You can use any field in your Zapier, Make, or custom automation logic.
Note: All appointment endpoints are fully isolated by API key/location.
Need additional fields or help? Contact us.
Important: Enable AI Booking Access First
  • 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.
Need help? Email hello@clinicsyncpro.com to get AI Booking enabled for your account.
Cliniko logo

Cliniko API Endpoints – Book, Update, and Cancel Appointments

⚠️ Important for GoHighLevel (GHL) Users

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 https://cliniko-api.clinikoconnect.com/api-book-appointment
Required headers: x-api-key and Content-Type: application/json
Request Example:
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"
}
Note: The location field is not required; it is auto-injected based on your API key.
Success Response:
{
  "success": true,
  "appointment": { /* Cliniko appointment object */ }
}
Common Errors:
  • 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 https://cliniko-api.clinikoconnect.com/api-update-appointment
Required headers: x-api-key and Content-Type: application/json
Request Example:
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 Response:
{
  "success": true,
  "appointment": { /* Updated Cliniko appointment object */ }
}
Common Errors:
  • 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 https://cliniko-api.clinikoconnect.com/api-cancel-appointment
Required headers: x-api-key and Content-Type: application/json
Request Example:
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 Response:
{
  "success": true,
  "appointment": { /* Cliniko appointment cancellation response */ }
}
Common Errors:
  • 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": "..."
}
Note: All fields and mapping are kept up to date in the Sync Field Map. You can use any field in your Zapier, Make, or custom automation logic.
Note: All appointment endpoints are fully isolated by API key/location. Need more fields or support? Contact us.
PtEverywhere logo

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)
  }
}
Note: Appointment Booking APIs are coming soon for PtEverywhere. For the most up-to-date field mappings, see the Sync Field Map.
Note: All endpoints are fully isolated by API key/location. Need more fields or support? Contact us.
Important: Enable AI Booking Access First
  • 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.
Need help? Email hello@clinicsyncpro.com to get AI Booking enabled for your account.
Nookal logo

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 https://nookal-api.clinikoconnect.com/api/nookal/book_appt
Required headers: x-api-key and Content-Type: application/json
Request Example:
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"
}
Note: locationName, region, and basicKey are auto-injected if you use the API key from the dashboard.
Success Response:
{
  "success": true,
  "apptID": 123456,
  "appointment": { /* Nookal appointment object */ }
}
Common Errors:
  • 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 https://nookal-api.clinikoconnect.com/api/nookal/update_appt
Required headers: x-api-key and Content-Type: application/json
Request Example:
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 Response:
{
  "success": true,
  "updated": { /* Updated Nookal appointment object */ }
}
Common Errors:
  • 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 https://nookal-api.clinikoconnect.com/api/nookal/cancel_appt
Required headers: x-api-key and Content-Type: application/json
Request Example:
POST /api/nookal/cancel_appt
Host: nookal-api.clinikoconnect.com
x-api-key: YOUR_API_KEY_HERE
Content-Type: application/json

{
  "appointmentId": "123456"
}
Success Response:
{
  "success": true,
  "canceled": { /* Nookal appointment cancellation object */ }
}
Common Errors:
  • 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
}
Note: The full list of available fields is always up to date in the Sync Field Map.
Tip: All endpoints are fully isolated by API key/location. For help, contact hello@clinicsyncpro.com.
SimplePractice logo

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
}
Note: The full list of available fields is always kept up to date in the Sync Field Map.
Tip: All SimplePractice webhooks are isolated by API key and location. For help, contact hello@clinicsyncpro.com.
Note: If you are using GHL webhooks you don't need to provide the Headers and the body
Practice Better logo

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"
}
Note: The full list of available fields is always kept up to date in the Sync Field Map.
Tip: All Practice Better webhooks are isolated by API key and location. For help, contact hello@clinicsyncpro.com.
Note: If you are using GoHighLevel calendar webhooks, you do not need to provide headers or request bodies. ClinicSync Pro automatically extracts the required data. Except for "serviceName": "Initial Consultation","consultantEmail": "practitioner@clinic.com" which you need to add them as CustomData, please check the snapshot provided.
Weekly live help

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
More tutorials and snapshot downloads are coming. Need something not covered here? Contact us.
Docs navigation