Skip to main content
POST
Create patients

Authorizations

Authorization
string
header
required

API key from Developers → API Keys, sent as Authorization: Bearer .

Headers

Idempotency-Key
string

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.

Maximum string length: 255

Body

application/json
first_name
string
required

Patient's first name, ≤ 255 chars. Required on create — the same minimum every patient form in PracticeHub enforces.

Maximum string length: 255
last_name
string
required

Patient's last name, ≤ 255 chars. Required on create.

Maximum string length: 255
preferred_name
string | null

The name the patient goes by, alongside the legal name. Optional, ≤ 255 chars.

Maximum string length: 255
dob
string<date> | null

Date of birth, YYYY-MM-DD.

email
string<email> | null

Email address, validated as an email, ≤ 255 chars. Optional and not unique — treat a match as a dedupe candidate, never an identifier.

Maximum string length: 255
sex
enum<string> | null

One of male, female or other on read — words on the API, never a stored code — or null when not stated. On write prefer_not_to_say is accepted too; PracticeHub keeps no separate mark for it, so it reads back as null and cannot be filtered on.

Available options:
male,
female,
other,
prefer_not_to_say
locale
enum<string> | null

Preferred language override: one of the language codes PracticeHub supports (e.g. en, de, es, fr, nl — the same list as the language select on the patient form). Copied from the account on create when not sent.

Available options:
en,
ca,
dk,
de,
es,
fr,
is,
it,
hu,
my,
nl,
no,
po,
fi,
se,
el,
he
note
string | null

Free text — the patient file's general note.

custom_reference
string | null

Your own reference string for the record, ≤ 255 chars — a plain field on the patient, distinct from metadata.

Maximum string length: 255
blocked
boolean

The patient file's Block Online Booking toggle — records that the patient shouldn't be offered online self-booking. A flag only: POST /appointments does not check it.

default_location_id
integer | null

The patient's home location. Must be one of the account's own locations (GET /locations) — 422 location_not_found otherwise.

Required range: x >= 1
referral_source_id
integer | null

Required when referral_source_type is referral_source. Id of what referred the patient — an active source from GET /referral_sources, or another live patient, per referral_source_type. Travels with the type: send both or neither.

Required range: x >= 1
referral_source_type
enum<string> | null

Required when referral_source_id is provided. referral_source (a source from GET /referral_sources, must be active) or patient (another patient on the account — never this one). Requires referral_source_id alongside.

Available options:
referral_source,
patient
communication_preferences
object
numbers
object[] | null

Phone numbers, embedded on every read and written nested here — never via /numbers. Entries carry id, number, country_code, iso2, type (mobile/home/work/other), intl_number. PATCH reconciles by id.

address
object | null

The patient's single address — line_1, line_2, city, state, postal_code, country — embedded on read (null when none) and written nested here, never via /addresses. PATCH changes only the keys you send.

metadata
object

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.

Response

The resource

data
object
Example: