curl --request GET \
--url https://{clinic}.{region}.practicehub.io/v3/api/care_plans \
--header 'Authorization: Bearer <token>'import requests
url = "https://{clinic}.{region}.practicehub.io/v3/api/care_plans"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://{clinic}.{region}.practicehub.io/v3/api/care_plans', 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/care_plans",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://{clinic}.{region}.practicehub.io/v3/api/care_plans"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://{clinic}.{region}.practicehub.io/v3/api/care_plans")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://{clinic}.{region}.practicehub.io/v3/api/care_plans")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": 210,
"patient_id": 340,
"name": "12-week corrective care",
"status": "active",
"template_id": 6,
"notes": "Review at visit 12",
"reschedule_limit": 2,
"maximum_amendment_notice": 24,
"reactivated_at": null,
"updated_at": "2026-09-01T14:31:00Z",
"created_at": "2026-08-18T09:12:44Z",
"billing": {
"billing_type": "membership",
"status": "active",
"start_date": "2026-09-01",
"interval_unit": "month",
"interval_length": 1,
"number_of_intervals": 12,
"is_ongoing": true,
"total_price": "1200.00",
"invoicing_type": "per_visit",
"periods": [
{
"id": 3101,
"period_number": 1,
"start_date": "2026-09-01",
"end_date": "2026-09-30",
"status": "paid",
"collection_method": "card",
"amount_due": "100.00",
"amount_paid": "100.00",
"visits_expected": 4,
"visits_used": 3,
"rollover_visits": 0
},
{
"id": 3102,
"period_number": 2,
"start_date": "2026-10-01",
"end_date": "2026-10-31",
"status": "upcoming",
"collection_method": null,
"amount_due": "100.00",
"amount_paid": "0.00",
"visits_expected": 4,
"visits_used": 0,
"rollover_visits": 1
}
]
},
"schedules": [
{
"id": 77,
"patient_id": 340,
"name": "Corrective care",
"start_date": "2026-09-01",
"status": "active",
"schedule_mode": "scheduled",
"appointment_type_ids": [
1,
4
],
"auto_sync": true,
"sync_status": "synced",
"phases": [
{
"id": 501,
"order": 1,
"phase_type": "fixed",
"duration": 4,
"visit_interval": "weekly",
"modalities": [
{
"id": 901,
"modality_id": 7,
"visits_per_interval": 2
}
]
},
{
"id": 502,
"order": 2,
"phase_type": "fixed",
"duration": 8,
"visit_interval": "bi-weekly",
"modalities": [
{
"id": 902,
"modality_id": 7,
"visits_per_interval": 1
}
]
}
],
"tracking": {
"tracking_mode": "schedule",
"is_ad_hoc": false,
"total_planned": 16,
"total_completed": 5,
"has_recurring": false,
"is_on_track": true,
"last_visit": "2026-09-15",
"next_booked": "2026-09-22",
"modalities": [
{
"modality_id": 7,
"name": "Chiropractic",
"total_planned": 16,
"total_completed": 5,
"has_recurring": false,
"is_on_track": true,
"phases": [
{
"phase_id": 501,
"order": 1,
"interval": "weekly",
"duration": 4,
"planned": 8,
"completed": 5,
"is_complete": false,
"status": "active",
"phase_type": "fixed",
"visits_per_interval": 2,
"start_date": "2026-09-01",
"end_date": "2026-09-28",
"periods": [
{
"index": 0,
"start_date": "2026-09-01",
"end_date": "2026-09-07",
"expected": 2,
"completed": 2,
"scheduled": 0,
"unscheduled": 0,
"status": "complete",
"is_extension": false
},
{
"index": 1,
"start_date": "2026-09-08",
"end_date": "2026-09-14",
"expected": 2,
"completed": 2,
"scheduled": 0,
"unscheduled": 0,
"status": "complete",
"is_extension": false
},
{
"index": 2,
"start_date": "2026-09-15",
"end_date": "2026-09-21",
"expected": 2,
"completed": 1,
"scheduled": 1,
"unscheduled": 0,
"status": "current",
"is_extension": false
},
{
"index": 3,
"start_date": "2026-09-22",
"end_date": "2026-09-28",
"expected": 2,
"completed": 0,
"scheduled": 1,
"unscheduled": 1,
"status": "upcoming",
"is_extension": false
}
]
}
]
}
]
}
}
],
"members": [
{
"id": 410,
"patient_id": 340,
"status": "active",
"schedule_override": false
},
{
"id": 411,
"patient_id": 352,
"status": "active",
"schedule_override": true
}
],
"services": [
{
"id": 61,
"modality_id": 7,
"appointment_type_id": 1,
"billable_item_id": 55,
"quantity": 16,
"unit_price": "45.00"
}
],
"products": [
{
"id": 12,
"billable_item_id": 56,
"quantity_total": 2,
"unit_price": "20.00"
}
],
"tracking": null
}
],
"links": {
"first": "<string>",
"prev": "<string>",
"next": "<string>"
},
"meta": {
"current_page": 123,
"per_page": 123,
"total": 123,
"last_page": 123
}
}{
"message": "<string>",
"code": "<string>",
"errors": {}
}{
"message": "<string>",
"code": "<string>",
"errors": {}
}List care_plans
curl --request GET \
--url https://{clinic}.{region}.practicehub.io/v3/api/care_plans \
--header 'Authorization: Bearer <token>'import requests
url = "https://{clinic}.{region}.practicehub.io/v3/api/care_plans"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://{clinic}.{region}.practicehub.io/v3/api/care_plans', 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/care_plans",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://{clinic}.{region}.practicehub.io/v3/api/care_plans"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://{clinic}.{region}.practicehub.io/v3/api/care_plans")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://{clinic}.{region}.practicehub.io/v3/api/care_plans")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": 210,
"patient_id": 340,
"name": "12-week corrective care",
"status": "active",
"template_id": 6,
"notes": "Review at visit 12",
"reschedule_limit": 2,
"maximum_amendment_notice": 24,
"reactivated_at": null,
"updated_at": "2026-09-01T14:31:00Z",
"created_at": "2026-08-18T09:12:44Z",
"billing": {
"billing_type": "membership",
"status": "active",
"start_date": "2026-09-01",
"interval_unit": "month",
"interval_length": 1,
"number_of_intervals": 12,
"is_ongoing": true,
"total_price": "1200.00",
"invoicing_type": "per_visit",
"periods": [
{
"id": 3101,
"period_number": 1,
"start_date": "2026-09-01",
"end_date": "2026-09-30",
"status": "paid",
"collection_method": "card",
"amount_due": "100.00",
"amount_paid": "100.00",
"visits_expected": 4,
"visits_used": 3,
"rollover_visits": 0
},
{
"id": 3102,
"period_number": 2,
"start_date": "2026-10-01",
"end_date": "2026-10-31",
"status": "upcoming",
"collection_method": null,
"amount_due": "100.00",
"amount_paid": "0.00",
"visits_expected": 4,
"visits_used": 0,
"rollover_visits": 1
}
]
},
"schedules": [
{
"id": 77,
"patient_id": 340,
"name": "Corrective care",
"start_date": "2026-09-01",
"status": "active",
"schedule_mode": "scheduled",
"appointment_type_ids": [
1,
4
],
"auto_sync": true,
"sync_status": "synced",
"phases": [
{
"id": 501,
"order": 1,
"phase_type": "fixed",
"duration": 4,
"visit_interval": "weekly",
"modalities": [
{
"id": 901,
"modality_id": 7,
"visits_per_interval": 2
}
]
},
{
"id": 502,
"order": 2,
"phase_type": "fixed",
"duration": 8,
"visit_interval": "bi-weekly",
"modalities": [
{
"id": 902,
"modality_id": 7,
"visits_per_interval": 1
}
]
}
],
"tracking": {
"tracking_mode": "schedule",
"is_ad_hoc": false,
"total_planned": 16,
"total_completed": 5,
"has_recurring": false,
"is_on_track": true,
"last_visit": "2026-09-15",
"next_booked": "2026-09-22",
"modalities": [
{
"modality_id": 7,
"name": "Chiropractic",
"total_planned": 16,
"total_completed": 5,
"has_recurring": false,
"is_on_track": true,
"phases": [
{
"phase_id": 501,
"order": 1,
"interval": "weekly",
"duration": 4,
"planned": 8,
"completed": 5,
"is_complete": false,
"status": "active",
"phase_type": "fixed",
"visits_per_interval": 2,
"start_date": "2026-09-01",
"end_date": "2026-09-28",
"periods": [
{
"index": 0,
"start_date": "2026-09-01",
"end_date": "2026-09-07",
"expected": 2,
"completed": 2,
"scheduled": 0,
"unscheduled": 0,
"status": "complete",
"is_extension": false
},
{
"index": 1,
"start_date": "2026-09-08",
"end_date": "2026-09-14",
"expected": 2,
"completed": 2,
"scheduled": 0,
"unscheduled": 0,
"status": "complete",
"is_extension": false
},
{
"index": 2,
"start_date": "2026-09-15",
"end_date": "2026-09-21",
"expected": 2,
"completed": 1,
"scheduled": 1,
"unscheduled": 0,
"status": "current",
"is_extension": false
},
{
"index": 3,
"start_date": "2026-09-22",
"end_date": "2026-09-28",
"expected": 2,
"completed": 0,
"scheduled": 1,
"unscheduled": 1,
"status": "upcoming",
"is_extension": false
}
]
}
]
}
]
}
}
],
"members": [
{
"id": 410,
"patient_id": 340,
"status": "active",
"schedule_override": false
},
{
"id": 411,
"patient_id": 352,
"status": "active",
"schedule_override": true
}
],
"services": [
{
"id": 61,
"modality_id": 7,
"appointment_type_id": 1,
"billable_item_id": 55,
"quantity": 16,
"unit_price": "45.00"
}
],
"products": [
{
"id": 12,
"billable_item_id": 56,
"quantity_total": 2,
"unit_price": "20.00"
}
],
"tracking": null
}
],
"links": {
"first": "<string>",
"prev": "<string>",
"next": "<string>"
},
"meta": {
"current_page": 123,
"per_page": 123,
"total": 123,
"last_page": 123
}
}{
"message": "<string>",
"code": "<string>",
"errors": {}
}{
"message": "<string>",
"code": "<string>",
"errors": {}
}Authorizations
API key from Developers → API Keys, sent as Authorization: Bearer .
Query Parameters
Offset pagination is bounded at page 10000 (higher values are clamped — meta.current_page reports the page served); use cursor pagination for deeper walks.
1 <= x <= 100001 <= x <= 100Cursor pagination: send empty to start, then the token from links.next. Constant cost per page and stable under concurrent writes; response meta is {per_page, has_more} and links.first/prev are null. Bound to the filters, sort and page_size it was issued for (422 otherwise). Omit to use page/page_size.
attr[,attr]:asc|desc — sortable: id, name, status, updated_at, created_at
Filter: operator:value
Filter: operator:value
Filter: operator:value
Filter: operator:value
Filter: operator:value
Filter: operator:value
Filter: operator:value
Filter: operator:value
Filter: operator:value
Filter: operator:value
Filter: operator:value
Filter by integrator metadata: metadata[key]=operator:value
Show child attributes
Show child attributes
Was this page helpful?