curl --request PATCH \
--url https://{clinic}.{region}.practicehub.io/v3/api/appointment_types/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"description": "<string>",
"duration": 2,
"color": "<string>",
"group_max_attendees": 2,
"price": "45.00",
"modality_id": 123,
"online_price": "45.00",
"online_deposit": "45.00",
"sms_reminder": true,
"email_reminder": true,
"push_reminder": true,
"sms_confirmation": true,
"email_confirmation": true,
"push_confirmation": true,
"online_booking": true,
"patient_app_active": true,
"hide_from_patient": true,
"active": true,
"metadata": {}
}
'import requests
url = "https://{clinic}.{region}.practicehub.io/v3/api/appointment_types/{id}"
payload = {
"name": "<string>",
"description": "<string>",
"duration": 2,
"color": "<string>",
"group_max_attendees": 2,
"price": "45.00",
"modality_id": 123,
"online_price": "45.00",
"online_deposit": "45.00",
"sms_reminder": True,
"email_reminder": True,
"push_reminder": True,
"sms_confirmation": True,
"email_confirmation": True,
"push_confirmation": True,
"online_booking": True,
"patient_app_active": True,
"hide_from_patient": True,
"active": True,
"metadata": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
description: '<string>',
duration: 2,
color: '<string>',
group_max_attendees: 2,
price: '45.00',
modality_id: 123,
online_price: '45.00',
online_deposit: '45.00',
sms_reminder: true,
email_reminder: true,
push_reminder: true,
sms_confirmation: true,
email_confirmation: true,
push_confirmation: true,
online_booking: true,
patient_app_active: true,
hide_from_patient: true,
active: true,
metadata: {}
})
};
fetch('https://{clinic}.{region}.practicehub.io/v3/api/appointment_types/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{clinic}.{region}.practicehub.io/v3/api/appointment_types/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'description' => '<string>',
'duration' => 2,
'color' => '<string>',
'group_max_attendees' => 2,
'price' => '45.00',
'modality_id' => 123,
'online_price' => '45.00',
'online_deposit' => '45.00',
'sms_reminder' => true,
'email_reminder' => true,
'push_reminder' => true,
'sms_confirmation' => true,
'email_confirmation' => true,
'push_confirmation' => true,
'online_booking' => true,
'patient_app_active' => true,
'hide_from_patient' => true,
'active' => true,
'metadata' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://{clinic}.{region}.practicehub.io/v3/api/appointment_types/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"duration\": 2,\n \"color\": \"<string>\",\n \"group_max_attendees\": 2,\n \"price\": \"45.00\",\n \"modality_id\": 123,\n \"online_price\": \"45.00\",\n \"online_deposit\": \"45.00\",\n \"sms_reminder\": true,\n \"email_reminder\": true,\n \"push_reminder\": true,\n \"sms_confirmation\": true,\n \"email_confirmation\": true,\n \"push_confirmation\": true,\n \"online_booking\": true,\n \"patient_app_active\": true,\n \"hide_from_patient\": true,\n \"active\": true,\n \"metadata\": {}\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://{clinic}.{region}.practicehub.io/v3/api/appointment_types/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"duration\": 2,\n \"color\": \"<string>\",\n \"group_max_attendees\": 2,\n \"price\": \"45.00\",\n \"modality_id\": 123,\n \"online_price\": \"45.00\",\n \"online_deposit\": \"45.00\",\n \"sms_reminder\": true,\n \"email_reminder\": true,\n \"push_reminder\": true,\n \"sms_confirmation\": true,\n \"email_confirmation\": true,\n \"push_confirmation\": true,\n \"online_booking\": true,\n \"patient_app_active\": true,\n \"hide_from_patient\": true,\n \"active\": true,\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{clinic}.{region}.practicehub.io/v3/api/appointment_types/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"duration\": 2,\n \"color\": \"<string>\",\n \"group_max_attendees\": 2,\n \"price\": \"45.00\",\n \"modality_id\": 123,\n \"online_price\": \"45.00\",\n \"online_deposit\": \"45.00\",\n \"sms_reminder\": true,\n \"email_reminder\": true,\n \"push_reminder\": true,\n \"sms_confirmation\": true,\n \"email_confirmation\": true,\n \"push_confirmation\": true,\n \"online_booking\": true,\n \"patient_app_active\": true,\n \"hide_from_patient\": true,\n \"active\": true,\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": 12,
"name": "Group Exercise Class",
"duration": 45,
"color": "#4F86C6",
"modality_id": 3,
"type": "group",
"group_max_attendees": 8,
"active": true,
"sort_order": 3,
"updated_at": "2026-04-02T14:05:11Z",
"created_at": "2025-11-20T09:12:47Z",
"online_booking": true,
"columns": 1
}
}{
"message": "<string>",
"code": "<string>",
"errors": {}
}{
"message": "<string>",
"code": "<string>",
"errors": {}
}{
"message": "<string>",
"code": "<string>",
"errors": {}
}{
"message": "<string>",
"code": "<string>",
"errors": {}
}{
"message": "<string>",
"code": "<string>",
"errors": {}
}Update appointment_types
curl --request PATCH \
--url https://{clinic}.{region}.practicehub.io/v3/api/appointment_types/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"description": "<string>",
"duration": 2,
"color": "<string>",
"group_max_attendees": 2,
"price": "45.00",
"modality_id": 123,
"online_price": "45.00",
"online_deposit": "45.00",
"sms_reminder": true,
"email_reminder": true,
"push_reminder": true,
"sms_confirmation": true,
"email_confirmation": true,
"push_confirmation": true,
"online_booking": true,
"patient_app_active": true,
"hide_from_patient": true,
"active": true,
"metadata": {}
}
'import requests
url = "https://{clinic}.{region}.practicehub.io/v3/api/appointment_types/{id}"
payload = {
"name": "<string>",
"description": "<string>",
"duration": 2,
"color": "<string>",
"group_max_attendees": 2,
"price": "45.00",
"modality_id": 123,
"online_price": "45.00",
"online_deposit": "45.00",
"sms_reminder": True,
"email_reminder": True,
"push_reminder": True,
"sms_confirmation": True,
"email_confirmation": True,
"push_confirmation": True,
"online_booking": True,
"patient_app_active": True,
"hide_from_patient": True,
"active": True,
"metadata": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
description: '<string>',
duration: 2,
color: '<string>',
group_max_attendees: 2,
price: '45.00',
modality_id: 123,
online_price: '45.00',
online_deposit: '45.00',
sms_reminder: true,
email_reminder: true,
push_reminder: true,
sms_confirmation: true,
email_confirmation: true,
push_confirmation: true,
online_booking: true,
patient_app_active: true,
hide_from_patient: true,
active: true,
metadata: {}
})
};
fetch('https://{clinic}.{region}.practicehub.io/v3/api/appointment_types/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{clinic}.{region}.practicehub.io/v3/api/appointment_types/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'description' => '<string>',
'duration' => 2,
'color' => '<string>',
'group_max_attendees' => 2,
'price' => '45.00',
'modality_id' => 123,
'online_price' => '45.00',
'online_deposit' => '45.00',
'sms_reminder' => true,
'email_reminder' => true,
'push_reminder' => true,
'sms_confirmation' => true,
'email_confirmation' => true,
'push_confirmation' => true,
'online_booking' => true,
'patient_app_active' => true,
'hide_from_patient' => true,
'active' => true,
'metadata' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://{clinic}.{region}.practicehub.io/v3/api/appointment_types/{id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"duration\": 2,\n \"color\": \"<string>\",\n \"group_max_attendees\": 2,\n \"price\": \"45.00\",\n \"modality_id\": 123,\n \"online_price\": \"45.00\",\n \"online_deposit\": \"45.00\",\n \"sms_reminder\": true,\n \"email_reminder\": true,\n \"push_reminder\": true,\n \"sms_confirmation\": true,\n \"email_confirmation\": true,\n \"push_confirmation\": true,\n \"online_booking\": true,\n \"patient_app_active\": true,\n \"hide_from_patient\": true,\n \"active\": true,\n \"metadata\": {}\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://{clinic}.{region}.practicehub.io/v3/api/appointment_types/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"duration\": 2,\n \"color\": \"<string>\",\n \"group_max_attendees\": 2,\n \"price\": \"45.00\",\n \"modality_id\": 123,\n \"online_price\": \"45.00\",\n \"online_deposit\": \"45.00\",\n \"sms_reminder\": true,\n \"email_reminder\": true,\n \"push_reminder\": true,\n \"sms_confirmation\": true,\n \"email_confirmation\": true,\n \"push_confirmation\": true,\n \"online_booking\": true,\n \"patient_app_active\": true,\n \"hide_from_patient\": true,\n \"active\": true,\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{clinic}.{region}.practicehub.io/v3/api/appointment_types/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"duration\": 2,\n \"color\": \"<string>\",\n \"group_max_attendees\": 2,\n \"price\": \"45.00\",\n \"modality_id\": 123,\n \"online_price\": \"45.00\",\n \"online_deposit\": \"45.00\",\n \"sms_reminder\": true,\n \"email_reminder\": true,\n \"push_reminder\": true,\n \"sms_confirmation\": true,\n \"email_confirmation\": true,\n \"push_confirmation\": true,\n \"online_booking\": true,\n \"patient_app_active\": true,\n \"hide_from_patient\": true,\n \"active\": true,\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": 12,
"name": "Group Exercise Class",
"duration": 45,
"color": "#4F86C6",
"modality_id": 3,
"type": "group",
"group_max_attendees": 8,
"active": true,
"sort_order": 3,
"updated_at": "2026-04-02T14:05:11Z",
"created_at": "2025-11-20T09:12:47Z",
"online_booking": true,
"columns": 1
}
}{
"message": "<string>",
"code": "<string>",
"errors": {}
}{
"message": "<string>",
"code": "<string>",
"errors": {}
}{
"message": "<string>",
"code": "<string>",
"errors": {}
}{
"message": "<string>",
"code": "<string>",
"errors": {}
}{
"message": "<string>",
"code": "<string>",
"errors": {}
}Authorizations
API key from Developers → API Keys, sent as Authorization: Bearer .
Path Parameters
Body
The type's display name, as it appears on the calendar and in booking flows. Appointment types are managed in Settings.
255Longer description shown to patients in online booking (write-only here).
Default length in minutes. When booking, a practitioner-specific duration for the type takes precedence where one is set.
x >= 1Hex colour appointments of this type show on the calendar.
255individual (the default), group (a group session type, with capacity in group_max_attendees) or dropin.
individual, group, dropin Maximum attendees for a group session type. Not used by standard types.
x >= 1Standard price of the appointment, in the account currency (write-only).
^-?\d+(\.\d{1,2})?$"45.00"
Reporting category: np (new patient), adjustment (regular visit), rof (report of findings), progress (progress exam) or other.
np, adjustment, rof, progress, other The modality (discipline) the type belongs to — see modalities.
Who can book online: both, regular (existing patients) or np (new patients).
both, regular, np Price shown in online booking when it differs from price (write-only).
^-?\d+(\.\d{1,2})?$"45.00"
Deposit taken at online booking; must not exceed online_price (write-only).
^-?\d+(\.\d{1,2})?$"45.00"
Send SMS reminders for this type (write-only).
Send email reminders for this type (write-only).
Send patient-app push reminders (write-only).
Send SMS confirmations on booking (write-only).
Send email confirmations on booking (write-only).
Send patient-app push confirmations (write-only).
Whether the type can be booked through online booking.
Offer this type in the patient app (write-only).
Hide the type's name from patient-facing messages (write-only).
Whether the type is currently offered for booking.
Integrator-owned key/value metadata (max 50 keys). Values are strings (≤500 chars), numbers or booleans and read back with the type they were written with. On write, a null value removes the key. Filter with metadata[key]=op:value; number operands compare numerically.
Show child attributes
Show child attributes
Response
The resource
Show child attributes
Show child attributes
{
"id": 12,
"name": "Group Exercise Class",
"duration": 45,
"color": "#4F86C6",
"modality_id": 3,
"type": "group",
"group_max_attendees": 8,
"active": true,
"sort_order": 3,
"updated_at": "2026-04-02T14:05:11Z",
"created_at": "2025-11-20T09:12:47Z",
"online_booking": true,
"columns": 1
}
Was this page helpful?