curl --request POST \
--url https://{clinic}.{region}.practicehub.io/v3/api/locations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"website": "<string>",
"email": "jsmith@example.com",
"phone_number": "<string>",
"custom_reference": "<string>",
"online_booking": true,
"line_1": "<string>",
"line_2": "<string>",
"line_3": "<string>",
"city": "<string>",
"state": "<string>",
"postal_code": "<string>",
"metadata": {}
}
'import requests
url = "https://{clinic}.{region}.practicehub.io/v3/api/locations"
payload = {
"name": "<string>",
"website": "<string>",
"email": "jsmith@example.com",
"phone_number": "<string>",
"custom_reference": "<string>",
"online_booking": True,
"line_1": "<string>",
"line_2": "<string>",
"line_3": "<string>",
"city": "<string>",
"state": "<string>",
"postal_code": "<string>",
"metadata": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
website: '<string>',
email: 'jsmith@example.com',
phone_number: '<string>',
custom_reference: '<string>',
online_booking: true,
line_1: '<string>',
line_2: '<string>',
line_3: '<string>',
city: '<string>',
state: '<string>',
postal_code: '<string>',
metadata: {}
})
};
fetch('https://{clinic}.{region}.practicehub.io/v3/api/locations', 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/locations",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'website' => '<string>',
'email' => 'jsmith@example.com',
'phone_number' => '<string>',
'custom_reference' => '<string>',
'online_booking' => true,
'line_1' => '<string>',
'line_2' => '<string>',
'line_3' => '<string>',
'city' => '<string>',
'state' => '<string>',
'postal_code' => '<string>',
'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/locations"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"website\": \"<string>\",\n \"email\": \"jsmith@example.com\",\n \"phone_number\": \"<string>\",\n \"custom_reference\": \"<string>\",\n \"online_booking\": true,\n \"line_1\": \"<string>\",\n \"line_2\": \"<string>\",\n \"line_3\": \"<string>\",\n \"city\": \"<string>\",\n \"state\": \"<string>\",\n \"postal_code\": \"<string>\",\n \"metadata\": {}\n}")
req, _ := http.NewRequest("POST", 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.post("https://{clinic}.{region}.practicehub.io/v3/api/locations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"website\": \"<string>\",\n \"email\": \"jsmith@example.com\",\n \"phone_number\": \"<string>\",\n \"custom_reference\": \"<string>\",\n \"online_booking\": true,\n \"line_1\": \"<string>\",\n \"line_2\": \"<string>\",\n \"line_3\": \"<string>\",\n \"city\": \"<string>\",\n \"state\": \"<string>\",\n \"postal_code\": \"<string>\",\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{clinic}.{region}.practicehub.io/v3/api/locations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"website\": \"<string>\",\n \"email\": \"jsmith@example.com\",\n \"phone_number\": \"<string>\",\n \"custom_reference\": \"<string>\",\n \"online_booking\": true,\n \"line_1\": \"<string>\",\n \"line_2\": \"<string>\",\n \"line_3\": \"<string>\",\n \"city\": \"<string>\",\n \"state\": \"<string>\",\n \"postal_code\": \"<string>\",\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": 1,
"name": "City Centre Clinic",
"email": "hello@citycentreclinic.example",
"phone_number": "+441614960102",
"website": "https://citycentreclinic.example",
"shift_open": true,
"online_booking": true,
"feedback_url": "https://reviews.example.org/city-centre-clinic",
"feedback_rating_trigger": 4,
"feedback_visit_trigger": "3",
"updated_at": "2026-05-14T09:30:00Z",
"created_at": "2024-10-01T12:00:00Z",
"calendar_view": 2
}
}{
"message": "<string>",
"code": "<string>",
"errors": {}
}{
"message": "<string>",
"code": "<string>",
"errors": {}
}{
"message": "<string>",
"code": "<string>",
"errors": {}
}{
"message": "<string>",
"code": "<string>",
"errors": {}
}Create locations
curl --request POST \
--url https://{clinic}.{region}.practicehub.io/v3/api/locations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"website": "<string>",
"email": "jsmith@example.com",
"phone_number": "<string>",
"custom_reference": "<string>",
"online_booking": true,
"line_1": "<string>",
"line_2": "<string>",
"line_3": "<string>",
"city": "<string>",
"state": "<string>",
"postal_code": "<string>",
"metadata": {}
}
'import requests
url = "https://{clinic}.{region}.practicehub.io/v3/api/locations"
payload = {
"name": "<string>",
"website": "<string>",
"email": "jsmith@example.com",
"phone_number": "<string>",
"custom_reference": "<string>",
"online_booking": True,
"line_1": "<string>",
"line_2": "<string>",
"line_3": "<string>",
"city": "<string>",
"state": "<string>",
"postal_code": "<string>",
"metadata": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
website: '<string>',
email: 'jsmith@example.com',
phone_number: '<string>',
custom_reference: '<string>',
online_booking: true,
line_1: '<string>',
line_2: '<string>',
line_3: '<string>',
city: '<string>',
state: '<string>',
postal_code: '<string>',
metadata: {}
})
};
fetch('https://{clinic}.{region}.practicehub.io/v3/api/locations', 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/locations",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'website' => '<string>',
'email' => 'jsmith@example.com',
'phone_number' => '<string>',
'custom_reference' => '<string>',
'online_booking' => true,
'line_1' => '<string>',
'line_2' => '<string>',
'line_3' => '<string>',
'city' => '<string>',
'state' => '<string>',
'postal_code' => '<string>',
'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/locations"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"website\": \"<string>\",\n \"email\": \"jsmith@example.com\",\n \"phone_number\": \"<string>\",\n \"custom_reference\": \"<string>\",\n \"online_booking\": true,\n \"line_1\": \"<string>\",\n \"line_2\": \"<string>\",\n \"line_3\": \"<string>\",\n \"city\": \"<string>\",\n \"state\": \"<string>\",\n \"postal_code\": \"<string>\",\n \"metadata\": {}\n}")
req, _ := http.NewRequest("POST", 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.post("https://{clinic}.{region}.practicehub.io/v3/api/locations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"website\": \"<string>\",\n \"email\": \"jsmith@example.com\",\n \"phone_number\": \"<string>\",\n \"custom_reference\": \"<string>\",\n \"online_booking\": true,\n \"line_1\": \"<string>\",\n \"line_2\": \"<string>\",\n \"line_3\": \"<string>\",\n \"city\": \"<string>\",\n \"state\": \"<string>\",\n \"postal_code\": \"<string>\",\n \"metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{clinic}.{region}.practicehub.io/v3/api/locations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"website\": \"<string>\",\n \"email\": \"jsmith@example.com\",\n \"phone_number\": \"<string>\",\n \"custom_reference\": \"<string>\",\n \"online_booking\": true,\n \"line_1\": \"<string>\",\n \"line_2\": \"<string>\",\n \"line_3\": \"<string>\",\n \"city\": \"<string>\",\n \"state\": \"<string>\",\n \"postal_code\": \"<string>\",\n \"metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": 1,
"name": "City Centre Clinic",
"email": "hello@citycentreclinic.example",
"phone_number": "+441614960102",
"website": "https://citycentreclinic.example",
"shift_open": true,
"online_booking": true,
"feedback_url": "https://reviews.example.org/city-centre-clinic",
"feedback_rating_trigger": 4,
"feedback_visit_trigger": "3",
"updated_at": "2026-05-14T09:30:00Z",
"created_at": "2024-10-01T12:00:00Z",
"calendar_view": 2
}
}{
"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 .
Headers
Any unique string (≤255 chars). A retry with the same key within 24 hours replays the original response (Idempotent-Replayed: true) instead of creating a second record.
255Body
The location's name as shown across the app. Locations are managed in Settings.
255The location's website URL.
255Contact email address for the location.
255Contact phone number for the location.
255Your own reference for the location (write-only; e.g. a branch code in your other system).
255Whether the location is offered in online booking.
First line of the location's postal address (write-only — a location's address is not readable through the API yet).
255Second address line (write-only).
255Third address line (write-only).
255Town or city of the address (write-only).
255County, state or region (write-only).
255Postcode / ZIP (write-only).
255ISO 3166-1 alpha-2 country code, e.g. GB (write-only).
AF, AL, DZ, AS, AD, AO, AI, AQ, AG, AR, AM, AW, AU, AT, AZ, BS, BH, BD, BB, BY, BE, BZ, BJ, BM, BT, BO, BQ, BA, BW, BV, BR, IO, BN, BG, BF, BI, CV, KH, CM, CA, KY, CF, TD, CL, CN, CX, CC, CO, KM, CD, CG, CK, CR, HR, CU, CW, CY, CZ, CI, DK, DJ, DM, DO, EC, EG, SV, GQ, ER, EE, SZ, ET, FK, FO, FJ, FI, FR, GF, PF, TF, GA, GM, GE, DE, GH, GI, GR, GL, GD, GP, GU, GT, GG, GN, GW, GY, HT, HM, VA, HN, HK, HU, IS, IN, ID, IR, IQ, IE, IM, IL, IT, JM, JP, JE, JO, KZ, KE, KI, KP, KR, KW, KG, LA, LV, LB, LS, LR, LY, LI, LT, LU, MO, MG, MW, MY, MV, ML, MT, MH, MQ, MR, MU, YT, MX, FM, MD, MC, MN, ME, MS, MA, MZ, MM, NA, NR, NP, NL, NC, NZ, NI, NE, NG, NU, NF, MP, NO, OM, PK, PW, PS, PA, PG, PY, PE, PH, PN, PL, PT, PR, QA, MK, RO, RU, RW, RE, BL, SH, KN, LC, MF, PM, VC, WS, SM, ST, SA, SN, RS, SC, SL, SG, SX, SK, SI, SB, SO, ZA, GS, SS, ES, LK, SD, SR, SJ, SE, CH, SY, TW, TJ, TZ, TH, TL, TG, TK, TO, TT, TN, TR, TM, TC, TV, UG, UA, AE, GB, UM, US, UY, UZ, VU, VE, VN, VG, VI, WF, EH, YE, ZM, ZW, AX 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": 1,
"name": "City Centre Clinic",
"email": "hello@citycentreclinic.example",
"phone_number": "+441614960102",
"website": "https://citycentreclinic.example",
"shift_open": true,
"online_booking": true,
"feedback_url": "https://reviews.example.org/city-centre-clinic",
"feedback_rating_trigger": 4,
"feedback_visit_trigger": "3",
"updated_at": "2026-05-14T09:30:00Z",
"created_at": "2024-10-01T12:00:00Z",
"calendar_view": 2
}
Was this page helpful?