curl --request PATCH \
--url https://sandbox.rx.tera.health/v1/enrollments/{enrollment_id}/symptoms/{external_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/merge-patch+json' \
--data '
{
"severity": 3,
"note": "Worse after dinner than I first logged"
}
'const options = {
method: 'PATCH',
headers: {
Authorization: 'Bearer <token>',
'Content-Type': 'application/merge-patch+json'
},
body: JSON.stringify({severity: 3, note: 'Worse after dinner than I first logged'})
};
fetch('https://sandbox.rx.tera.health/v1/enrollments/{enrollment_id}/symptoms/{external_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://sandbox.rx.tera.health/v1/enrollments/{enrollment_id}/symptoms/{external_id}"
payload = {
"severity": 3,
"note": "Worse after dinner than I first logged"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/merge-patch+json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text){
"id": "0190f5c9-7f80-7192-8cb4-3d4e5f607182",
"external_id": "sym-20931",
"log_date": "2026-10-26",
"created_at": "2026-10-26T19:46:10Z",
"updated_at": "2026-10-26T20:30:00Z"
}Correct a symptom log
Corrects a symptom your server sent, found by your external_id. A log the patient made in the app can’t be
changed here (403 log_not_owned). Returns the receipt with the new updated_at; the values stay with the care
team.
Editing or deleting a symptom never closes a clinical flag or lowers the risk level; only the prescriber’s resolve
does. A correction that makes a symptom more severe runs the alert rules again, like a new log, so it can raise a
flag. A flag raised by a symptom deleted later shows deleted_at on its triggering record.
Error codes: log_not_owned (403).
Scope: logs:write.
curl --request PATCH \
--url https://sandbox.rx.tera.health/v1/enrollments/{enrollment_id}/symptoms/{external_id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/merge-patch+json' \
--data '
{
"severity": 3,
"note": "Worse after dinner than I first logged"
}
'const options = {
method: 'PATCH',
headers: {
Authorization: 'Bearer <token>',
'Content-Type': 'application/merge-patch+json'
},
body: JSON.stringify({severity: 3, note: 'Worse after dinner than I first logged'})
};
fetch('https://sandbox.rx.tera.health/v1/enrollments/{enrollment_id}/symptoms/{external_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://sandbox.rx.tera.health/v1/enrollments/{enrollment_id}/symptoms/{external_id}"
payload = {
"severity": 3,
"note": "Worse after dinner than I first logged"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/merge-patch+json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text){
"id": "0190f5c9-7f80-7192-8cb4-3d4e5f607182",
"external_id": "sym-20931",
"log_date": "2026-10-26",
"created_at": "2026-10-26T19:46:10Z",
"updated_at": "2026-10-26T20:30:00Z"
}Authorizations
A brand's server, one OAuth client per brand and environment. Get a token with the
client_credentials grant and send it as Authorization: Bearer <token>. Tokens last 1 hour.
A brand server reads status and ids only; it never reads clinical content. A platform partner holds one
client for all its brands and gets one token per brand, naming it with tenant_id.
Path Parameters
Your external_id for the log, URL-encoded.
Your own identifier, printable ASCII without spaces.
1 - 128^[\x21-\x7E]+$"brand-pt-48213"
Body
The symptom fields to change. Send only what changes.
ISO 8601 in UTC.
"2026-10-26T14:05:00Z"
A symptom code, for example nausea, vomiting, diarrhea, constipation, reflux, fatigue, abdominal_pain.
These codes are red flags at any severity: chest_pain, difficulty_breathing, fainting,
severe_abdominal_pain, persistent_vomiting, blood_in_vomit, blood_in_stool, yellow_skin_or_eyes,
severe_dehydration, allergic_reaction, swelling_face_or_throat, vision_changes, suicidal_thoughts,
self_harm. Any symptom at severity 5 is one too. A brand's own alert rules can add codes.
^[a-z][a-z0-9_]*$"nausea"
1 <= x <= 52
The patient's own words. Read by the care team and, on a clinical flag, the prescriber.
1000"Mild, after dinner"
Response
Corrected.
What a brand server gets back for a log. The values stay with the care team.
"0190f5c9-5d6e-7f70-8a92-1b2c3d4e5f60"
Your own identifier, printable ASCII without spaces.
1 - 128^[\x21-\x7E]+$"meal-77120"
A calendar date in the patient's time zone.
"2026-10-26"
ISO 8601 in UTC.
"2026-10-26T14:05:00Z"
When the log was last corrected; the same as created_at until then.
"2026-10-26T14:05:00Z"

