draft, and a clinician later signs or finalises it. The text
of a note is its content.
With these endpoints you can:
- list a patient’s notes (a short summary of each, never the text) and read one note in full;
- discover which templates a clinic uses and which clinicians may hold a note;
- create a draft note for a named clinician, and correct that draft until a person touches it.
Who can use it
These are patient-data permissions, so a live key needs more than the permission itself: the clinic’s API add-on, the
accepted data agreement (or, for an organization, patient-data approval for the Clinical notes kind and a connection the
clinic has approved). The notes permissions are available to clinics on an Enterprise subscription. Read
Patient information access for the full checklist and Permissions for the scope
list. If a requirement is missing you get a
403 whose code tells you which one, see Errors.
Try it in the sandbox first. A test key reaches only your workspace’s sandbox, which holds invented patients and
notes, so you can try every request on this page without an agreement and without touching a real chart. See
Authentication.
Every example uses a test key and a placeholder clinic. Replace
YOUR_CLINIC_ID and the ids with your own.
What a note looks like
A note summary (a list item) carries these fields. A single note addscustom_template_id, content and citations.
List a patient’s notes
Returns a short summary of each of one patient’s notes. It never returns the text. Read one note to get its text.GET /v1/clinics/{clinic_id}/notes
404 not_found, the same as a patient that does not exist. A note the
clinic has marked sensitive is never listed.
Read one note
Returns one note, including its text.GET /v1/clinics/{clinic_id}/notes/{note_id}
content is returned as the clinic stored it, minus anything internal. Its keys depend on the template the note was
written from, so read the template (below) rather than guessing. A note in another clinic, a restricted patient’s note and
a sensitive note all answer 404 not_found; you cannot tell them apart from a note that does not exist.
Create a draft note
Creates a note for one patient, for a named clinician, withstatus: "draft". The note appears in the clinic’s notes,
marked as coming from your app, and the clinician reviews and completes it.
POST /v1/clinics/{clinic_id}/notes
A field not on this list is refused with
invalid_request. In particular there is no field for a status, a signature or a
lock.
What goes in content:
- For a template note (
note_typeorcustom_template_id),contentis keyed by the template’s field ids. Read the template’s fields first. A key the template does not have is refused withunknown_field. - For a blank note,
contentis free-form, for example{ "text": "Patient reports a mild cough." }. A blank note cannot carry treatment, service or diagnosis blocks. Keys nameddiagnosisData,treatment_plans,follow_up_plans,servicesordiagnoses, and any key beginning with an underscore, are refused withunknown_field. This keeps a draft free of anything that would order, prescribe or bill. Matching Encounters.
content: null. Read the note to see its content.
Idempotency-Key is optional on this route but strongly recommended: a retry with the same key and the same body returns
the original result instead of a second draft. See Retries and duplicates.
Update a draft note
Replaces the content of a draft that your own key created, as long as no clinician has touched it since.PATCH /v1/clinics/{clinic_id}/notes/{note_id}
Once a clinician has edited a draft it is theirs. Read the note again to see what the clinic recorded rather than trying to
overwrite it. There is no
Idempotency-Key on this route, because replacing a draft’s content with the same content is
already safe to repeat.
List note templates
Lists every standard template plus the clinic’s own active templates. Use it to find what to send asnote_type or
custom_template_id.
GET /v1/clinics/{clinic_id}/note-templates
Read one template’s fields
Returns the fields of one template: the exact keys to use incontent, in order, with their type and options.
GET /v1/clinics/{clinic_id}/note-templates/{template_key}
A template that does not exist, or belongs to another clinic, answers
404 not_found.
List clinicians who may hold a note
Lists the clinic’s staff whose role may hold a note. Use it to find a validclinician_id.
GET /v1/clinics/{clinic_id}/note-clinicians
Things to know
Refusals you may see
See Errors for the shape of every error and the permission-related codes.
What is never returned. A note the clinic marked sensitive is never listed and answers
404 when read. A restricted
patient’s notes are never reachable. Notes you did not create are readable with notes:read, but you can only change a
draft your own key created.
Pagination. Only the notes list is paginated, with limit and starting_after. See Pagination.
FHIR. Send Accept: application/fhir+json on the notes list or a single note to receive a Bundle of
DocumentReference or a bare DocumentReference. You can also create a draft by POSTing a FHIR DocumentReference
with Content-Type: application/fhir+json: the subject is the patient, the author is the clinician, and a
docStatus other than preliminary is refused. The text lands in a single Note field of the content. Updating a note
and the template and clinician routes are JSON only. See FHIR R4.
One id for the note and its visit. The note’s id is the same as its visit’s id in Encounters.
Encounters never return clinical text; this page does.
Common tasks
Draft a note for a clinician to finishGET …/note-cliniciansand choose aclinician_id.GET …/note-templates, thenGET …/note-templates/{key}to learn the field ids (skip both for a blank note).POST …/noteswithpatient_id,clinician_id,contentand anIdempotency-Key.- The clinician finds the draft marked as coming from your app, reviews it and completes it.
PATCH …/notes/{note_id} with the whole corrected content. If it answers
409 note_not_editable, a clinician has already taken the draft over: read it and leave it alone.
Show a patient’s notes in your app. GET …/notes?patient_id=… for the summaries, following next_cursor, then
GET …/notes/{note_id} for the one the user opens.