Update Clinic
Updates a live clinic and returns the updated record.
Endpoint
PATCH /v2/clinics/{clinic_id}
Path Parameters
| Parameter |
Type |
Required |
Description |
clinic_id |
string |
Yes |
The clinic this record belongs to. |
Request Body
| Parameter |
Type |
Required |
Description |
name |
string |
No |
|
timezone |
string |
No |
IANA timezone name. |
email |
string |
No |
|
phone |
string |
No |
|
fax |
string |
No |
|
address |
object |
No |
See Address. |
logo_url |
string |
No |
|
about |
string |
No |
|
specialities |
array of string |
No |
|
hours |
array of object |
No |
Working hours, as one entry per distinct daily pattern. See Hours. |
online_booking_enabled |
boolean |
No |
Whether this record is bookable through online booking. |
max_visits_per_slot |
integer |
No |
|
Address
| Parameter |
Type |
Required |
Description |
line1 |
string or null |
No |
|
line2 |
string or null |
No |
|
city |
string or null |
No |
|
state |
string or null |
No |
|
postal_code |
string or null |
No |
|
country |
string or null |
No |
|
Hours
| Parameter |
Type |
Required |
Description |
days_of_week |
array of string |
Yes |
Any of MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY. |
start_time |
string |
Yes |
Clock time, 24-hour HH:MM. |
end_time |
string |
Yes |
Clock time, 24-hour HH:MM. |
Request
curl --location '{base_url}/v2/clinics/5831' \
--request PATCH \
--header 'Authorization: Bearer JWT_TOKEN' \
--header 'Content-Type: application/merge-patch+json' \
--data '{
"name": "Example Therapy \u2014 Riverside",
"timezone": "America/Los_Angeles",
"email": "frontdesk@example.com",
"phone": "+1-555-0143",
"fax": null,
"address": {
"line1": "482 Willow Creek Rd",
"line2": null,
"city": "Fairview",
"state": "OR",
"postal_code": "97024",
"country": "US"
},
"logo_url": "https://assets.example.com/logo.png",
"about": null,
"specialities": [
"PT",
"OT"
],
"hours": [
{
"days_of_week": [
"MONDAY",
"TUESDAY"
],
"start_time": "08:00",
"end_time": "17:00"
}
],
"online_booking_enabled": true,
"max_visits_per_slot": 3
}'
Response
Success Response
Code: 200 OK
{
"id": "5831",
"onboarding_clinic_id": "b41f7c92-5e08-4a13-8d6f-2c9147ab3e5d",
"organisation_id": "7412",
"name": "Example Therapy \u2014 Riverside",
"email": "frontdesk@example.com",
"phone": "+1-555-0143",
"fax": null,
"address": {
"line1": "482 Willow Creek Rd",
"line2": null,
"city": "Fairview",
"state": "OR",
"postal_code": "97024",
"country": "US"
},
"timezone": "America/Los_Angeles",
"npi": "1740398215",
"logo_url": "https://assets.example.com/logo.png",
"about": null,
"specialities": [
"PT",
"OT"
],
"hours": [
{
"days_of_week": [
"MONDAY",
"TUESDAY"
],
"start_time": "08:00",
"end_time": "17:00"
}
],
"online_booking_enabled": true,
"max_visits_per_slot": 3,
"status": "ACTIVE",
"created_at": "2026-08-27T14:30:00Z",
"updated_at": "2026-08-27T14:30:00Z"
}
Response Fields
| Field |
Type |
Description |
id |
string or null |
The clinic id. null while status is ONBOARDING — no operational record exists yet, which is what stops an unpublished clinic being referenced in a booking. |
onboarding_clinic_id |
string or null |
The clinic's onboarding-record UUID. Always present for clinics created through onboarding, and the only way to address one before it's published. |
organisation_id |
string or null |
The organisation this record belongs to. Derived from the access token on writes and never trusted from the body. |
name |
string |
|
email |
string or null |
|
phone |
string or null |
|
fax |
string or null |
|
address |
object or null |
See Address. |
timezone |
string or null |
IANA timezone name. |
npi |
string or null |
The clinic's NPI, resolved from the organization's default billing profile. Read-only; changes when the default billing profile or its NPI changes. |
logo_url |
string or null |
|
about |
string or null |
|
specialities |
array of string |
|
hours |
array of object |
Working hours, as one entry per distinct daily pattern. See Hours. |
online_booking_enabled |
boolean |
Whether this record is bookable through online booking. |
max_visits_per_slot |
integer or null |
|
status |
string |
ONBOARDING until the record is published, then ACTIVE; INACTIVE once deleted. One of ONBOARDING, ACTIVE, INACTIVE. |
created_at |
string (date-time) or null |
|
updated_at |
string (date-time) or null |
|
Address
| Field |
Type |
Description |
line1 |
string or null |
|
line2 |
string or null |
|
city |
string or null |
|
state |
string or null |
|
postal_code |
string or null |
|
country |
string or null |
|
Hours
| Field |
Type |
Description |
days_of_week |
array of string |
Any of MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY. |
start_time |
string |
Clock time, 24-hour HH:MM. |
end_time |
string |
Clock time, 24-hour HH:MM. |
Error Response
Code: 400 Bad Request
{
"code": "bad_request",
"message": "Validation failed",
"errors": [
{
"field": "patient_id",
"message": "must be a string"
}
]
}
Every error has the same shape — a machine-readable code, a message, and an errors[] array that's empty when there's nothing field-specific to report. The HTTP status is authoritative.
| Status |
code |
Meaning |
400 Bad Request |
bad_request |
The request body or parameters failed validation. errors[] names the offending fields. |
401 Unauthorized |
unauthorized |
The access token is missing, malformed or expired. |
403 Forbidden |
forbidden |
The request references a resource outside the token's organisation or clinic scope. |
404 Not Found |
not_found |
No such resource, or it's outside your scope. |
429 Too Many Requests |
rate_limited |
Rate limit exceeded. Back off and retry. |
500 Internal Server Error |
internal_error |
Unexpected server error. |
502 Bad Gateway |
upstream_error |
Upstream service failed or timed out. |
Notes
PATCH is a JSON Merge Patch (RFC 7386): an omitted field is left alone, an explicit null clears it, and an array replaces the existing one wholesale.
- There's no embedded
doctors[] — use List Providers with ?clinic_id=.